学习笔记:CSAP 第一章:计算机系统漫游
CSAP-计算机系统漫游
信息就是位+上下文
计算机系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传输的数据,都是一串 bit 表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文 。同样的一个字节序列可能是整数、浮点数、字符串或机器指令
程序被其他程序翻译成不同的格式
- 预处理阶段 hello.c + 预处理命令 => hello.i
- 编译阶段 hello.i + 汇编指令 => hello.s
- 汇编阶段 hello.s + 不同实现平台 => hello.o (可重定位目标程序-二进制)
- 链接阶段 hello.o + *.o => hello.exe (可执行目标程序-二进制)
了解编译系统如何工作是大有益处的
- 优化程序性能:我们可能没有编译器优化的好,但是我们至少不应该拖后腿(C++编程规范 第9条:不要进行不成熟的劣化)
- 理解链接时出现的错误
- 避免安全漏洞
处理器读并解释存储再内存中的指令
系统的硬件组成
- 总线 : 它携带信息字节并负责在各个部件间传递。
- I/O:系统与外部世界的联系通道。
- 主存: 存放程序和程序处理的数据。
- 处理器:解释存储在主存中指令的引擎
hello 程序的运行流程
- 从I/O设备(磁盘)拷贝到主存
- CPU从主存中获取指令执行
- 将字符串从主存复制到寄存器
- 将字符串从寄存器复制到显示器
存储设备形成层次结构
操作系统管理硬件
操作系统的两个功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
进程
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件
并发运行,则是说一个进程地指令和另一个进程地指令是交错进行地,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器进行进程间地切换来实现地。操作系统实现这种交错执行的机制称为上下文切换。
线程
一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享相同的代码和数据。
虚拟内存
每个进程看到的内存都是一致的,称为虚拟地址空间
- 程序代码和数据。
- 堆:运行期间动态使用malloc 和 free 动态申请和释放的区域
- 共享库:存放共享库代码和数据的地方
- 栈:编译器用它实现函数调用
- 内核虚拟内存:为内核保留。
文件
文件只是字节序而已。 每个I/O设备都可以被视为文件。
重要主题
系统是硬件和系统软件相互交织的集合体,它们共同协作以运行应用程序
Amdahl 定律
当我们对系统的某个部分加速时,其对整体性能的影响取决于该部分的重要性和加速程度。若系统执行某应用程序的时间为 。假设系统某部分所需执行时间和总时间的比例为 , 而该部分性能提升为 。即该部分所需时间为 ,现在所需时间为 。因此总的时间为:
加速比 为:
并发和并行
并发(concurrency) 是一个通用概念,指一个同时具有多个活动的系统;
并行(parallelism) 指的是用并发来使一个系统运行的更快。
- 模拟并发:单处理器,通过上下文切换模拟出来同时执行多个控制流的现象
- 线程级并发: 超线程/同时多线程(simultaneous multi-threading),运行一个CPU执行多个控制流的技术。
- 指令级并行:在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行
- 流水线(pipelining):将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行地操作,用来处理不同指令地不同部分。
- 超标量(superscalar):比一个周期一条指令更快地执行速率。
- 单指令、多数据并行(SIMD):允许一条指令产生多个可以并行执行地操作。
抽象地重要性
- 文件时对I/O设备的抽象
- 虚拟内存时对程序存储器的抽象
- 进程是对一个正在运行的程序的抽象
- 虚拟机是对整个计算机的抽象