操作系统简单总结之内存管理及虚拟内存

操作系统简单总结——内存管理及虚拟内存

  • 内存管理的需求
  • 内存分区
  • 内存分段
  • 内存分页

内存管理基本概念

  • 页框:内存中的固定长度块,装载页
  • 页:磁盘中固定长度存储块
  • 段:磁盘中变长数据块,段可分成多个页。

重定位
所谓重定位就是要把代码里出现的地址转换为实际的物理内存地址。

保护
进程之间都有自己的代码段数据段之类的,进程需要对各自的代码数据进行保护,举个例子,用户进程就不能访问OS操作系统的相关代码数据。

实现保护机制由CPU硬件完成,最重要的一个是程序状态字寄存器,还有就是基址寄存器,限长寄存器。


内存管理之分区管理

静态分区
系统启动的时候内存区域相应划分好,由OS进行维护分区表。缺点比较明显,进程数由于分区数确定而确定,容易产生区内碎片等。

动态分区
OS从可用内存空闲区域中划分出区域给进程,运行完回收,若相邻内存空闲则合并。动态分区提高了内存的利用率,但是容易产生区间外碎片。

动态分区分配策略:

 FF(首次适配)  NF(下次适配)
 BF(最佳适配)  WF(最差适配)

liunx,unix采用伙伴系统分配内存页框。就是相邻两个页框块(帧块),大小
必须一样。帧长4KB:帧数1,2,4,8,16,32…,尺寸4,8,16,32,64,128KB…


内存管理之分段机制

程序员或编译器将程序按逻辑上有完整意义的段划分,段长不固定。

每个进程维护一个段表。

分段机制在具体机器上实现不一样,可以结合汇编程序的代码段,数据段,堆栈段等进行理解,比如X86机器的段长不超过64kb。

逻辑地址与物理地址一个对应一个,只不过逻辑地址把一个地址给力人为划分,而物理地址则没有。举个例子:我的学号是20140127,2014是什么我也不知道,01是我的班级号,27是我的班级排号。当我把学号给另一个人,他知道学号是按照班级分的,所以他会先去查一下01是哪个班级,然后再去找27这个人。

地址转换是CPU自动完成的,怎么转要看OS是怎么管理内存。不需编程人员考虑。

内存管理之分页机制

在该内存模型中,页框是用来装载磁盘中的页的。(页,同样大小的逻辑块,大小一般是4KB,由系统决定)。

OS把进程按照页框大小把需要进程分为一页一页的,为进程离散分配内存帧,这样每个进程的最后一页有内碎片,无外碎片,内存利用率高。

实现分页机制,关键是地址转换

页式地址转换:由逻辑地址(页号,页内偏移量)和页表,得到物理地址。每一个进程都维护一个页表,而OS维护整个内存空闲页框表。

地址具体转换的过程与分段机制一个道理。

分页机制与分段机制实现相似,只是分页把内存粒度划分得更细罢了。

现在的操作系统管理内存一般都是段页式结合。


虚拟内存(只记录最主要的)

虚拟内存就是把整个磁盘当做是内存来使用。

既然虚拟内存是把整个磁盘当成是内存来用,那么逻辑上可用的整个内存地址(即逻辑地址,也就是虚拟地址)就是磁盘大小,而真正的内存并没有这么大。所以经常会发生缺页中断

缺页中断发生就是因为访问了不在内存中的逻辑地址,这时候就需要去磁盘I/O把缺失的页装入内存,装完再重新执行发生中断的那条指令。因为这对程序员是不可见的,整个过程中内存就好像是整个磁盘那么大。

当然,如果速度很慢的话,那虚拟内存就没什么用了。所以为了提高驻留集的命中率,最常用的是引入快表(TLB),里面存放着最常用的页。如何提高速度?因为虚拟地址需要转换,转换会有一个查询页表的过程,页表每个进程都有一个,存放着进程的页到内存页框(帧)的映射,得到地址的话(不缺页),会再去该内存地址取数据;如果缺页了,会去磁盘I/O缺失的页,再去内存取数据。而快表就存放着最常用的进程的页(局部性原理),先访问快表能提高访问速率。

现代OS虚拟存储管理

  • 读取策略
  • 置换策略
  • 驻留集管理
  • 清除策略
  • 加载控制,防止抖动。