本周速读了《深刻理解计算机系统》这本书,这本书从程序员的角度介绍了计算机系统的内在运做,展现了一些本质概念是如何实际的影响应用程序的正确性、性能和实用性的。收获以下:程序员
一、关于进程和线程
- 进程是操做系统对运行程序的一种抽象,是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操做系统结构的基础。
- 线程有时被称为轻量级进程,是操做系统可以进行运算调度的最小单位。线程是进程中的一个实体,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的所有资源,同一进程中的多个线程之间能够并发执行。
二、几种数据传送指令
- movl:传送双字,源操做数指定一个值,能够是当即数,能够存放在寄存器或存储器中。目的操做数指定一个位置,能够是寄存器或存储器地址。
- movw:传送两个字节,当一个操做数为寄存器时,必须为下图中八个双字节寄存器元素中的一个。
- movb:传递一个字节,当一个操做数为寄存器时,必须为下图中八个单字节寄存器元素中的一个。
- movsbl和movzbl负责拷贝一个字节,并设置目的操做数中其他的位。
- movsbl的源操做数是单字节的,并将高24位设置为源字节的最高位,而后拷贝到双字的目的中。
- movzbl的源操做数是单字节的,在前面加24个0扩展到32位,而后拷贝到双字的目的中。

三、寄存器的使用惯例
IA32采用了一组统一的寄存器使用惯例,根据惯例,寄存器eax、edx、ecx被划分为调用者保存寄存器,当过程P调用Q时,Q能够覆盖这些寄存器,二不会破坏任何P所须要的数据;ebx、esi、edi被划分为被调用者保存寄存器,这意味着Q必须在覆盖这些寄存器以前,将这些寄存器中的值保存到栈中,并在返回前恢复它们,由于P可能会在从此的计算中须要这些值。由此根据惯例,必须保持寄存器ebp、esp。
四、Amdahl定律
Gene Amdahl作出了一个关于提升系统一部分性能的效果的简单但富有洞察力的观察,被称为Amdahl定律。其主要思想是当咱们加快系统一个部分的速度时,对系统总体性能的影响依赖于这个部分有多重要和速度提升了多少。
考虑一个系统在其中执行某个应用程序须要时间t,设系统某部分须要这个时间的百分比为a,二咱们将它的性能提升到了k倍,所以整个执行时间为T=(1-a)t+(at)/k=t[(1-a)+a/k],由此能够得出加速S=1/[(1-a)+a/k]。例如原来占用60%时间的部分提升到了三倍即a=0.6,k=3,此时加速S=1.67。能够看出咱们大幅度改进了系统的一个主要部分,可是净加速仍是很小。
因此Amdahl定律的主要观点就是要想大幅度提升整个系统的速度,必须提升整个系统很大一部分的速度。
五、高速缓存行、组和块有什么区别?
- 块是一个固定大小的信息包,在高速缓存和驻村之间来回传送;
- 行是高速缓存中存储块以及其余信息的容器;
- 组是一个或多个行的集合,直接映射高速缓存中的组只有一行组成,组相联和全相联高速缓存中的组室友多个行组成的。
在直接映射高速缓存中组和行是等价的,但在相联高速缓存中二者不能混用。
六、重定位的过程:
重定位由两步组成:缓存
- 重定位节和符号定义。连接器将全部想同类型的节合并为同一类型的新的聚合节,而后连接器将运行时存储器地址赋给新的聚合节,赋给输入模块定义的每一个节,以及赋给输入模块定义的每一个符号。这一步完成后,程序中每一个指令和全局变量都有惟一的运行时的存储地址了。
- 重定位节中的符号引用。连接器修改代码节和数据节中对每一个符号的引用,使得它们指向正确的运行时地址,这一步的执行会依赖于重定位表目的可重定位目标模块中的数据结构。
七、基于gettimeofday函数的测量
使用这个库函数查询系统时钟以肯定当前的日期和时间。这个函数把时间写入到一个调用者传递过来的结构中,这个结构包括一个单位为s的字段,还有一个单位为μs的字段。
数据结构
八、垃圾收集
垃圾收集器是一种动态存储分配器,它自动释放程序再也不须要的已分配块,这些块被称为垃圾。自动回收堆存储的过程叫作垃圾收集。在一个支持垃圾收集的系统中,应用显式分配堆块,但从不显式地释放它们。在C程序的上下文中,应用调用malloc,但从不调用free。垃圾收集器按期识别垃圾块,并相应地调用free,将这些块放回空闲链表中。并发