本周速读了《深入理解计算机系统》这本书,这本书从程序员的角度介绍了计算机系统的内在运作,展示了一些本质概念是如何实际的影响应用程序的正确性、性能和实用性的。收获如下:
1、关于进程和线程
- 进程是操作系统对运行程序的一种抽象,是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
- 线程有时被称为轻量级进程,是操作系统能够进行运算调度的最小单位。线程是进程中的一个实体,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源,同一进程中的多个线程之间可以并发执行。
2、几种数据传送指令
- movl:传送双字,源操作数指定一个值,可以是立即数,可以存放在寄存器或存储器中。目的操作数指定一个位置,可以是寄存器或存储器地址。
- movw:传送两个字节,当一个操作数为寄存器时,必须为下图中八个双字节寄存器元素中的一个。
- movb:传递一个字节,当一个操作数为寄存器时,必须为下图中八个单字节寄存器元素中的一个。
- movsbl和movzbl负责拷贝一个字节,并设置目的操作数中其余的位。
- movsbl的源操作数是单字节的,并将高24位设置为源字节的最高位,然后拷贝到双字的目的中。
- movzbl的源操作数是单字节的,在前面加24个0扩展到32位,然后拷贝到双字的目的中。
3、寄存器的使用惯例
IA32采用了一组统一的寄存器使用惯例,根据惯例,寄存器eax、edx、ecx被划分为调用者保存寄存器,当过程P调用Q时,Q可以覆盖这些寄存器,二不会破坏任何P所需要的数据;ebx、esi、edi被划分为被调用者保存寄存器,这意味着Q必须在覆盖这些寄存器之前,将这些寄存器中的值保存到栈中,并在返回前恢复它们,因为P可能会在今后的计算中需要这些值。由此根据惯例,必须保持寄存器ebp、esp。
4、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定律的主要观点就是要想大幅度提高整个系统的速度,必须提高整个系统很大一部分的速度。
5、高速缓存行、组和块有什么区别?
- 块是一个固定大小的信息包,在高速缓存和驻村之间来回传送;
- 行是高速缓存中存储块以及其他信息的容器;
- 组是一个或多个行的集合,直接映射高速缓存中的组只有一行组成,组相联和全相联高速缓存中的组室友多个行组成的。
在直接映射高速缓存中组和行是等价的,但在相联高速缓存中两者不能混用。
6、重定位的过程:
重定位由两步组成:
- 重定位节和符号定义。链接器将所有想同类型的节合并为同一类型的新的聚合节,然后链接器将运行时存储器地址赋给新的聚合节,赋给输入模块定义的每个节,以及赋给输入模块定义的每个符号。这一步完成后,程序中每个指令和全局变量都有唯一的运行时的存储地址了。
- 重定位节中的符号引用。链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址,这一步的执行会依赖于重定位表目的可重定位目标模块中的数据结构。
7、基于gettimeofday函数的测量
使用这个库函数查询系统时钟以确定当前的日期和时间。这个函数把时间写入到一个调用者传递过来的结构中,这个结构包括一个单位为s的字段,还有一个单位为μs的字段。
8、垃圾收集
垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配块,这些块被称为垃圾。自动回收堆存储的过程叫做垃圾收集。在一个支持垃圾收集的系统中,应用显式分配堆块,但从不显式地释放它们。在C程序的上下文中,应用调用malloc,但从不调用free。垃圾收集器定期识别垃圾块,并相应地调用free,将这些块放回空闲链表中。