操作系统学习笔记(五): 计算机体系结构与内存层次

计算机除了计算能力之外还有存储能力,存储能力即计算机拥有一系列的存储介质,我们可以在存储介质上存储我们的代码和数据。计算机体系结构中约定了哪些地方可以用来存储数据:CPU内的寄存器、内存和外存。不同的存储介质,容量、速度和价格都是不同的。为了建立一个合理的系统,我们将计算机系统中的存储介质组织成一个层次结构。操作系统针对层次结构下的存储单元进行管理。操作系统的存储管理就是用来管理这些存储介质的。最基本的管理要求就是当一个进程需要使用存储单元的时候,操作系统能够分一块存储介质给它使用,等它不用的时候还回给操作系统。

计算机体系结构:

计算机系统包括CPU、内存和I/O设备。

操作系统学习笔记(五): 计算机体系结构与内存层次

具体地看。CPU中有寄存器和高速缓存。寄存器的空间是非常小的,可能是32位或64位,能存的诗句也就几十字节或几百字节。CPU中海油高速缓存,高速缓存仅次于CPU寄存器,处理速度接近CPU频率,容量远小于内存,速度远快于内存,当CPU要读取的数据存在于高速缓存时(命中),可以直接返回数据而不需要访问内存,合理利用内存访问的局部性特点,可以达到极高的命中率。内存也是比较大的能存储数据的介质,他的最小访问单位是字节,也就是8bit,通常我们的计算机系统是32位的总线,也就是说可以同时从内存中读写32位也就是4字节。一次读写32位时牵扯到地址对齐,因此读写时不能从任意地方开始读一个4字节。

操作系统学习笔记(五): 计算机体系结构与内存层次

内存层次:

了解了上面这些,我们可以看下计算机中内存的层次关系:首先是处理器中有两级缓存,这一部分内存管理是由硬件实现的,因此用户或操作系统是无法显示地进行控制的。再下面一层则是内存,内存再下面一层可以是外存中的虚拟内存,这两个层次是由操作系统机型管理的。当CPU能层高速缓存中获取所需读取的内容无需访问内存,能够在内存中获取的内容无需访问虚拟内存,内存缺页时才会从虚拟内存中读取需要的内容。而这几个层次上的内存的访问速度是有这巨大差别的。最快的L1缓存可以达到接近CPU频率的速度,内存可以达到1.3GHz,外存较慢需要5ms,可以看到最快和最慢能差到百万数量级,如何将这几个层次有机地结合到一起,挑战性还是很大的。

操作系统学习笔记(五): 计算机体系结构与内存层次

内存管理:

我们希望将内存管理做到什么程度呢?如下图,系统中有不同的进程,进程通过操作系统内核访问物理内存,访问受内存管理单元(MMU)的控制。我们希望每个进程认为它自己独占内存,因此进程能看到的是逻辑地址空间。MMU负责将逻辑地址空间映射到真实的物理地址空间。而这些都对内存管理提出了很高的要求,主要需要满足如下几条:1. 抽象,进程使用逻辑地址空间;2. 保护,由逻辑地址空间映射到物理地址空间时不同进程之间不能访问到其他进程的内存;3. 共享,所用进程共用操作系统内核;4. 虚拟化,进程可以使用比实际内存空间更大的地址空间。其中的保护性和共享性是相对矛盾的两个要求,既要保护好各自的空间,又要访问相同内存。甚至逻辑地址空间中看到的可以存储数据的空间是大于实际物理内存的。

操作系统学习笔记(五): 计算机体系结构与内存层次

操作系统为了达到上述效果,具体采用的内存管理方式有以下几条:

1. 重定位。在最初的计算机中,是直接使用总线上的物理地址来编写程序的,程序要读写某个内存单元,直接访问它所在的物理地址。这有很大缺陷,你的程序只能在指定类型的机器上运行。重定位通过将进程中的逻辑地址加上重定位寄存器的值获得物理地址。这样通过修改重定位寄存器的值就可以将程序运行下去。为了实现,程序和操作系统里面都需要有相应的支持。

2. 分段。实际我们在写程序的时候,逻辑结构并不是必须连成一片的区域,而是把程序分为数据、代码、堆栈。这三个部分是相对独立的。这样每一块需要的空间就变少了。分段依然需要每一段内的内容是连续的,这个要求依然很高。

3. 分页。分页就是把内存分成最基本的单位,选取合适的大小的连续区域作为一页,一页作为内存管理的基本单位。

4. 虚拟存储。目前多数系统(如Linux)采用按需页式虚拟存储。将不常用内容转移到外存上存储,这也使得逻辑地址空间可以大于实际物理内存空间。

上述4条内存管理方式的实现高度依赖硬件。比如与计算机存储架构紧耦合;MMU的结构是什么样的,CPU能够识别的页表是什么样的,也就是MMU如何处理CPU存储访问请求的硬件。