深入理解计算机系统-笔记

背景

学习极客时间-左耳听风专栏,程序员练级攻略一系列文章了解到,需要克服三座大山:1 编程语言,2 理论知识,3 系统知识。工作中系统知识用得较多,就重点突破这一领域。系统知识列出了必读书《深入理解计算机系统》、《Unix 高级环境编程》、《Unix 网络编程》《TCP/IP 详解卷 I 协议》。以上 4 本为经典版,知识密度高。若难以理解经典版,可阅读解析版书籍《Linuc C 编程一站式学习》《TCP/IP 网络编程》《图解 TCP/IP》《The TCP/IP Guide》.实践指导书《Wireshark 数据包分析实战》《Linux/Unix 系统编程手册》/《Linux System Programming》/《Linux 系统编程》-罗伯特.拉姆
本文记录看完第一遍《深入理解计算机系统》感受和 get 的知识点,4 天时间。

还剩下的

目录:计算机系统漫游、信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级 IO、网络编程、并发编程。
信息表示和处理:大端序和小端序,存储器中高位在左还是右。2 进制、16 进制、10 进制转换及算数运算。如何用电路实现运算和存储。
程序的机器级表示:程序的编译分为预处理、汇编、编译、链接,最终的可执行文件是链接器能够加载的字节码。C 语言转换为汇编语言过程解读。
处理器体系结构:CPU 结构。包括 PC 程序计数器,用于指定 CPU 当前执行的指令。MCU 运算单元,执行逻辑运算。8 个寄存器。
优化程序性能:使用局部性原理,减少跳转。

你能获得的对程序最大的加速比,就是当你第一次让它工作起来的时候。

所以运行起来最关键。
存储器层次结构:寄存器-高速缓存-内存-硬盘,逐渐变慢,逐渐便宜。SDD 存储器有写入擦除次数限制,SSD 存储将多个块组成一个页作为读写管理单元,擦除是以页为单位。SSD 被写坏一定比例,会加速写坏过程,所以 IOS 系统保留大量 SSD 空间,避免 SSD 加速写坏,所以苹果手机运行很久都比较流畅。Android 系统保留 SSD 空间较少,一旦剩余空间不足 80%,SSD 磨损加速,之后 SSD 可用空间减少,行成恶性循环。所以使用 SSD 要保留 20%空间空闲,增加 SSD 寿命。
链接:as 工具整合目标文件为一个可被链接器执行的链接文件。链接的目的是大型系统模块解耦,只用重新编译变化的部分,不用整个项目重新编译。静态链接,将公共库汇编后的目标文件 libc.a(字节码)拷贝到编译程序的目标文件中,整合在一起。动态链接,链接器将共享库 libc.so 地址写入可执行文件,程序运行时加载这些字节码,这些字节码在内存中,其他程序可共享。-fPIC 生成成与位置无关的字节码,会增加一层引用。
异常控制流分为 4 种,中断 interpret,陷阱 trap、故障 fault、终止 abort。中断用于硬件设备之间通信。陷阱用于实现系统调用。
虚拟存储器:进程是可执行文件运行的实例,进程上下文保存在内存中。虚拟存储器是为了简化程序到执行的过程。对所有程序都提供一个相同的地址空间。CPU 可直接访问 PA 物理内存,也可以 CPU 访问虚拟地址 VA,地址翻译器将 VA 转换为 PA。地址翻译器由 CPU 和操作系统内核共同维护。内核控制虚拟存储器资源分配,虚拟内存以页为单位管理,内存不足引起的缺页软中断会导致程序性能下降。linux 系统 SLB 分配器。内存的几种标识,cache、不可分配,在查看内存是要看内存泄漏,看其中的某类型内存。
系统级 IO,网络编程、并发编程都是系统上层应用。并发编程 3 种实现:1 多进程,进程间通信效率低。2IO 多路复用,select 函数.3 多线程,控制锁,使用信号量。

感受

在排查 nfs 服务内存占用持续高,需要定时重启 nfs 时,需要内存分配相关知识,可以分析更明确。
编译 openssh-server 时,系统 openssl 库和 openssh 使用的库不一致,如何解决,都是动态链接库,难道要静态编译?
程序报错排查 strace,oom-killer 等,是需要了解编译-运行-结束全过程的。程序运行的环境,就是系统知识。
后面还需再次阅读。