操作系统-内存管理
内存管理
内存管理及其功能
所有用户进程和系统所需要的全部程序和数据不可能都放入到主存中,操作系统将内存空间进行合理的划分和有效地动态分配,这就是内存管理。
内存管理主要需要满足的需求包括;重定位、保护、共享、逻辑组合和物理组织。
内存管理的主要功能有:
- 内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,
- 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理器必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
- 内存空间的扩充:利用虚拟存储技术或者自动覆盖技术,从逻辑上扩充内存。
- 存储保护:保证各道作业在各自的存储空间内运行,互不干扰。
基本概念
物理地址/绝对地址:数据在内存中的实际位置。
逻辑地址:与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须转换成物理地址。
相对地址:逻辑地址的一个特例,是相对于某些已知点(通常是程序的开始处)的存储单元。
重定位:系统采用运行时动态加载的方式把使用相对地址的程序加载到内存。
覆盖:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可以把用户空间分成一个固定去和若干个覆盖区。将经常活跃的部分放在固定去,其余部分按调用关系分段。把即将要访问的段放入覆盖区,其他段放在外存,在需要调用前,再调入覆盖区,替换掉原有的段。
交换:把处于等待状态的程序从内存移到辐存,把内存空间腾出来,称之为换出。把准备好的竞争CPU运行的程序从辐存移动到内存,称之为换入。
内存保护:内存分配前,需要保护操作系统不受用户进程的影响,保护用户进程不受其他用户进程的影响。
页框:内存中一个固定长度的块
页:一个固定长度的数据块,存储在二级存储器如磁盘中。数据页可以临时复制到内存的页框中
段:一个变长的数据块,存储在二级存储器中。整个段可以临时复制到内存的一个可用区域内,或者可以将一个段分为许多页,将每页单独复制到内存中。
内部碎片:已经被分配出去的的内存空间大于请求所需的内存空间。
外部碎片:还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块。
内存分区的方法
技术 |
说明 |
优点 |
缺点 |
固定分区 |
内存被划分成许多静态分区 |
简单,开销低 |
有内部碎片、内存使用不充分,活动进程最大数目是固定的 |
动态分区 |
根据进程大小动态创建分区 |
没有内部碎片,充分利用内存 |
需要压碎外部碎片,处理器利用率低 |
简单分页 |
内存被分为大小相等的页框,每个进程被分成许多大小与页框相等的页,把进程包含的页装入到内存内不一定连续的某些页框中。 |
没有外部碎片 |
少量内部碎片 |
简单分段 |
每个进程被划分成许多段,要装入一个进程,需要把进程包含的所有段都装入到不一定连续的动态分区中 |
没有内部碎片,相对于动态分区,提高了内存利用率,减少了开销 |
存在外部碎片 |
虚拟内存分页 |
不需要装入一个进程的所有页,非驻留页在需要的时候自动调入 |
没有外部碎片,支持更高道数的多道程序设计,巨大的虚拟内存空间 |
复杂的内存管理开销 |
虚拟内存分段 |
不需要装入一个进程的所有段,非驻留段在需要的时候自动调入 |
没有内部碎片,支持更高道数的多道程序设计,巨大的虚拟内存空间,支持保护和共享 |
复杂的内存管理开销 |
虚拟内存段页 |
用户空间分为段,段划分成固定页,页的长度等于页框大小。 |
具有两者的优点 |
复杂性和开销增加。硬件以及占用的内存增加,执行速度下降。 |
固定分区和动态分区属于连续分配管理方式,为一个用户程序分配一个连续的内存空间。而分页和分段的方法属于非连续分配管理方法,允许一个程序分散地装入到不相邻的内存分区中,存储密度低,但是内存利用率提高。固定分区的内存块大小可以不一致,分页是一致的。
动态分区的分配策略
在进程装入或换入主存的时候,如果内存中有多个足够大的空闲块,操作系统必须确定分配哪个内存块给进程使用,主要有以下几种算法:
- 首次适应:First Fit: 按地址递增形成链,分配的时候顺序查找,找到大小能满足要求的第一块
- 最佳适应:Best Fit: 按容量递增形成链,找到第一个能满足要求的
- 最坏适应/最大适应:Worst/Largest Fit:按容量递减形成链,找到第一个能满足要求的
- 邻近适应:Next Fit:由首次适应算法演变而成,从上次查找结束的位置开始继续查找。
分页
分页存储的逻辑地址结构: 页号+页内偏移量
为了方便在内存中找到进程对应的物理块,系统为每一个进程建立了一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。页表是由页表项构成的,页表项由页号+物理内存块中的块号构成。页表项的第二部分与逻辑地址的第二部分共同组成物理地址。
地址转换
分段
分管管理方式的提出是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长以及动态链接等多方面的需要。
分段的逻辑空间中,段内要求连续,短间不需要。其逻辑地址由段号+段内偏移量构成,且这些必须由用户显示提供,这个工作由编译器完成。
每个进程都有一张段表,每一个段表项对应进程的一个段,其结构:段号+段长+本段在主存中的起始地址。使用段长的目的是验证有效地址。
地址转换
段号的索引方式与页号相同。但是偏移量需要与段长度进行比较,如果偏移量大于段的长度,则这个地址无效。
物理地址是段的起始物理地址和偏移量之和。
段页式
地址空间被分成若干个逻辑段,每段都有自己的段号,然后再分成若干个页。
每个逻辑地址组成:段号、页号、页内偏移量
每个进程建立一张段表,每个分段有一张页表。段表项中包括了段号、页表长度和页表起始地址。页表项中包含了页号和块号。 系统中还有一个段表寄存器,指出作业的段表地址和段表长度。(寄存器的作用:寻址和判断越界)
地址转换
在进行地址变换的时候,首先通过段表查询到页表起始地址,然后通过页表找到页帧号,然后形成物理地址。