操作系统中的内存管理

1.虚拟内存

虚拟内存是多进程系统的基础,操作系统为每个进程分配虚拟地址,以32位系统为例,每个进程都认为自己有4G的内存,但实际上进程操作虚拟地址时会用过CPU的MMU(memory manage unit)映射成物理地址。虚拟地址最终怎么落到物理内存里,对进程来说是透明的。

2.映射方法

2.1分段机制
管理虚拟地址和物理地址之间的关系主要有内存分段和内存分页

内存分段是按照若干个逻辑分段组成的,例如代码分段,数据分段,栈段,堆段组成。

分段机制下的虚拟地址由两部分组成,
段选择子和段内偏移量,
通过段选择子中的段号来检索段表中存放的段基地址,段的界限和特权级。
段内偏移量应该位于0和段界限之间。

分段机制的缺点
1.内存碎片
2.内存交换效率低

内存碎片分为
内部碎片和外部碎片
内部碎片是由于所有内存都被装在到了物理内存,但是部分内存并不常用,导致内存的浪费。
外部碎片是由于段和段之间会有不连续的小物理内存,解决办法是进行内存交换。

内存交换效率低是因为内存交换时是将整个段写入磁盘上,再把整个段写回物理内存。

2.2分页机制
分页机制是把整个虚拟和物理内存空间切成固定的大小。这样一个连续并且尺寸固定的内存空间,叫做页。
在Linux下,每一页的大小为4KB。

虚拟地址和物理地址之间通过页表来映射。
也是通过CPU中的MMU来找出实际要访问的物理内存地址。

当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入内核空间分配物理内存,更新页表,再返回用户空间,恢复运行。

由于操作单位是固定的大小,所以不会产生外部内存碎片。
如果内存空间不足,操作系统会把[最近没被使用]的页暂时写在磁盘上,需要的时候再加载进来。由于页比较小,所以交换的效率就相对比较高了。
内存分页的缺点:由于每个进程都有4M的页表,如果100个进程就需要400M的内存来储存页表。

2.2.1多级页表
由于页表一定要覆盖全部虚拟地址空间,不分级的页表需要一百多万个页表项来映射,而二级分页只需要1024个页表项。(二级页表是需要时才会创建
一级页表分为1024个页表
二级分页分为1024个页表项

在64位系统,理论上可寻址到2^64字节的内存,即16EB(16000PB),但实际虚拟地址空间为 128 TB,所以二级分页不够,需要四级分页。

3.分段分页机制优化(TLB)

多级页表解决了空间浪费的问题,但是虚拟地址转换为物理地址多了几道转换的工序,但我们可以利用局部性原理,把最常访问的页表项存储到访问速度更快的硬件中,CPU中的TLB(translation lookaside buffer)专门存放常用的页表项。如果TLB没找到页表项,才会查常规的页表。

你可能感兴趣的:(操作系统)