操作系统-内存管理

内存管理:操作系统对内存的划分和动态分配。

内存管理的功能:

逻辑地址和物理地址

内存分配管理方式

分为连续分配管理方式和非连续分配管理方式。

1 连续分配管理方式

为一个用户程序分配一个连续的内存空间。主要包括单一连续分配/固定分区分配/动态分区分配。会产生许多内存碎片。

动态分区分配算法(主要的数据结构是空闲分区表和空闲分区链)

1)基于顺序搜索的动态分区分配(适合不太大的系统)

1)首次适应

要求空闲分区链表以地址递增的顺序链接。每次分配内存时都从链首开始顺序查找,直至找到第一个大小满足要求的空闲分区即可。

缺点:会产生很多难以利用,很小的空闲分区,即碎片。而且每次查找都是从低址顺序查找,增加查询开销。

优点:优先利用内存中低址部分的空闲分区,保留了高地址部分的大空闲区,为以后处理大作业提供方便

2)循环首次适应

是首次适应的改进方式。每次查找从上次找到的空闲分区的下一个空闲分区开始查找,直至查找到一个满意的空闲分区。并采用循环查找的方式。

优点:使内存空闲区分布均匀,从而减少查找空心分区的开销

缺点:缺乏大的空闲分区。

3)最佳适应

每次分配内存时,总把满足空间要求的最小的空闲分区分配给用户程序。这需要把所有的空闲分区按容量从小到大的顺序形成空闲分区链表。

优点:第一次找到的满足空间要求的空闲分区一定是最佳的。

缺点:会产生很多难以利用的碎片。

4)最坏适应

每次分配内存时,总是挑选最大的空闲分区从中分割一部分存储空间给用户程序使用。这需要把所有的空闲分区按照容量从大到小的顺序形成空闲分区链表。

优点:使剩下的空闲分区不至于太小,产生内存碎片的可能性最小,对中小型作业有利。

缺点:存储器中缺乏大的空闲分区。

2)基于索引的动态分区算法(适合比较大的系统,内存分区比较多,相应空闲分区链表很长,)

1)快速适应算法

将空闲分区根据其容量大小进行分类,对每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表。在内存中设立一张管理索引表,每一个索引项对应一种空闲分区类型,并记录了该空闲分区链表表头的指针。

优点:在进行空闲分区分配时,不会对任何分区产生分割,所以可以保留大的分区,也不会产生内存碎片,而且查找效率高。

缺点:为了有效合并区间,在分区归还主存时算法复杂,且系统开销大。

2)伙伴系统

3)哈希算法

利用哈希快速查找的优点,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录对应空闲分区链表的表头指针。当进行分区分配时,根据所需空闲分区大小,通过哈希函数计算得到在哈希表中的位置,快速找到相应的空闲分区链表。

2 非连续分配管理方式

非连续分配管理允许一个程序分散地装入到不相邻的内存分区中,根据分区大小是否固定又分为分页存储管理和分段存储管理方式。随后又有段页式存储管理方式。

1)分页存储管理

把用户程序的地址空间分为若干个固定大小的区域,即页或者页面。同时把内存空间划分为若干个物理快,物理快的大小与页大小相同。这样用户程序的任一页都可以放到任意物理快中,实现非连续分配/离散分配。

2)分段存储管理

为了满足用户要求的一种存储管理方式,把用户程序的地址空间分为若干个大小不同的段,每段可以定义一组相对完整的信息,在存储器分配时,以段为单位,这些段在内存中也可不连续。

分段存储方式适合信息保护/信息共享/动态链接。

逻辑地址由段号和段内偏移来指定。

3)段页式存储管理

虚拟内存管理

虚拟内存的实现方式

1)请求分页存储管理

2)请求分段存储管理

3)请求段页式存储管理

置换算法

1)最佳置换算法

其所选择淘汰的页是以后永不使用的,或者是在最长时间内不再被访问的页面。这可以保证获得最低的缺页率。但由于无法预知一个进程的若干个页面中哪一个未来不被访问,因此该算法无法实现。但可以用来评价其他算法。

2)先进先出页面置换算法(FIFO

总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

实现比较简单,只需把一个进程已调入内存的页面按照先后次序组成一个队列,总是淘汰队首页面即可。

缺点:与进程实际运行的规律不相适应,因为在进程中,有些页面可能会被经常访问。而且可能出现Belady异常(当所分配的物理块数增大缺页次数反而增大的异常现象)。

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

总是选择最近最久未被使用的页面予以置换。

实现该算法的硬件支持:寄存器或栈

1)寄存器

为每个在内存中的页面配置一个移位寄存器,当进程访问某物理块时,把相应的寄存器的高位置1.然后每隔一段时间将寄存器右移一位。如果把n位寄存器看作一个整数,那么具有最小整数值的页面就是最近最久未使用页面。

2)栈

使用一个栈保存当前使用的各页面的页面号。每当进程访问某页面时,便把该页面页面号从栈中移除再压入栈顶。因此栈顶始终是最近被访问的页面的编号,而栈底则是最近最久未使用页面的页面号。

4)最少使用置换算法(LFU

为每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该算法总是选择最近时期使用最少的页面作为淘汰页。

每当页面被访问时,就将寄存器最高位置1,然后每隔一段时间把寄存器右移一位,这样在最近一段时间使用最少的页面将是寄存器所有位数1的个数最少的那个页面。

5CLOCK置换算法

1)简单CLOCK置换算法

为每页设置一个访问位,再将内存中所有页面通过链接指针链接为一个循环队列。当某页被访问时,其访问位置1。在选择某一页淘汰时,检查页的访问位,如果是0就换出,否则就置0,暂不换出,按照FIFO算法检查下一个页面。

只是把最近未使用的页面换出去。

2)改进CLOCK置换算法

抖动

伙伴系统

(1)将空闲页面分为m个组,第一个组存储2^0个单位的页,第二组存储2^1个单位的页,第m个组存储2^(m-1)个单位的页

m最大为11,页面一般为4K,因此最大内存块是4M。

(2)每个组是一个链表,用于连接同等大小的内存块。

(3)伙伴块的大小是相同的,第一块和第二块是伙伴块,第三块和第四块是伙伴块。类推。

内存分配

若申请的内存大小为n,则将n向上取整为2的幂次数为s,则需要分配s大小的内存块,定位到相应组。

1.如果该数组有剩余内存块,则分配出去.

2.若没有剩余内存块就沿数组向上查找,然后再将该内存块分割出来s,并将剩余的内存块放入相应大小的组中.

内存回收

当用户用完内存后会归还,然后根据该内存块实际大小(向上取整为2的幂)归入链表中,在归入之前,

1.我们还要检测他的伙伴内存块是否空闲,

2.如果空闲就合并在一起,合并后转到步骤一,继续执行。

3.若果不是空闲的就直接归入链表中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值