Learning Notes of Computer Systems, A Programmer's Perspective

2015-04-05
TPL

第一章 漫游计算机系统

  1. 程序的生命周期。程序就是位+上下文。区分数据对象的唯一方法是上下文。TODO: 把程序的表示写进py教程。或者写解释器的过程?
  2. 存储器可以通过DMA(直接存储器存取)不经过CPU与磁盘交换数据。CPU也可以不通过主存,直接将寄存器中的内容发送至I/O设备。
  3. 程序员可以利用对整个存储器模型的理解来提高程序性能。(寄存器,L1L2L3,DRAM,本地二级存储,远程二级存储)
  4. 从进程的角度,它独占地使用存储器和CPU。进程看到的虚拟存储器中的地址空间,由大量准确定义的区域构成。从低地址到高地址包括:(从可执行文件中初始化来的)只读代码和数据;运行时堆;共享库;(用于实现函数调用的)栈;(顶部1/4为内核预留的)内核虚拟存储器。
  5. 从系统角度看,网络同样是I/O设备。
  6. 并发(concurrent)与并行(parallel)。如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于“存在”这个词。在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。
  7. simultaneous multi-threading允许一个CPU执行多个控制流。常规处理器约需要20000个时钟周期做线程转换,multi-threading处理器可以在单周期基础上决定执行哪个线程。
  8. 指令级并行:现代处理器每个时钟周期2-4条指令。然而,每个指令从开始到结束大约需要20+个周期。但是处理器使用了非常多技巧同时处理100+指令。
  9. 大多数现代处理器支持超标量(super-scalar)操作:比一个周期一条指令更快的的执行速率。
  10. 单指令多数据并行:SIMD并行。例如Intel和AMD的处理器支持并行对8对单精度浮点数做加法的指令。

第二章 信息的表示和处理

  1. 虚拟存储器(virtual memory)是一个巨大的字节数组。Compiler和runtime system的一个任务就是将其划分为更容易管理的单元。
  2. 计算机的字(32/64位)的长度 = 整数的大小 = 指针的长度
  3. 为了避免计算机字长对数据大小的影响和编译器设置带来的问题,C99引入了固定大小的:int32_t,uint32_t,int64_t,uint64_t。大部分数据类型都编码为有符号数值,char一般被视为有符号,但是C标准并没有规定这一点。

Comments

CONTENT