961全部内容链接
《CSAPP》P418
一个编写良好的计算机程序常常具有良好的局部性(locality)。也就是,它们倾向于引用邻近与其他最近引用过的数据项的数据项。或者最近引用过的数据项本身。这种倾向被称为局部性原理(principle of locality)。
局部性通常有两种不同的形式(《王道2021操作系统》P194):
《CSAPP》P421
《王道2021组原》P125
Cache指高速缓存,位于存储器层次结构的顶层,通常由SRAM组成。其基本结构如下图所示:
为了便于Cache和主存之间交换信息,Cache和主存都被划分为相等的块(也称为行)。Cache中的块远远少于主存中的块,所以它仅保存主存中最活跃的若干块副本。因此,Cache按照某种策略,预测CPU未来一段时间内欲访存的数据,将其装入Cache。
当CPU发出读请求时,会出现以下几种情况:
当CPU发出写请求时,若Cache命中,为了防止写造成的内存和Cache数据不一致问题,通常的处理方法有两种:
Cache和主存的映射方式:Cache行中的信息是主存中某个块的副本,地址映射是指把主存的地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。地址映射的方法有以下三种:
《CSAPP》P444
通过分析存储器山 可以得出以下结论:
通过重新排列循环以提高空间局部性:降低高速缓冲的不命中率。
通过使用分块来提高时间局部性
在程序中利用局部性:
《CSAPP》P560
地址空间(address space) 是一个非负整数地址的有序集合:如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间(linear address space)。CPU从一个有2n个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间(virtual address space) 。该地址空间被称为n位地址空间。现代系统通常支持32位和64位。
一个系统还有一个物理空间地址(physical address space),对应于系统中物理内存的M个字节。
操作系统按照虚拟空间地址进行寻址,由内存管理单元(Memory Management Unit, MMU) 进行地址翻译,然后翻译成主存中的物理空间地址,进而访存。
《王道2021操作系统》P194 虚拟存储器的定义和特征
在程序装入时,将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将暂时不使用的内容换出到外存上,从而腾出空间来存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。
虚拟存储器有三个主要特征:
《王道2021组原》P143
主机和联机工作的辅存(磁盘)共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对应用程序员来说,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量,提高了存储系统的性价比。
虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的地址空间,在这个空间内,用户可以自由编程,不必在乎实际的主存容量和程序在主存中实际的存放位置。
用户编程允许涉及的地址称为虚地址或逻辑地址,虚地址对应的存储空间称为虚拟空间或程序空间。实际的主存单元地址称为实地址或物理地址。
虚拟地址使用原理:CPU使用虚地址时,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存。①若已在主存中,则通过地址变换,CPU可直接访问主存指示的实际单元;②若不在主存中,则把包含这个字的一页或一段调入主存后再由CPU访问。③若主存已满,则采用替换算法置换主存中的一页或一段。
《王道2021操作系统》P194
虚拟内存的管理方式有以下三种方式:
缺页中断的概念:在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。
《CSAPP》P582
内存映射的概念:Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。 虚拟内存区域可以映射到以下类型的对象:
一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件(swap file) 之间换来换去。交换文件也叫做交换空间(swap space) 或者交换区域(swap area) 。
简单解释(个人理解):就是把一个文件映射到程序的内存中(就好像程序把整个文件读入到内存中一样),程序就可以直接像操作内存一样操作该文件。而实际上,操作系统并没有真的把这些文件放入到内存,而是利用虚拟内存技术,对这些文件进行管理。
《王道2021组原》P145
快表(TLB) 是用来加快地址转换的。由于页表存在于主存中,访问起来相对较慢,所以根据局部性原理,将近期经常访问的页面存放在高速缓冲器组成的快表中,可以加快页表查询速度。
所以,当查询页表时,首先查询快表(TLB),若TLB命中,则直接通过TLB进行地址转换。若没有命中,再去主存中查询页表。
有些系统还支持快表和慢表(存储在主存中的页表)同时查询。
《CSAPP》P587
动态内存分配器(dynamic memory allocator) 使用来为程序动态分配内存的。动态内存分配器维护着一个进程的虚拟内存区域,称为堆(heap)。
动态内存分配器有两种风格:
垃圾收集器维护着这样的类似这样一张可达图(reachability graph) 的数据结构。 其中圆点为某个指针(其指向了一块内存区域),灰色部分为堆。若堆中的数据可以由根节点到达它,则它是可达的,这说明它不是垃圾。而蓝色的小球,堆外的根节点没有路径可以到达它那,所以它是不可达的,所以它是垃圾。
对于GC的最主要问题怎么找出那些不可达的节点。Mark&Sweep垃圾收集器可以干这个,基本原理为(分为两个阶段):