1. 内存管理介绍
操作系统的内存管理主要负责内存的分配与回收,以及地址转换(将逻辑地址转换成物理地址)。
2. 常见的内存管理机制
操作系统的内存管理机制分成连续分配和非连续分配两种。这里的连续和非连续指的是给用户进程分配的内存空间是否连续。
- 连续分配指的是为一个用户进程分配一个连续的内存空间,比如块式管理;
- 非连续分配指的是允许一个进程使用的内存在物理分布上是不相邻的,比如页式管理和段式管理。
1.块式管理:将内存分成几个固定大小的块,每个块中只包含一个进程。不管进程需要的块多么小,在块式管理机制中都是分配给一个进程一整个块的内存,着就会造成内存的浪费,产生内存碎片。
2. 页式管理:页是比块更小的单位。在页式管理中将内存划分成大小固定且相等的页,相比于块式管理,提高了内存的利用率,降低了内存的碎片产生量。
页式管理中为每个进程对应一个页表,存储页号和页面号(页内地址),用来实现逻辑地址和物理地址的对应。
页号 | 页面号 |
---|---|
0 | 20 |
1 | 40 |
2 | 10 |
由逻辑地址得到物理地址的过程如下:
- 首先要知道物理地址=块号+页内地址;逻辑地址=页号+页内地址;
- 逻辑地址/页面长度=页号;
- 逻辑地址%页面长度=页面号;
- 然后根据页号和物理内存中块号的对应关系,得到物理地址。
页号 | 物理块号 |
---|---|
0 | 3 |
1 | 5 |
2 | 6 |
- 段式管理:段是比页更小的内存单元。它是将一个进程划分成一个一个的逻辑段来存储,每个段都是一个逻辑实体,比如可以划分成主程序段MAIN、子程序段X和数据段D等模块,也就是将程序模块化。
段式管理是通过段表进行的,一个段表包括段号、段起点、段长度等信息。 - 段页式管理:段页式是综合了段式管理和页式管理二者的优点,首先将主程序段分成若干个子程序段,然后再在段内进行页的划分。
如图所示,段内的页划分完成以后,页和物理块的对应和页式管理是相同的。只是多了一个状态字段,这里的状态指的是装入位,用来标识该段/页是否已经装入内存,1表示已经装入,0表示未装入。
3. 快表和多级页表
- 快表的存在是为了提高虚拟地址到物理地址的转换速度。可以将快表看成一种特殊的高速缓冲器,存储的是页表的一部分或者全部内容。作为页表的 Cache,它的作用与页表相似,但是提高了访问速率。由于采用页表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。
使用快表之后的地址转换流程:
- 根据虚拟地址中的页号查找快表;
- 如果该页在快表中,直接从快表中读取对应的物理地址;
- 如果该页不在快表中,再访问内存中的页表得到物理地址,同时将页表中的地址映射添加到快表中;
- 快表填满以后,需要按照一定的策略淘汰快表中的某个页。
- 多级页表
引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。
多级页表是如何节约内存的
总结来说就是,用不到的一级页表,二级页表是可以不存在的;根据局部性原理,并不是所有的二级页表都需要被加载进内存的。
4. 分页机制和分段机制的共同点和区别?
- 共同点
- 分页机制和分段机制都是为了提高内存利用率,较少内存碎片;
- 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。
- 区别
- 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序;
- 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。