当前位置: 首页 > news >正文

软考-软件设计师中级备考 9、存储管理

一、内存的分配与回收​

(一)内存分配​

内存分配是操作系统根据进程需求,将内存空间合理分配给各个进程的过程。在多道程序环境下,多个进程需要同时驻留在内存中运行,这就要求操作系统高效管理内存,避免内存浪费和冲突。例如,当用户打开一个文本编辑器和一个浏览器时,操作系统需要为这两个程序分配各自所需的内存空间,确保它们能正常运行。​

内存分配过程中,操作系统会维护一个内存分配表,记录已分配和未分配的内存区域。常见的内存分配方式有连续分配和非连续分配。连续分配要求为每个进程分配一段连续的内存空间,这种方式简单直观,但容易产生内存碎片;非连续分配则允许进程的内存空间分散在内存的不同位置,通过地址映射机制实现逻辑地址到物理地址的转换,有效提高了内存利用率。​

(二)内存回收​

当进程运行结束或主动释放内存时,操作系统会执行内存回收操作,将这些内存空间重新纳入可用内存池,以便分配给其他进程。在回收内存时,操作系统需要检查回收的内存块是否与相邻的空闲内存块相邻,如果相邻,则将它们合并成一个更大的空闲内存块,以减少内存碎片。​

例如,进程 A 占用了内存地址 1000 - 2000 的空间,当进程 A 结束运行后,操作系统会将这部分内存标记为空闲,并检查其前后是否有空闲内存块。若地址 2000 - 3000 也是空闲的,操作系统就会将这两个空闲块合并为 1000 - 3000 的连续空闲块。​

二、动态分区分配​

(一)首次适应算法​

首次适应算法从空闲分区表的第一个表项开始顺序查找,直到找到一个能满足进程大小要求的空闲分区为止。然后从该分区中划出一块与进程大小相等的内存分配给请求者,剩余的空闲分区仍留在空闲分区表中。​

假设内存中有如下空闲分区:[100KB(起始地址 100),200KB(起始地址 200),150KB(起始地址 400),300KB(起始地址 550)],此时有一个需要 120KB 内存的进程,首次适应算法会从第一个空闲分区 100KB 开始查找,发现不满足需求,继续查找下一个 200KB 的分区,满足需求后,将该分区划分为 120KB 分配给进程,剩余 80KB(起始地址 320)仍留在空闲分区表中。​

(二)最佳适应算法​

最佳适应算法从全部空闲分区中找出能满足进程要求且大小最小的空闲分区。该算法将所有空闲分区按容量从小到大的顺序形成一个空闲分区链,以加快查找速度。​

沿用上述例子,对于需要 120KB 内存的进程,最佳适应算法会遍历整个空闲分区链,找到最接近 120KB 且能满足需求的 150KB 分区,分配后剩余 30KB(起始地址 520),并将其留在空闲分区链中合适位置。​

(三)最差适应算法​

最差适应算法,即最大适应算法,从全部空闲分区中找出能满足进程要求且大小最大的空闲分区进行分割和分配。该算法查找效率高,但会使剩余空闲分区变得更小,可能导致后续无法满足较小进程的需求。​

在同样的空闲分区情况下,对于 120KB 的进程请求,最差适应算法会选择 300KB 的分区,分配后剩余 180KB(起始地址 670)。​

(四)邻近适应算法​

邻近适应算法是首次适应算法的变体,它从上次找到的空闲分区的下一个空闲分区开始查找,直到找到能满足要求的空闲分区,再按首次适应算法的方式分配。​

例如,上次分配使用了 200KB 的分区,此时又有新进程需要 100KB 内存,邻近适应算法会从起始地址 400 的 150KB 分区开始查找,满足需求后进行分配。​

三、分页存储管理​

分页存储管理将进程的逻辑地址空间划分为若干大小相等的页,内存的物理地址空间也划分为与页大小相等的块。进程的每页可离散存储在内存不同块中,通过页表实现逻辑地址到物理地址的映射。​

假设页大小为 4KB,进程的逻辑地址为 12345,计算其页号和页内偏移量:页号 = 12345 / 4096 = 3,页内偏移量 = 12345 % 4096 = 2057。通过页表查到页号 3 对应的物理块号为 5,则物理地址 = 5 * 4096 + 2057 = 22537。​

四、分段存储管理​

分段存储管理把程序按逻辑结构划分为若干段,如代码段、数据段、堆栈段等,每个段有自己的段名且长度可变。内存分配以段为单位,段在内存中连续但段间可不连续,通过段表实现逻辑段到物理地址的映射。​

例如,一个程序包含代码段(1000 字节)、数据段(2000 字节)和堆栈段(1500 字节)。操作系统为代码段分配起始地址为 1000 的内存空间,数据段分配起始地址为 3000 的空间,堆栈段分配起始地址为 5000 的空间。程序访问数据段中偏移量为 500 的地址时,通过段表找到数据段起始地址 3000,实际物理地址 = 3000 + 500 = 3500。​

五、段页式存储管理​

段页式存储管理结合了分段和分页的优点。先将程序按逻辑结构分段,再将每个段分页,内存也划分为页框,通过段表和页表实现地址映射。​

假设一个程序分为代码段和数据段,段大小为 8KB,页大小为 1KB。代码段有 3 页,数据段有 5 页。当程序访问数据段中某逻辑地址时,先通过段表找到数据段对应的页表起始地址,再根据页号在页表中找到物理块号,最后结合页内偏移量得到物理地址。​

六、页面置换算法​

(一)最佳置换算法(OPT)​

最佳置换算法选择未来最长时间内不会被访问的页面进行置换,是一种理想算法,用于衡量其他算法性能。​

例如,进程依次访问页面序列 1、2、3、4、2、1、5、6、2、1、2、3、7、6、3,假设分配 3 个物理块。初始时,1、2、3 进入内存,当访问 4 时,由于未来 1、2、3 中,3 在最远的将来才会被访问,所以置换 3。该算法虽无法实际实现,但能为评估其他算法提供参考标准。​

(二)先进先出置换算法(FIFO)​

先进先出置换算法选择最先进入内存的页面进行置换。​

对于上述页面访问序列,初始 1、2、3 进入内存,访问 4 时,1 是最先进入的,置换 1;访问 2 时,2 已在内存;访问 1 时,2 是最先进入的,置换 2,依此类推。该算法简单但可能出现 Belady 现象,即物理块数增加时缺页率反而升高。​

(三)最近最久未使用置换算法(LRU)​

最近最久未使用置换算法选择最近一段时间内最久未被访问的页面进行置换。​

仍以上述页面序列为例,初始 1、2、3 进入内存,访问 4 时,1 是最久未使用的,置换 1;访问 2 时,2 被使用,访问 1 时,3 是最久未使用的,置换 3。​

(四)时钟置换算法(CLOCK)​

时钟置换算法为每个页面设置访问位,将页面组织成环形链表。当需要置换页面时,从当前指针位置开始扫描,寻找访问位为 0 的页面,若找到的页面访问位为 1,则将其清 0 后继续扫描。​

假设内存中有 4 个页面,初始访问位都为 1,指针指向第一个页面。当需要置换页面时,扫描到第一个页面,访问位为 1,清 0 后继续扫描,直到找到访问位为 0 的页面进行置换。

相关文章:

  • RR(Repeatable Read)级别如何防止幻读
  • 健康养生指南:科学守护身心
  • go实现循环链表
  • 位图的实现和拓展
  • Dubbo(94)如何在金融系统中应用Dubbo?
  • 【翻译、转载】使用 LLM 构建 MCP
  • 健康生活,从点滴养生开始
  • mysql-内置函数,复合查询和内外连接
  • 【React Hooks原理 - useCallback、useMemo】
  • 多语言笔记系列:Polyglot Notebooks 混合使用多语言并共享变量
  • 复刻低成本机械臂 SO-ARM100 标定篇
  • Vue常用优化
  • jeecg查询指定时间
  • 系统架构设计师:设计模式——行为设计模式
  • 【Touching China】2007-2011
  • WordPress不支持中文TAG标签出现404的解决方法
  • ES6入门---第三单元 模块三:async、await
  • LeetCode每日一题5.4
  • C++多态(上)
  • Java面试大纲(以及常见面试问答)
  • 光明日报头版评论:让投身西部成为青春潮流
  • 一金两银一铜!中国田径从柯桥望向世界大赛
  • 德国斯图加特发生车辆冲撞人群事件,至少三人受伤
  • 乘客被困停滞车厢超4小时,哈尔滨铁路局客服:列车晚点,表示歉意
  • 看纪录片抵学分,贺桂梅:纪录片是对抗低质碎片信息的好媒介
  • 证监会副主席王建军被查