操作系统--03内存管理

第三章:内存管理(存储器管理)

1.链接–形成逻辑地址
2.装载–逻辑地址映射到物理地址

3.内存保护的两种办法:

在CPU中设置一对上限和下限寄存器,存放进程的上下限地址。进程的指令要访问某个地址时,CPU检查是否越界。

采用重定位寄存器和界地址寄存器。
重定位寄存器用来存放进程的起始物理地址
界地址寄存器存放进程的最大逻辑地址(长度)。越出边界,抛出越界异常。

3.1 覆盖与交换

实现内存空间的扩充

覆盖技术:对用户不透明**,

覆盖和交换的区别:覆盖是在同一个进程或者程序中的,交换是在不同进程或者作业之间进行的。

3.2 连续分配管理方式

实现内存空间的分配和回收

连续分配:指为用户进程分配的必须是一个连续的内存空间

1.单一连续分配:
设计思想:内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用户存放操作系统的相关数据;用户区存放用户进程相关数据。内存中同一时刻只能有一道用户程序,用户程序独占整个用户区。
优点:实现简单,无外部碎片。可以采用覆盖技术扩充内存,不一定需要采取内存保护。

缺点:只支持单用户、单任务的操作系统。会产生内部碎片,内部碎片指的没有用上的内存空间。存储器利用率低。

2.固定分区分配:
设计思想:将整个用户空间划分为若干个固定大小的分区,在每个分区只装入一个作业。若分区大小相等,缺乏灵活性,但是很适用于用一台计算机控制多个相同对象的场合。分区大小不等:增加了灵活性。
操作系统需要建立一个数据结构–分区说明表,记录对应分区的大小,起始地址,是否已分配状态。

优点:实现简单,无外部碎片。

缺点:当用户程序太大时,需要用覆盖技术,降低了性能;会产生内部碎片。

3.动态分区分配:
设计思想:不会预先划分内存分区,而是在进程装入内存时,根据内存大小动态建立分区。系统分区的大小和数量是可变的。

使用什么样的数据结构记录使用情况?
空闲分区表:记录分区号,分区大小,分区起始地址等;

空闲分区链:分区的起始部分和末尾部分分别设置前向指针和后向指针,起始部分记录分区大小等信息

如何进行分区的分配和回收
相邻的空闲分区需要合并。

动态分区分配没有内部碎片,但是有外部碎片。
内部碎片是指分配给某进程的内部区域中有部分内存空间没有被利用。外部碎片是指内存中某些空闲分区因为太小而难以利用。

可以通过紧凑(拼凑)技术来解决外部碎片。

3.3 动态分区分配算法

1.首次适应算法:

实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区表或者空闲分区链。

2.最佳适应算法:

算法思想:尽可能多的留下大片连续的空闲分区。优先使用满足条件的更小的分区。

实现:空闲分区按容量递增的次序链接。
每次分配内存时顺序查找空闲分区表或者空闲分区链,找到第一个满足条件的空闲分区。总是需要重新排序,算法开销大。

缺点:会留下越来越多的很小的、难以利用的内存快,
这种方法会产生很多的外部碎片

3.最坏适应算法:

算法思想:优先使用最大的空闲分区。

实现:空闲分区按容量递减的次序排列。
每次分配时使用第一个空闲分区。第一个总是分区最大的。总是需要重新排序,算法开销大。

缺点会导致大的空闲分区很快用完,如果有一个大进程到达,会造成无分区分配。

4.邻近适应算法:

算法思想:每次都从上次查找结束的位置开始查找。解决每次都从低地址开始检索的问题。

实现:空闲分区按照地址递增的顺序排列(可排成一个循环链表)。算法开销小。

缺点大分区容易用完,类似于最坏适应算法的缺点。

3.4 基本分页存储管理方式

页表寄存器(PTR):
存放页表在内存中的起始地址F和页表长度M

在这里插入图片描述


逻辑地址–>物理地址的转换过程:

1.根据逻辑地址计算出页号和页内偏移量

2.判断页号是否越界,如果页号>页表长度,则产生越界中断

3.查询页表
找到页号对应的页表项地址(页表项地址 =页表起始地址 + 页号 * 页表项长度),取出该页表项内容,即为物理块号
一般不用计算,可以从页表中直接看到物理块号

页表长度(一共有多少个页),页表项长度(页地址占多大的存储空间)

4.用得到的物理地址去访问内存
物理地址=物理块号*页面大小+页内偏移量


3.1.8 具有快表的地址变换机构

时间局部性:如果执行了程序中的某条指令或者访问某个变量,那么不久后这条指令很有可能再次执行或变量再次被访问。(因为程序中存在大量的循环)

空间局部性:一旦程序访问了某个存储单元,那么不久后其附近的存储单元很有可能再次被访问。(因为很多数据在内存中都是连续存储的)

以上统称为局部性原理。

快表,又称为联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。

没有引入快表,需要两次访问内存,引入快表后,先查询快表,若快表命中,只需要一次访问内存,若快表未命中,需要两次访问内存。

3.1.9 两级页表

单极页表存在的问题:

页表必须连续存放,当页表很大时,需要占用很多个连续的页框。
页表可以改为分散存储,一个小分组正好可以装入一个内存块,为页表设置一个顶层页表,也称页目录表,用来记录每个分组的内存块号。

两级页表:将逻辑地址分为一级页号,二级页号,页内偏移量三个部分。可解决第一个问题。

没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在也表中增加一个标志位,用于表示该页面是否已经调入内存。

若采用多级页表机制,则各级页表的大小不能超过一个页面。
N级页表的访问内存次数分析:假设没有快表机构,需要进行N+1次访问内存。

3.1.10 基本分段存储管理

在这里插入图片描述

地址变换过程:

1:比较段号和页表项长度,如果段号大于页表项长度,则产生越界中断

2.段号对应的段表项地址=段表始址+段号*段表项长度
根据段表项地址找到段表项,段表项的前几位为段长,判断段长和段内偏移量的大小,如果段内偏移量>段长,则会产生越界中断

3.取出段表项的始址,物理地址=段表项的始址+段内偏移量


分页和分段区别:

分页对用户不可见,分段对用户可见

分页的地址空间是一维的,分段的地址的空间是二维的。

**分页内存空间利用率高,**不会产生外部碎片,只会产生少量的页内碎片,分段会产生外部碎片。

分段比分页更容易实现信息的共享和保护反应程序的逻辑结构,模块实现信息的共享和保护。例如,页面大小为4KB,其中3KB属于第一个段,1KB属于第二个段,而第一个段可以共享,第二个段不能共享,分页无法实现。


3.1.11 段页式管理方式

将进程按照逻辑模块分段,再将各个段分页。

逻辑地址:段号(决定每个进程最多可以有多少段)+页面(决定每个段最多有多少页)+
页内偏移量(页面大小),因此段页式管理的地址结构是二维的。

段表项:段号(隐含)+页表长度+页表存放块号

页表项:页号(隐含)+页面存放的内存块号

3.2虚拟内存:


虚拟存储器

内存空间有限(从逻辑上扩充)
逻辑地址到物理地址的映射
容量上接近辅存
速度上接近内存


在程序装入时,可以将程序中很快用到的部分装入内存,暂时用不到的部分留在外存。
在程序执行过程中,当所访问的信息不再内存中,由操作系统负责将所需信息从外存调入内存。(请求调页/段)
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。(页/段置换)
虚拟内存的实现需要建立在离散分配的内存管理方式上。

虚拟内存的主要特征:

多次性:无需在作业运行时一次性管不装入内存,而是允许被分成多次调用内存。

对换性:在作业运行时,无需一直常驻内存,而是允许在作业运行过程中,将作业换入换出。

虚拟性:从逻辑在扩充了内存容量。

3.2.2 请求分页管理方式

请求分页管理方式是在基本分页存储管理上扩展的一种虚拟内存存储技术。

主要区别是增加了两个功能:请求调页,页面置换。

缺页中断属于内中断,属于故障


地址变换过程:
1.判断页号是否大于页表长度:
如果大于则产生越界中断

2.判断页表项是否在块表中
(1)如果在快表中,直接修改访问位和修改位,形成物理地址
(2)如果不在快表中,访问页表,判断页表项是否在内存中:
如果在内存中,直接修改访问位和修改位,形成物理地址
如果不在内存中:产生缺页中断请求调页,从外存中找到缺页,修改页表和修改位


3.2.2 页面置换算法

1.最佳置换算法(OPT)

算法思想:每次选择淘汰的页面将是永久不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。

缺点:操作系统无法预判页面访问序列,因此,在实际应用中无法实现。

缺页中断时未必发生页面置换,若还有可用的空闲块,就不用进行页面置换。

2.先进先出置换算法(FIFO)

算法思想:每次淘汰最早进入内存的页面。

实现:把调入内存的页面根据调用的先后顺序排成一个队列,需要置换时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少内存块。

缺点:会产生Belady异常,即当为进程分配的内存块越多时,缺页次数出现不减反增的现象。虽然实现简单,但是该算法与进程实际运行的规律不适应。因为先进入的页面可能也会经常被访问,算法性能差。

3.最近最久未使用置换算法(LRU)

算法思想:往前看,每次淘汰最后看到的那个页面(最近没有使用的那个页面)。

缺点:该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大。是最接近OPT的。

4.时钟置换算法(CLOCK)

是一种性能和开销比较均衡的算法,又称为最久未用算法(NRU)

简单的CLOCK算法实现:

改进的CLOCK算法:优先淘汰未被访问的
淘汰顺序:未被访问且未修改的,未被访问且被修改,被访问且未修改、被访问且被修改的

3.2.3 页面分配、置换策略

驻留集:指请求分页存储管理中给进程分配物理块的集合。在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。

固定分配:驻留集不变

可变分配:驻留集大小可变

局部置换:发生缺页时,只能选择进程自己的物理快进程置换

全局置换:发生缺页时,可以将操作系统保留的空闲物理快分配给缺页进程,也可以将别的进程持有的物理快置换到外存,再分配给缺页进程。

可变分配局部置换搭配方案较优。

何时调入页面?

预调页策略:根据空间局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更加高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。一般用于进程的首次调入,即运行前调入,由程序员指定应该先调入哪些部分。
请求调页策略:进程在运行期间发生缺页时才将所缺页面调入内存。I/O操作多,开销大。
抖动(颠簸)现象:

刚刚换出的页面马上又要换入内存,刚刚换入的界面马上又要换出外存。这中频繁的页面调度行为,称为抖动。产生抖动的主要原因是进程频繁访问的页面数高于可用的物理块数。

工作集:以箭头为分界线 ,向前划窗口大小的数据集,找出不重复的集合就是工作集

驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值