深入理解计算机系统(csapp)第一章计算机系统漫游
第一章 计算机系统漫游
第一章更像是全文的导读,可以先通读一遍,后序章节会对内容进行具体学习
在网上看了很多有关此书的笔记,但都没有坚持写完,粗略的估计了一下预计总结完全文至少30万字,希望自己可以坚持写完,并且还希望给大家补充一些有用的知识,例如shell脚本语言基本使用,linux基本命令,即可以后面自己复习提升自己,也有利于后来人对此书的学习。
在写作过程中有任何建议或者文章错误都可以私信或者评论我,我会一一认真回复并针对问题作出改正。
代码仓库
1.1信息就是位加上下文
对于计算机来说所有文件都是由01来存储的,区分文件的唯一标准是文件的上下文,而我们平时写的内容会经由ASCLL转化为01存储在计算机中,就像这篇文章,在计算机眼中也是01字符。
1.2程序被其他程序翻译成不同的格式
以c语言程序为例
- 1 预处理阶段,此阶段预处理以#开头的命令,读取文件中的内容,创建出.i文件。注意: 此时还是本质上还是c语言程序,是对#进行处理,例如查找引入文件所在的位置,已经写入的进行替换。
- 2 编译阶段, 将原本的.i文件翻译成.s文件,.s文件是一个汇编程序。
- 3 汇编阶段, 将原本的.s文件翻译成.o文件,.o文件是一个二进制文件,字节编码是机器语言指令。
- 4 链接阶段,将c语言标准库中的函数以某种方式合并到.o程序中,c语言标准库的函数已经预编译好了,然后得到可执行的文件。
1.3了解编译系统如何工作的作用
- 1.优化程序性能
- 2.理解链接时的错误
- 3.避免安全漏洞
1.4存储器读并解释存储在存储器中的指令
用shell应用程序运行
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
shell语法总结
1.4.1 系统的硬件组成
- 1.总线 贯穿系统的电子管道传送定长的字节块。
- 2 . I/O设备
(1)I/O设备是系统与外界联系的通道,例如:鼠标、键盘、显示器、磁盘…
(2)每个I/O设备都通过一个控制器和适配器和I/O总线相连。控制器是基于I/O设备本身的或者系统主板上的芯片组,适配器插在主板插槽上的卡 ,他们的功能是在I/O总线和I/O设备之间传递信息。
适配器是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。
控制器比较复杂多样,具体可以参考此篇文章适配器
第六章I/O设备工作方式
在应用程序中利用 unix I/O接口访问设备
- 3 主存
主存是一个临时存储设备,存放程序和程序处理的数据。物理上是由一组动态随机存取存储器(DRAM)芯片组成的。逻辑上,存储器是一个线性的字节数组,每个字节都有其唯一的地址。
第六章存储技术 - 4 处理器(CPU)
CPU是执行存储在主存中指令的引擎。核心是程序计数器(PC)。任何时刻PC都指向主存中的某条机器语言指令。
CPU执行的围绕着主存、寄存器文件、算数/逻辑单元(ALU)进行的。
可能执行的操作:
(1)跳转 把主存中的一个字或者字节复制到寄存器,覆盖寄存器原来的内容
(2)存储 把寄存器中的一个字或者字节复制到主存中,覆盖主存中原来的内容
(3)操作 把两个寄存器中的内容复制到ALU,进行算数操作,将结果放到一个寄存器中,覆盖掉该寄存器的内容
(4)跳转 从指令本身抽取一个字,将这个字复制到PC上,覆盖掉PC的值
第三章指令集结构提供的抽象
第四张处理器上是如何运行代码
1.4.2运行hello程序
输入./hello 运行hello程序,先将程序的指令和数据通过磁盘控制器由直接从磁盘到达主存,然后处理器执行hello main中的程序,将hello, world字节又主存复制到寄存器文件,再有寄存器文件到显示设备,显示在屏幕上。
1.5高速缓存至关重要
由hello程序可以看出,系统花费了大量时间把信息从一个地方挪向另一个地放。
根据机械原理,较大的存储器比较小的存储器运行型的满慢,快速设备的造价远高于慢速设备。
例如处理器从寄存器中读取文件的速度比从主存中读取的速度几乎要快100倍,加快处理器的速度比加快主存的速度要容易、便宜的多。
针对处理器和差异,系统设计者采用了更小、更快的存储设备,即高速缓存存储器。如下图
有位于处理器芯片上的L1高速缓存,通过一条特殊总线连接处理器的L2高速缓存。他们利用硬件技术SRAM(静态随机访问存储器)实现。
告诉缓存技术的存在可以让应用程序员将他们的程序提高一个数量级。
1.6存储设备形成层次结构
操作系统管理硬件
操作系统是应用程序和硬件之间的一层软件。
基本功能(1)防止硬件被失控的应用程序滥用。
(2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
操作系统的几个基本抽象概念
(1)文件 是对I/O设备的抽象表示
(2) 虚拟存储器 对主存和磁盘I/O设备的抽象表示
(3) 进程 对处理器、主存和I/O设备的抽象表示
1.7.1进程
进程是操作系统对正在运行程序的一种抽象。在一个操作系统上可以同时运行多个进程,而每个进程好像独占的使用硬件。并发运行就是一个进程的指令和另一个进程的指令交错运行。
在只考虑单个CPU的情况下,一个CPU看上去可以同时执行多个程序,实际上是通过上下文切换不断地切换进程实现的。
1.7.2线程
一个进程可以由多个线程组成,由于线程之间更容易共享数据。由于网络服务器对并行处理的需求,多线程也成为了一个使程序更快运行的方法
1.7.3虚拟存储器
- 程序代码和数据
- 堆
- 共享库
- 栈
- 内核虚拟存储器
1.7.4文件
文件就是字节序列,向应用程序提供了一个统一的视角。
1.8 系统之间利用网络编程
从本地主机连接远程主机执行命令的过程
1.9重要主题
1.9.1并发和并行
并发是一个通用的概念,指一个同时具有多个活动的系统
并行指用并发使一个系统运行的更快
1线程级并发
最开始的并发是模拟出来的,通过进程间的快速切换。
后来出现多核CPU以及超线程(同时多线程)。
多核CPU有共享的高速缓存,以及自己本身的L1和L2高速缓存。
同时多线程是一项允许同时执行多个控制流的技术,例如等待某个线程的数据装入高速缓存的过程中可以去运行另一个线程
2指令级并行
流水线技术
超标量
3单指令、多数据并行
一条指令可以产生多个并行执行的操作
参考书籍:深入理解计算机系统
本文只是对此书知识点的总结,可以帮助大家快速学习计算机体系知识,如果想要知道更多细节请阅读此书,也可以作为全书的导读和习题指导
如果文章中出现错误希望大家不吝指正
与50位技术专家面对面 20年技术见证,附赠技术全景图