操作系统(内存)

L20 内存使用与分段

前面讲的是操作系统如何管理cpu
现在要讲操作系统如何管理内存

首先要看内存是如何使用的?

如何让内存用起来?
在这里插入图片描述
计算机如何工作?
从内存中取出程序,到cpu里执行

内存的使用就是将程序放到内存中,让程序执行起来

首先让程序进入内存

用磁盘读取,关键问题是,读取到内存的什么地方?
由于程序中有汇编指令(call 40),意味着跳转到40这个地址开始执行(40这个地址是main函数的第一条指令),为了让这个程序可以运行(为了让call 40)这行命令有用,main的第一条指令必须放在物理内存的40地址处(相对应的,入口地址应该在0地址)

按照上述方法将程序读取到内存中,程序可以被执行
但是程序必须放到0地址(main的第一条指令必须放在实际物理内存的40地址处)
在这里插入图片描述

但是0地址处不一定是空闲的,更不是想用就能用的(一般来说0地址处是存放操作系统的)

所以应该在内存中找一段空闲的内存,放置
然而,如果放置在内存中空闲部分,程序不能执行(因为call 40,会跳转到物理内存的40地址处)

因此要使用重定位(修改程序中的地址)
40是相对地址,也叫逻辑地址
在这里插入图片描述
找一段空闲内存(基地址)将程序放入进去
修改逻辑地址(40)
修改为 基地址(1000) + 逻辑偏移地址(40)

什么时候完成重定位?
编译时(效率高,但是编译时不知道哪一段内存空闲)
载入时(这个比较灵活,但是需要修改代码会慢一些)

程序载入后还要移动
在这里插入图片描述
内存较小,磁盘很大
因此,在进程阻塞不使用的时候,要将进程交换入磁盘中
在交换中,进程会换到不同的内存地址中
所以,在载入时重定位的地址,经过交换后,可能就不能用了

因此,重定位最合适的时机是运行时重定位
在这里插入图片描述
在运行每条指令时,才完成重定位
每执行一条指令都要从逻辑地址算出物理地址:地址翻译

问题是:基地址应该存放在哪里?
存放在PCB里,执行地址翻译时先从PCB中取出这个基地址

总结:
内存使用的过程

  1. 程序编译
  2. 程序运行,在内存中找一段空闲的,创建进程(PCB),把空闲内存的起始地址放入PCB
  3. 在执行过程中进行地址翻译(PCB的基地址+逻辑地址)
  4. 接着就能找到实际物理内存地址

引入分段
在这里插入图片描述
现实中的程序
在这里插入图片描述
程序由若干部分组成,代码段只读,数据段可写
如果整个程序放在一起,那么每个段不同的特点,用途,会很麻烦
在这里插入图片描述
每个段分别放入内存

如果3是堆栈段,假设整个程序放在一起,当3的堆栈不够时,就要在别的地方申请内存,然后将所有程序拷贝到新的内存,会造成浪费
假设是分段放,当3的堆栈不够时,只需要移动3就可以

分段时的寻址:<段号,段内偏移>
PCB内要放所有段的基地址

GDT表是操作系统的段表
进程的段表叫LDT表

GDT+LDT
在这里插入图片描述
进程切换的时候,LDT进行切换
每次地址翻译的时候,根据段号和段内偏移在LDT表中找到基地址,然后完成地址翻译

总结:

  1. 一个程序分段分别找内存中空闲处,分别把基地址放到进程的LDT表里(程序载入内存)
  2. LDT表赋给PCB,PC指针指向初始地址
  3. 根据PC指针取址执行
  4. 每执行一条指令,查LDT表,找到基地址,加上程序中的逻辑地址,进行地址翻译,找到相应的物理内存

L21 内存分区与分页

  1. 将程序分段(编译)
  2. 内存中找空闲的区域(分区)
  3. 把程序读入(文件系统)
  4. 把LDT表初始化

怎么找内存中空闲的区域?

在这里插入图片描述
可变分区的管理——请求分配
在这里插入图片描述
当又一个段提出内存请求,此时有多个空闲分区,应该如何选择?
最先适配(选择表第一行的,优点时间复杂度低)
最佳适配(缺点,会把内存切割的很细)
最差适配(优点,内存会切割的较为均匀)
在这里插入图片描述

可变分区会造成的问题

在这里插入图片描述
会造成内存外部碎片(虽然有空闲内存,但是长度过短,无法分配给段)

此时需要将空闲分区合并,需要移动(内存紧缩)

然而在内存紧缩的过程中,段都要进行移动,导致所有进程的LDT表都在修改中,无法进行地址翻译并取址执行,所以所有的进程都处于用不了的状态,用户会觉得计算机处于死机状态

内存紧缩需要花费大量时间

分页

将内存分成页
在这里插入图片描述
在操作系统初始化的时候,把内存等分成一页一页(mem_map 4k一页)
针对每个段的内存请求,系统一页一页的分配给这个段

特点:
没有内存外部碎片,但是有内存内部碎片,然而内部碎片最大最大也就4k

因此,物理内存希望采用分页的特点,因为内存碎片少
然而,用户希望采用分段的特点,因为程序由多个段组成

页表重定位

在这里插入图片描述
分段有段表,分页则有页表,来帮助重定位

L22 多级页表与快表

分页的问题

为了提高内存空间利用率,页应该小(4k),页小内存碎片少,然而页小了会导致页表增多
在这里插入图片描述

页表很大,页表放置会出问题

在这里插入图片描述

实际上,大部分逻辑地址是用不到的(不需要把所有页表都存入内存)

如页号为2的这一段地址没有使用,是否可以把这一个逻辑页号的页表项去掉

第一种尝试,只存放用到的页

用到的逻辑页表才有页表项
在这里插入图片描述

但是这种情况会导致表中的页号不连续,页号不连续时,想要通过逻辑页号转换物理页号的过程中,会很复杂,需要遍历页表进行查找逻辑页号的位置(在连续的表中,如果想要去指定的逻辑页号,只要指针偏移就可以,因为连续,但是不连续的情况下不知道在哪)

因此,页号必须连续,第一种方案失败

引出多级页表(既要连续,页表占用又少)

第二种尝试:多级页表,页目录表+页表

在这里插入图片描述
单级页表需要把所有页表项都列出来

多级页表引入层次索引的概念,把单级页表通过引入页目录号,一层一层的查找
页目录指针首先通过页目录号,然后再根据页号找到物理地址

多级页表的问题

多级页表增加了访问内存的次数,浪费了时间
多级页表是一种空间换时间的概念

快表

在这里插入图片描述
为了解决逻辑地址到物理地址的转换速度,操作系统在 页表方案 基础之上引入了 快表 来加速逻辑地址到物理地址的转换

快表可以理解成高速缓存(ARP高速缓存,DNS高速缓存等)
将最近访问过的逻辑地址和物理地址的映射存入快表中,每次要转换时,先查快表,快表中没有,再查多级页表

L23 段页结合的实际物理内存管理

用户希望采用分段的特点,因为程序由多个段组成
物理内存希望采用分页的特点,因为内存碎片少
在这里插入图片描述

段页结合

段的工作方式:

在内存中,采用分区的方法切割出区域分配给应用程序的段(建立映射),这样应用程序就被放入内存中了
在这里插入图片描述

页的工作方式:

把物理内存平均切割成大小相等的页,程序的段根据页的大小切割,存入页中,这样应用程序也被放入内存中
在这里插入图片描述

如何组合?

先分段,再分页

引入虚拟内存概念

首先在虚拟内存中,采用分区的方法切割出区域分配给应用程序的段,然后在物理内存中把段根据物理内存页的大小切割,存入物理内存的页中

段、页同时存在时的重定位(地址翻译)
在这里插入图片描述
逻辑地址通过段表转换成虚拟地址,虚拟地址通过页表转换成物理地址

L24 内存换入-请求调页

要想实现虚拟内存需要内存的换入换出

用户可以随意使用虚拟内存,就像单独拥有内存
但是虚拟内存需要与物理内存进行映射,不然用户用不了实际内存

在这里插入图片描述

问题:
物理内存小于虚拟内存,怎么用较小的内存(物理内存)给用户提供一种在用大内存(虚拟内存)的感觉
答案:
使用换入换出,只有用的时候,才把代码从磁盘中读入内存

虚拟内存类似仓库
物理内存类似店面

在这里插入图片描述

请求的时候才映射(请求调入页面)

请求调页

用户使用逻辑地址,映射到虚拟内存,实现重定位,转换成虚拟地址,虚拟地址映射物理地址,发现需执行的指令或访问的数据尚未在内存(要访问的页面不在内存中)

此时发生缺页中断从而由处理器通知操作系统将相应的页面或段调入到内存
在这里插入图片描述

L25 内存换出

换入并不能总是获得新的页,内存是有限的
需要选择一页淘汰,换出到磁盘,选择哪一页?

FIFO先进先出

在这里插入图片描述
总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰

算法表现:
导致7次缺页

MIN(最佳,OPT)

在这里插入图片描述

所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。

算法表现:
导致5次缺页

然而,是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。

LRU页面置换(最近最少使用)

在这里插入图片描述

虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。

LRU算法实现

在这里插入图片描述

使用队列实现,但是因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。

LRU近似实现——二次机会算法

在这里插入图片描述
LRU的近似,R记录的是最近是否使用,而不是LRU的最近最少使用
但是每执行一条指令只需要把R置成1,代价小

Clock算法

在这里插入图片描述
二次机会算法的问题:
当缺页很少的情况出现,所有的R都等于1,指针转一圈会回到自己,算法退化为FIFO
出现问题的原因:
记录了太长的历史信息

解决办法:
定时清除R位,加一个扫描指针
快指针用来清除R位
慢指针用来淘汰页

猜你喜欢

转载自blog.csdn.net/m0_51082307/article/details/109792273