董宇辉:读书让你更加深刻|程序员必读的一本书
久负盛名的CSAPP(Computer Systems: A Programmer's Perspective)一直都是计算机界“圣经”般存在,本书主要是软件程序员角度来看待计算机系统,主要包括以下内容:
第一部分:程序结果和执行
数据如何在内存里面表示,计算机使用二进制表示整型、浮点数等;
CPU交流语言:机器语言,通过汇编语言理解计算机CPU指令执行流程;
处理器体系结构,存储层次结构, 局部性原理, 性能优化;
第二部分:在系统上运行程序
编译,链接,库等原理和深入分析;
操作系统的使用,异常,进程,信号、虚拟内存,内存动态分配等;
第三部分:程序间的交互和通信
系统级IO,文件IO等;
网络编程,socket套接字原理;
并发编程,IO复用,多线程,同步和互斥(锁)等;
学习心得:
深入理解计算机系统内容包括几乎所有IT技术的原型,融汇计算机组成原理+操作系统+编译原理+网络,不可能短时间内完全参透其中的内功心法,读不完,读不懂,没关系,完全可以暂时放一放。这不是一本一下子就能完全读懂读透的书,希望你不断地学习,不断的去读。这样或许是读这本书的最好状态。慢慢你会发现,这些知识都是潜默移化的,会让你以后解决其他问题更快速,学习其他新知识更快。
一般需要我们:
1 课后需要查资料确认自己不确定的地方,对自己感兴趣可以加深一点。
2 查完资料还是没有理解的,需要及时提出来,请教他人,查缺补漏。
3 有时间就做课后习题,最好是花时间完成课后lab。
推荐学习网站:
https://fengmuzi2003.gitbook.io/csapp3e/
https://www.icourse163.org/course/NJU-1001625001?tid=1001698002
我总结了一些计算机系统的核心知识,包括理论知识和实际工作中的问题解决。
CPU
理论知识:CPU简单架构 汇编指令 流水线(乱序) 指令加速(向量等)多核(并行设计)cache CPU扩展架构(numa,异构系统)
实际工作:
1 定位问题-反汇编查看
2 性能优化-指令精简CPI,预取,分支预测,cache miss优化
3 并行程序设计,原子操作/锁/无锁/内存屏障
内存
理论知识:物理内存管理 分页 虚拟内容管理 页表 MMU TLB 内存分配算法
实际工作:
1 内存泄漏怎么定位?
2 怎么减少内存使用,内存空间优化?
3 内存分配性能优化—tcmalloc vs ptmalloc vs jemalloc,大页内存,COW(缺页异常) 页分配, 内存池(buddy (大内存)vs slab (小内存)等。
磁盘
理论知识:磁盘类型 存储空间 虚拟内存交换文件系统 文件IO 消息队列 数据库
实际工作:
1 文件IO优化(page cache,buff,零拷贝)
2 缓存,消息队列持久化优化
3 持久化空间和成本优化
4 数据库使用和优化
DMA和外设IO
理论知识:总线 DMA IO 中断
实际工作:
1 锁总线(并发)
2 总线带宽评估
3 DMA参数设置(DMA描述符寄存器等)
4 中断优化(亲和,聚合,均衡,上下部分)
编译连接
理论知识:编译原理 字符串处理 正在表达式 链接 中间文件
实际工作:
1 编译系统问题—编译器版本,命令行参数,选项,优化,编译脚本,依赖关系
2 编译问题-头文件路径(hook,打桩mock)
3 连接问题-库路径(符号,hook,打桩mock)
4 运行问题-程序部署-动态库路径和版本号,环境依赖,打包,热补丁(动态库替换)
程序运行原理
理论知识:可执行文件格式 程序加载 任务调度 执行环境(上下文) 进程空间 堆栈
实际工作:
1 crash问题处理,空指针,堆栈溢出,内存越界,内存被踩,死锁等
2 程序性能优化(系统裁剪(二进制文件大小优化),任务调度优化—CPU亲和,CPU隔离(独占),调度算法选择,优先级调整)
3 程序调试( GDB ),升级,热补丁。
操作系统
理论知识:系统调用(API接口) 资源管理(处理器-计算(调度子系统),内存-计算(内存子系统),网卡-网络(网络子系统),磁盘-存储(IO子系统))
实际工作:
1 适配硬件(驱动,裁剪,低功耗,嵌入式)
2 性能优化(系统调参,零拷贝,bypass kernel)
3 系统观测 (系统工具,内核调试)
4 开发环境 (开发工具,命令行,脚本自动化)
应用编程(网络编程,并发多线程)
理论知识:网络分层模型 网络协议 socket接口 多线程 锁 标准库
实际工作:
1 网络编程问题(高并发,epoll,同步/异步,网络编程模型,异常处理)
2 多线程编程问题(互斥和同步,不同锁使用,线程安全,性能问题,多线程程序设计等)
3 编程性能优化( 算法和数据结构优化(链表 vs 数组,hash vs 红黑树 vs skiplist),基于编译器优化(内联,cache对齐,字节对齐,优化选项Ox),基于操作系统级别代码优化(堆栈(栈空间 vs 堆空间),调度(调度实体选择,调度算法选择,优先级调整),内存分配(tcmalloc vs ptmalloc ,大页内存, 页分配 buddy (大内存)vs slab 内存池(小内存)),IO(零拷贝,cache vs buffer ),基于硬件特性级别代码优化(CPU(超线程,预取,分支预测,cache 亲和(空间和时间局部性),NUMA),内存(内存对齐),磁盘(追加写,数据有序,顺序IO,延迟更新,批量写入)), 架构优化设计(高内聚,低耦合,模块化,设计模式)
感兴趣的,可以参加今晚的直播,让我们一起来总结和回顾计算机系统的核心知识,以及如何做课后lab实验。
上期直播分享--深入理解计算机系统:
熬过绝望低谷,你便无人能敌
欢迎加入极客星球,分享多年工作经验和技术理解,扩展视野,直播分享,面试,作为大厂专业面试官,可以帮助想进各类大厂(芯片,自动驾驶,嵌入式,互联网等)的在校大学生制定学习路线和学习帮助,由于在各种类型公司都待过(华为->外企->到互联网大厂),在工作中想要普升和高薪的同学找到最佳学习和转型指导, 可以分享各种不同公司宝贵的职场工作经验, 项目经验,普升经验,希望大家站在前辈们的肩膀上(前期时间很宝贵,希望你们早点遇到自己的贵人),少走弯路,做得更好。详细点击查看-> 极客星球。PS:中秋优惠,立减100,用下面优惠劵,还能再减50。
IT工程师的成长路线
可以加我微信,交个朋友,技术交流
- END -
看完一键三连在看,转发,点赞
是对文章最大的赞赏,极客重生感谢你
推荐阅读
定个目标|建立自己的技术知识体系
大厂后台开发基本功修炼路线和经典资料
难走的路,从不拥挤
你好,这里是极客重生,我是阿荣,大家都叫我荣哥,从华为->外企->到互联网大厂,目前是大厂资深工程师,多次获得五星员工,多年职场经验,技术扎实,专业后端开发和后台架构设计,热爱底层技术,丰富的实战经验,分享技术的本质原理,希望帮助更多人蜕变重生,拿BAT大厂offer,培养高级工程师能力,成为技术专家,实现高薪梦想,期待你的关注!点击蓝字查看我的成长之路。
校招/社招/简历/面试技巧/大厂技术栈分析/后端开发进阶/优秀开源项目/直播分享/技术视野/实战高手等, 极客星球希望成为最有技术价值星球,尽最大努力为星球的同学提供面试,跳槽,技术成长帮助!详情查看->极客星球