清华操作系统课程学习笔记2

一、计算机体系结构及内存分层体系

1、计算机体系结构/内存分层体系

CPU:对程序的执行的控制

内存:放置程序的代码和数据

外设:键盘、鼠标、显示器等,完成各种功能。

2、内存的层次结构

内存的层次结构研究的是,CPU能够访问的指令和数据所处的位置。

从上到下:

寄存器、cache,都位于CPU内部,CPU直接访问,操作系统不能对其进行直接管理,但速度很快,容量很少。

主存(物理内存)放置操作系统本身和运行的代码和数据。容量比cache和寄存器大,速度慢些。

磁盘:内存有时候不够大,需要把一些数据放在磁盘里(虚拟内存),并且把一些需要永久保存的数据(断电后也能保存下来)放在磁盘里。

3、操作系统在管理内存的时候的目标

(1)抽象

希望应用程序在运行中不需要考虑一些物理细节,只需访问一个连续的地址空间,我们称之为逻辑地址空间。

(2)保护

多个应用程序可能会因为某些原因去访问其他进程的空间,会破坏其他进程的空间。因此需要一个有效的机制去对他们的各自空间进行隔离、保护。

(3)共享

进程之间可能需要交互,通过提供共享空间,让进程之间可以安全、可靠、有效地进行数据的传递。

(4)虚拟化

当内存不够的时候,为了让应用程序有足够空间运行,把最需要放在内存的数据放在内存中,暂时不需要的数据可以临时放在硬盘上,通过这个方法可以实现一个大的内存,这个过程对应用程序是透明的,程序看到的都是逻辑地址空间。

4、内存管理的不同方法

程序重定位、分段、分页、虚拟内存、按需分页虚拟内存。操作系统是个软件,它内存管理的实现高度依赖于硬件,比如MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求。

二、地址空间与地址生成

1、地址空间的定义

两种地址空间:

物理地址空间,和硬件直接对应,如内存条所代表的主存,和硬盘。物理空间的管理由硬件完成。

逻辑地址空间,一个运行的程序能看到的地址空间,是个一维的线性的地址空间。

我们需要理解这两个地址空间是如何对应的。因为任何地址空间,最终都是落实在物理地址空间中的。

2、地址空间是如何生成的

逻辑地址生成,以C代码程序为例:

首先,将代码编译,成为汇编程序。在C代码中,程序,变量的地址其实就是逻辑地址。

汇编语言很多变量还是通过变量名来表示的。通过汇编器转化为机器语言(.o文件),机器语言中,起始地址都是从0开始,并且变量名和函数名都被转化为地址。

Linker将多个.o程序链接为单个可执行的程序(.exe),存放在硬盘中。这个程序的地址已经是全局的分布了,不同的.o程序中变量的地址都已经在单一的程序中有相应的定义。

Loader将硬盘中的可执行程序放在内存中的相应位置,此时将逻辑地址进行相应的分配,使得应用程序在内存中可以正常运行。程序在内存中存在一个偏移量,可以通过偏移量和逻辑地址,可以对程序进行正确的访问和指令的操作。

上面那些转化过程基本不需要操作系统的介入,只需编译器、linker、loader的配合即可完成。

逻辑地址如何映射到物理地址?

CPU中有个MMU,MMU完成从逻辑地址到物理地址的映射(上图中蓝色块)。

流程:

(1)当CPU要执行指令时,ALU向MMU发出请求,带有逻辑地址;

(2)MMU查找逻辑地址的映射表中是否存在对应的物理地址。如果没有,在内存中找

如果找到了,CPU的控制器对主存发出请求。

(3)主存把内容通过指令传给CPU,CPU拿到指令的内容后开始执行。

操作系统在这期间的角色是,在执行指令之前,要把映射表建立好。

3、地址安全检查

如何保证放在内存的程序相互之间不能干扰?

要确保每个程序访问的地址空间是合法的,在一定的范围内:

三、连续内存分配

1、内存碎片问题

一些无法被利用的空闲空间。分两种:外部碎片和内部碎片。

2、如何分配连续内存空间

简单的内存管理方法:当一个程序准许运行在内存中时,分配一个连续的空间。三个简单的分配策略:首次适配、最优适配和最差适配。

(1)首次适配

为了分配n字节,从低地址到高地址,使用第一个能够满足的空闲块。

基本原理和实现:

按地址排序的空闲块列表;

分配需要寻找一个合适的区间;

重分配的时候需要进行检查,看是否有空闲分区是能够跟相邻的空闲分区合并的(这样就能合并成一个更大的空闲块)。

优势:

简单、易于产生更大的空闲块。

劣势:存在外部碎片,而且容易不停地加剧。

(2)最优适配算法

寻找所有空闲块中"最适合"的空闲块。什么是最适合的呢,就是比需要的空间大的而且最接近需要的空间的空闲块。比如在下图的情况中,不会去选1K字节和2K字节的空间,而是去选最下面的500字节的空间。

基本原理和实现:

为了避免分割大的空闲块,为了最小化外部碎片产生的尺寸。

需求:

按尺寸排列的空闲块列表;

分配需要寻找一个合适的分区;

重分配的时候需要搜索和合并相邻的空闲分区。

优势:

当大部分分配是小尺寸的时候非常有效,比较简单。

劣势:

同样无法克服外部碎片。重分配慢(因为空闲块列表是按照大小排列,而不是按照地址排列)。容易产生很多没用的微小碎片。

(3)最差适配

寻找大于需要空间的最大的空闲块。

基本原理和实现:

需求:

按尺寸排列的空闲块列表

分配速度很快(获得最大的分区)

重分配需要合并相邻的空间分区。

优势:

分配的是中等尺寸效果最好

劣势:

重分配慢。外部碎片易于破碎打得空间块,以致大分区无法被分配。

3、碎片整理

(1)压缩式碎片整理

重置程序的地址以合并孔洞。

要求所有程序是动态可重置的。

要考虑的问题:

何时进行重置?

不能在程序运行的时候重置。

重置的开销。

(2)交换式碎片整理

当运行中程序需要更多内存的时候,比如下图中的P3,当P1,P2,P3已经把所有内存空间占据的时候,可以把某个正在等待的程序(如P4)放在磁盘中,在内存中腾出空间给P3。当P4需要执行的时候,再把P4从硬盘拷贝到内存中。

问题1:交换哪些程序?

问题2:什么时候进行交换?磁盘的访问速度较慢,如果交换的那个程序较大,那时间开销也是比较可观的。

上面这两个问题,在虚拟内存空间管理中会进一步讨论。

猜你喜欢

转载自blog.csdn.net/qq_26286193/article/details/80245627
今日推荐