操作系统原理读书笔记之内存模型

时间:2023-01-06 10:42:08

地址重定位

内存可直接寻址的是物理地址,物理地址是固定的;相对的有逻辑地址(虚拟地址),用户程序经过编译汇编后形成目标代码,目标代码采用的首地址为0,其余地址都对应于首地址而编址。而逻辑地址和物理地址的相互转化称为地址重定位

静态重定位

当用户程序加载到内存时,一次性实现逻辑地址到物理地址的转换,当程序位置改变,地址需要重新计算

动态重定位

在进程执行过程中进行地址变换,即逐条指令执行时完成地址转换,需要重定位寄存器(内存管理单元,Memory Management Unit)的支持,MMU存储进程的首地址,计算物理地址时,由逻辑地址+首地址得出


空闲内存管理

等长划分

数据结构由位图支持,每个分配单元对应位图中的一位,0表示空闲,1表示占用

不等长划分

由空闲区表和已分配区表共同管理,表中每一项记录空闲或已分配区的起始地址、长度、标志

不等长划分的内存分配算法

  1. 首次适配:在空闲区表中从头到尾找到第一个满足进程要求的空闲区
  2. 下次适配:记录上次找到的空闲区地址,下次从这个地址往下查找

  1. 最佳适配:查找整个空闲区表,找到能够满足进程要求的最小空闲区
  2. 最差适配:与最佳适配相反,找最大空闲区

回收问题

当某一块已分配的内存块归还后,前后空闲空间需合并,修改内存空闲区表
分四种情况:
  • 上相邻:合并到上相邻的空闲区表中
  • 下相邻
  • 上下都相邻:合并空闲区表记录
  • 上下都不相邻:新增记录

空间块链表

其中的典型为linux的伙伴系统,主要思想将内存按2的幂进行划分,组成若干空间块链表,分配时查找该链表能满足进程需求的最佳匹配块,查找方式是二分法,如果申请的空间大小s满足2^(U-1) < s <= 2^U,则分配整个块,否则将块划分成两个2^(U-1)的块
回收的时候如果归还的内存块旁边有大小正好相等的内存块,则合并成一个空闲块,依次向上递归



内存管理方案

进程进入内存一片连续的区域有以下方案:
  1. 单一连续区:只有一个进程在内存
  2. 固定分区:内存分为若干分区,每个分区大小可不同但固定不变,而且只能装载一个进程
  3. 可变分区:根据进程需要分割内存并分配,剩余部分成为新的空闲区
进程进入内存中若干不连续的区域有以下方案:

1、页式存储

用户进程被划分为大小相等的部分,称为页(page),从0开始编号; 物理内存按同样的大小划分,称为页框(page frame)。页面尺寸通常为2^N,典型的有4k或4M大小
内存分配规则以页为单位,按进程需要的页数分配,逻辑上相邻的页,物理上不一定相邻

逻辑地址由页号和页内地址组成,举例来说:
假如系统是32位(地址由32位组成),页面尺寸为4K(2^12),逻辑地址即为

操作系统原理读书笔记之内存模型
进程地址空间和物理内存的转换通过 页表 查找的方式实现
  • 页表中的每条记录记录了逻辑页号与页框号的对应关系
  • 每个进程都有一个页表,页表的指针存放在进程控制块PCB中
物理内存用位图管理

页式存储存在的问题:会造成最后一页的部分空间浪费,即产生内碎片

2、段式存储

与页式存储相似,只不过内存的划分是不等长的,用空闲区表和已分配表管理内存分配

3、段页式存储

结合页式和段式存储,逻辑地址的数据结构如下
操作系统原理读书笔记之内存模型
段表记录了每一段的页表起始地址和页表长度;页表记录逻辑页号与页框号的对应关系
一个进程只有一个段表,一个段表里存放多个页表的起始地址和长度

地址转换的过称为,逻辑地址先拿到段号,去段表查到段号所对应的页表起始地址,再通过页号查页表所在的页,然后把页内地址加到页的起始地址上得到真实的物理地址