读《编程卓越之道:深入理解计算机》续四

来源:互联网 发布:sql语言有两种使用方式 编辑:程序博客网 时间:2024/04/28 13:28
      今天晚上很早就去图书馆了,就是想把这本书看完,其实后面几章相当大的一部分是在介绍内存层次结构和工作原理,以及系统I/O相关,大部分在介绍操作系统原理的书中几乎都有介绍,因此只摘抄了一些一般的书籍上没有的,来和大家共享。
1.尽量将频繁使用的数据显式放入寄存器中。CPU自己不会做这样的优化。
2.将经常使用到的变量尽量放在相邻的内存单元中,以使它们尽可能落在同一条缓存线上。这样可以避免内存颠簸,而且缓存会自动处理很多未对齐的数据访问,只要该数据对象未跨越缓存线。
3.把在同一代码段中使用的变量声明在一起。
4.尽量在过程内部分配局部变量。
5.将标量变量分配到一起,与数组、结构等类型变量分开。因为访问相邻几个标量中的任意一个通常都会导致系统将相邻的对象一起装入内存。
6.操作系统总是保留内存中地址最低的位置,原因之一是可以帮助检查空指针引用。
7.堆管理器在分配内存时可以有两种策略,一是直接向操作系统申请分配,一是和运行时库链接。其中直接从操作系统分配内存比较慢(因为系统API调用通常都涉及CPU内核态和用户态之间的来回切换,这个是很慢的),因此大多数语言都在运行时库中实现自己的类似malloc和free例程自行管理。其运行机制是,第一次分配内存时,malloc会向OS申请一大块内存,然后由malloc和free自行管理;当这块内存不够用时,malloc又向OS申请一块比上次大得多的内存块并链接到其管理的空闲块表中(对于某些特定的应用,自己实现malloc和free可能会更有效率)。
8.系统在给应用请求分配内存时,都需要额外的字节(典型的是4-16个)来记录块的大小。堆管理器可以将其存储在独立的内部表中,也可以直接附加到分配的块上。
9.大多数堆管理器以4、8、16字节作为内存分配粒度,这是为了保持数据访问地址对齐。也有的以缓存线边界开始分配,通常为16、32、64字节。