当前位置: 首页 > news >正文

董宇辉:读书让你更加深刻|程序员必读的一本书

82563e895836adaa196c848ab973217d.png久负盛名的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。

7f6c6a4bbda1645f73856ab3a3836852.png

96c826e4b0227253aab8ea26af9557a6.jpeg

IT工程师的成长路线

可以加我微信,交个朋友,技术交流

8be837beb5d607e209d9e2739598b3df.png

- END -


看完一键三连在看转发点赞

是对文章最大的赞赏,极客重生感谢你3229875d6753d91ae44326e99cc97b37.png

推荐阅读

8336e9c31165142f17b72d3ae6acd2e7.jpeg

定个目标|建立自己的技术知识体系


c63cba893d2f52833c84a361decf9e2f.jpeg

大厂后台开发基本功修炼路线和经典资料

ecb40c2bde73c4fb6254501fe750c540.jpeg

难走的路,从不拥挤

你好,这里是极客重生,我是阿荣,大家都叫我荣哥,从华为->外企->到互联网大厂,目前是大厂资深工程师,多次获得五星员工,多年职场经验,技术扎实,专业后端开发和后台架构设计,热爱底层技术,丰富的实战经验,分享技术的本质原理,希望帮助更多人蜕变重生,拿BAT大厂offer,培养高级工程师能力,成为技术专家,实现高薪梦想,期待你的关注!点击蓝字查看我的成长之路

校招/社招/简历/面试技巧/大厂技术栈分析/后端开发进阶/优秀开源项目/直播分享/技术视野/实战高手等, 极客星球希望成为最有技术价值星球,尽最大努力为星球的同学提供面试,跳槽,技术成长帮助!详情查看->极客星球

相关文章:

  • Spring注解驱动之InitializingBean和DisposableBean
  • 微信输入法来了,如何下载?
  • Metacat实现原理解析
  • MTK Camera Senor Bring up 复盘总结
  • map有关的运算符重载
  • Java项目硅谷课堂学习笔记-P9-整合网关与实现订单和营销管理模块
  • 我的周刊(第055期)
  • 【GraphSAGE实践】YelpChi评论图数据集上的反欺诈检测
  • 基于单目和低成本GPS的车道定位方法
  • MyBatisPlus——多表查询——多条件查询——分页查询
  • 面向跨模态匹配的噪声关联学习
  • Java中的反射
  • java毕业设计旅游网站设计mybatis+源码+调试部署+系统+数据库+lw
  • Java基础进阶-序列化
  • 02.3 线性代数
  • 网络传输文件的问题
  • 230. Kth Smallest Element in a BST
  • 30秒的PHP代码片段(1)数组 - Array
  • AngularJS指令开发(1)——参数详解
  • angular学习第一篇-----环境搭建
  • dva中组件的懒加载
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java|序列化异常StreamCorruptedException的解决方法
  • Python学习笔记 字符串拼接
  • Vue UI框架库开发介绍
  • webgl (原生)基础入门指南【一】
  • 对象管理器(defineProperty)学习笔记
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何胜任知名企业的商业数据分析师?
  • 我有几个粽子,和一个故事
  • 我这样减少了26.5M Java内存!
  • 小而合理的前端理论:rscss和rsjs
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #Z0458. 树的中心2
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (26)4.7 字符函数和字符串函数
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (备忘)Java Map 遍历
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (南京观海微电子)——COF介绍
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)Dubbo快速入门、介绍、使用
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net的socket示例
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET中两种OCR方式对比
  • /boot 内存空间不够