最近开始啃CSAPP,买了英文版,看得比较慢。只有先理解系统才能在更多方面学的更明其实质
Chapter1:
* 一份hello.c代码的编译分为四个阶段:1.Pre-processor:编译预处理,就是把#include后面的库代码加入到程序中,生成hello.i的文件。 2.Complier:用编译器把hello.i的C代码翻译成汇编语言,并生成:hello.s文件。(汇编语言是高级语言转为机器码的一个中间过程) 3.Assembler:汇编机把汇编语言翻译成机器二进制代码,生成hello.o文件。 4.Linker:把自己的hello.o和库函数的printf.o连接起来,生成Executable object program.
* adapter和controller都是连接总线和硬件设备的一个转换器,不同之处是adapter通常是插在motherboard上的插槽上的(显卡,声卡),而controller是motherboard集成的。
* CPU执行程序的原理:CPU都有一套属于自己的指令集(Instrctions set),指令集里面规定了读取那一条指令就做什么操作。而程序就是一个顺序特定的指令集合,存储在内存中(Main memory),CPU里的progrm counter(PC),总是指在内存的某一条指令上,CPU就会读取当前指令并执行对应的操作,并调整到下一个指令,且这些指令不是在内存上的连续区域,是一种类链表是方式散布在内存。
* hello.c程序在计算机里执行过程概览:首先UNIX计算机处于shell模式,CPU的PC指向内存中某一个指令。然后人从键盘输入“hello”并按回车,这个“hello”就经键盘controller生成并有I/O总线到达I/O桥,再由系统总线到达CPU里的register file里面。register只是暂时存储,分析之后CPU会将这个名字经系统总线、I/O桥、内存总线转移到内存里存下。然后CPU会根据内存中存下的这个程序名字去disk中寻找该程序的实际机器码,并把它经I/O总线,I/O桥、内存总线不经过CPU直接搬运到内存中去(DMA技术)。搬运到内存中的程序其实是一系列特定顺序的指令,CPU读取这些指令并依次执行,直到读到输出”hello world”字符串的指令,这个字符串在内存中被当做数据储存着,CPU将这个数据读取到register中来,然后再经总线运到图形adapter处,图形adapter解码这些数据并显示出来。
* 高速缓存(cache):CPU的处理速度,大于从内存中读写数据的速度,这就产生了processor-memory gap,为了解决这个效率低下的gap,就有了cache memories。cache memories 通常是有两到三个cache层级组成,其中第一次容量最小(但比register大),速度最快(但比register小),然后后来的两个cache性能依照层级变化。运行程序的时候把常用的指令放在cache而不是内存里,这样就会提高数据读写传输速度,解决processor-memory gap。
* 存储层级系统:计算机系统,由一个存储层级系统构成,其中顶层速度最快,容量最小,每字节成本最高的register,往下是几个级别的cache,内存,外存,其他系统的存储……整个系统的存在是为了在最小的成本下,让CPU的性能和存储系统的性能相匹配。
* OS是应用程序和底层硬件之间的过度层,他将复杂繁琐的底层抽象出来展现给应用程序。
* 进程的概念:进程是OS当前执行的程序的抽象。当一个进程要转换到另一个进程的时候,会先保持当前经常的所有状态信息,然后读取另一个进程的状态信息,运行另一个程序。
* 多线程(Multi-threading)是非常高效率的并发运行技术。
* 虚拟内存:程序运行时往往不是实际的内存地址,是操作系统分配的虚拟内存区域。这个虚拟内存区域既包括内存(main memory)又包括disk。然后OS赋予其一个虚拟的连续地址,由高到低,在地址上严格的分层次。其中最低层次的是程序本身的代码和数据,然后是堆(heap),然后是库文件的程序和数据,再然后是用户栈(stack),最顶端是操作系统的核心代码区域。
* 文件:Unix哲学的精华就是一切皆文件。其实文件就是一系列的位(byte)组成的。所有的I/O设备都可以看做是文件,操作一个设备其实就是向它的缓冲区读取或写入文件。这个思维大大简化了,程序员的使用难度!我们不需要去理解其深层次硬件是如何与软件衔接的,只需要向操作文件一样去操作它就是了。
* 并发(concurrency)和并(parallelism)的概念区别:并发就是指计算机同时处理多个进程。而进程是指运用并发的手段让计算机运转更快。
* 线程级别的并行:一个CPU由多个核心组成,而一个核心同常可以同时执行两个线程,这些线程的一二级高速缓存是独立的,但是它们共用第三级高速缓存,以实现线程级别的并行处理,大大提升效率。而要利用CPU的多线程就要使用多线程来大大提升程序的执行速度,就要采用多线程的方法。
* 指令级别的并行:就是一个时钟周期由于CPU在同时执行多个指令,所以均摊下来每个时钟周期就相当于执行了几条指令,而不采取并发技术的话,每个时钟周期只能执行一个指令的其中一步。
* SIMD并行:指的是Single Instructoin,Multiple Dates.就是一条指令执行多个操作。
版权声明:本文为博主原创文章,未经博主允许不得转载。