《操作系统 - 清华大学》3 -1:计算机体系接口及内存分层体系
文章目录
- 1. 内容摘要
- 2. 计算机体系结构简介
- 3. 内存层次
- 4. 操作系统内存管理范例
1. 内容摘要
顺着操作系统启动,操作系统被加载到内存之后,它要对整个计算机系统进行管理和控制。那首先需要管理控制的是内存,操作系统如何管理物理内存?
- 首先需要了解,计算机的体系结构以及它的内存层次结构,才能知道操作系统怎么有效管理已知的硬件物理内存。
- 第二步需要知道操作系统怎么去和程序的编译执行过程进行交互。
- 最后介绍操作系统怎么去有效地管理连续的物理内存分配。
2. 计算机体系结构简介
上图上可以看到计算机体系结构主要包含三大块内容
- 第一部分 CPU,CPU 主要是完成了对整个程序或者软件的执行控制。
- 第二部分是内存,内存主要是放置了程序的代码和它所处理的数据。
- 第三部分是外设,比如硬盘、键盘、鼠标等等,这都属于外设,它们都有各自不同的功能,配合程序发挥它更大的作用。比如把数据永久地保存在硬盘中。
在这阶段,操作系统至少需要有效地把 CPU 访问的物理内存管理起来,那为此需要对内存做进一步地了解,那内存到底包含哪些东西呢?
3. 内存层次
内存其实并不仅仅是主存或者物理内存,它还包含其他的内容,这里面有另外一个概念,叫做内存的层次结构—— CPU 要访问的指令或者数据,它所处的位置在什么地方?
其实从上到下可以看到,CPU 可以访问的数据包含很多类:
- 第一个是寄存器,第二个是 cache,那这两部分都是位于 CPU 芯片内部,操作系统对它是没法直接进行管理,这是一方面。但是它们的数度很快,容量很小,所以能放置的数据和指令是有限的,为此在计算机系统里面还有一块很大的一块存储区域,叫做主存或者物理内存。
- 主存或者物理内存主要是用来放置操作系统本身以及要运行的代码,这些数据是放在主存中,它特点是容量比 cache 和 寄存器要大很多,但是它的速度相对于 cache 和寄存器而言要慢一些,但这个容量是否够用?在计算机系统中,CPU 的速度相当快,主存中可以同时存放很多可以运行的程序,在这种情况下,有可能某些时候对内存的需求比较大,那这时候就有可能还需要把内存中放不下的数据,放到硬盘上。那这时候就需要操作系统做管理工作,这是一方面。
- 另一方面,主存一掉电,它的数据就没了,所以需要把永久保存的数据和代码放在硬盘中,当掉电之后,依然可以把数据保存起来,当然加电之后,可以把数据从硬盘再读到内存中来。相对而言硬盘比主存速度要慢很多,但是它的容量要大很多。
可以看出来,这形成了金字塔的结构,在上面越靠近 CPU 的地方,速度越快,但是储的容量是很小,随着往下增长,内存和硬盘的容量越来越大,但是速度就会慢一些。
那有这个内存层次后,对编程人员来说,希望运行的程序能够达到一个好处,就是尽量数据访问很快,数据存储空间很大,那同时满足这两点,其实是鱼和熊掌很难兼得。但是如果有了操作系统的帮助,这一点其实是可以有效地达到,这是为什么需要通过操作系统管理物理内存,以及后续了解操作系统如何去管理虚拟内存,能够来完成近乎看起来像是一种不可能完成的一个很艰巨的任务。
4. 操作系统内存管理范例
操作系统到底要完成哪些事情?其实它有几个很重要的目标,在这里面可以把它分四个目标:
-
第一个是抽象,抽象是说希望应用程序在内存中运行的时候,由于操作系统有效管理,使它不用考虑很多底层的细节,它不用考虑物理内存在什么地方,不用考虑外设在什么地方,它只需访问连续的地址空间就 OK 了,这个地址空间一般称之为逻辑地址空间。这是从抽象的角度来考虑。
-
另一方面是保护,因为在内存中可以运行多个不同的应用程序,多个不同应用程序相互之间有可能由于某种原因去访问别的进程的地址空间,那有可能破坏别的进程地址空间,这实际是有问题的,需要有一种有效的机制,不能假定应用程序在内存中运行的时候不迫害别人,需要有一种有效的机制,保护进程间的地址空间是隔离的,隔离机制的实现就是靠操作系统来完成。
-
第三,进程之间也可能需要去进行交互,怎么有效地提供共享空间,使得进程间能够安全、可靠、有效地进行数据的传递。这实际也是通过操作系统的机制来完成,所谓进程间数据传递的机制。
-
最后,在内存中放了很多应用程序之后,其实会出现内存不够的情况,那么怎么能够让正在需要运行的程序能够获得它所需要的内存空间呢?这实际上就体现了一点,就是把最需要放到内存的数据放到内存中,那些暂时不需要放在内存中的数据,暂时不用去访问的数据,可以临时地把它放到硬盘上去,通过这种方式其实就可以有效地实现虚拟,一种大的内存空间现象。
这个管理过程希望能做到对应用程序透明,同时还能够让应用程序能够尽量地去用它所需要的数据和空间,这样就通过操作系统可以完成这个功能。
这四个是操作系统在内存管理方面需要去重点完成的目标,那这个目标其实可以通过上左侧图有效地表现出来。
在操作系统管理之下,现在有四个放在了内存中的程序,可以看到正在占用 CPU 运行的程序是 P1这个程序,那 P2、P3、P4 是等待状态,尤其是 P4,因为 P4 当前正在等待的某一个事情可能要过一会才会发生,那这种情况下它所访问的数据其实现在没必要放到内存中去,而 P1在这时候正在运行,在 CPU 上运行的程序可能需要更多的空间,通过操作系统帮助把这部分空间导到硬盘上去,可以看到右下侧的硬盘上就有这个 P4 的代码数据。那同时 P1 所占用空间就可以有效地执行,当 P1不执行之后,可以把 CPU 控制权交给 P2或者 P3,让 P2、P3在内存中继续执行。
这种方式就使得 P1、P2、P3可以很方便地在内存中执行了,当然还有有效的机制也可以让 P4在它得到它所满足的条件之后也能够继续执行,这是一方面。
另一方面可以看到,这里面有两个地址空间,后面会进一步展开讲解,逻辑地址空间和物理空间。那么主存和硬盘其实是一种物理地址空间,而运行的程序看到的空间是一种逻辑空间,这样的区别在后续会进一步展开讲解。
那操作系统既然要完成刚才提到的四点很重要的事情,那它需要有一定的机制来完成,这些机制包含了相关的一些手段,比如程序重定位、分段、分页、虚拟内存以及按需分页、按需分配内存等多种不同的手段。
后面会逐一对此进行展开讲解,另外操作系统是软件,它在完成上述这些功能的时候,其实还需要和硬件进行配合,也就刚才提到的计算机系统结构中 CPU 中的 MMU,它的相关一些硬件机制配在一起才能够有效地完成对整个内存空间的管理。