热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【操作系统】3.2内存管理(操作系统负责内存空间的分配与回收②)

操作系统负责内存空间的分配与回收基本分段存储管理1.什么是分段(类比分页)2.什么是段表(类比页表)3.如何实现地址转换4.


操作系统负责内存空间的分配与回收

    • 基本分段存储管理
      • 1. 什么是分段(类比分页)
      • 2. 什么是段表(类比页表)
      • 3. 如何实现地址转换
      • 4. 分段、分页管理的比较
    • 段页式管理方式
      • 1. 分页、分段管理方式中最大的优缺点
      • 2. 分段+分页的结合——段页式管理方式
      • 3. 段表、页表
      • 4. 段页式如何实现地址变换


基本分段存储管理


1. 什么是分段(类比分页)


  • 进程的地址空间:按照程序的自身逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从开始编址
  • 内存分配规则:以段为单位进行分配,① 每个段在内存中占连续空间,但② 各个段之间可以不相邻
  • 由于是按逻辑功能模块划分,用户编程更加方便,程序的可读性更高
  • 编译程序会将段名转换成段号,CPU是根据段号区分段的
    在这里插入图片描述
  • 分段系统的逻辑地址结构:
    1. 段号的位数决定了每个进程最多可以分成几个段
    2. 段内地址位数决定了每个段的最大地址长度
      在这里插入图片描述

2. 什么是段表(类比页表)


  • 程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各逻辑段的存放位置,为此,需要为每一个进程建立一张映射表,简称“段表”
    在这里插入图片描述

  1. ⭐每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称“基址”)和段的长度
  2. 确定段表项的长度:
    1. 各个段表项的长度时相同的。例如:某系统按字节寻址,采用分段存储管理,逻辑地址结构为(段号16位,段内地址16位),因此,① 采用16位即可以表示最大段长(由最大段内偏移量决定)。② 物理地址内存大小位4GB(可以用32位表示整个物理内存地址空间)
    2. 故可以让每个段表项占16+32=48位,即6B
  3. 由于段表项的长度相同,所以可以隐藏段号,不占存储空间:若段表存放的起始地址位M,则K号段表项的存放地址位 M + K * 6

3. 如何实现地址转换


  1. 根据逻辑地址得到段号S、段内地址W
  2. 判断段号是否越界,若S≥M,则产生越界中断,否则继续执行(注:段表长度(段表项个数)至少是1,段号从0开始)
  3. 查询段表,找到对应的段表项,段表项的存放地址为F+S* 段表项长度
  4. 检查段内地址是否超过了段长C,若W≥C,则产生越界中断,否则继续执行(与页式存储的区别之处:因为段式存储中每个段长度不同,需要检查)
  5. 计算得到物理地址
  6. 访问目标内存单元
    在这里插入图片描述

4. 分段、分页管理的比较


    1. 信息的物理单位,分页的主要目的是为了实现离散分配,提高内存利用率
    2. 分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的
    3. 页的大小式固定的,且由系统决定
    1. 是信息的逻辑单位,分段的主要目的是为了更好的满足用户的需求。一个段通常包含着一组属于一个逻辑模块的信息
    2. 分段对用户是可见的,用户编程时需要显式地给出段名
    3. 段的长度不固定,决定于用户编程写的程序
  1. 分页的用户进程的地址空间时 一维 的,程序员只需要给出一个记忆符即可表示一个地址
  2. 分段的用户进程的地址空间时 二维 的,程序员在标识一个地址时,既要给出段名,也要给出段内地址

    ⭐理解:
    1. 分页中,每个页面的大小是相同的。故如果页面大小为在给出一个逻辑地址 2049后,算出页号:2049/1k=2,则可算出该逻辑地址在2号页,算出页内偏移量:2049%1k=1,故得出页内偏移量为1,与页号结合便可得到相应的物理地址
    2. 而分段中,每个段是根据逻辑模块划分的,即每段的大小不可能是相同的,所以单单给出一个逻辑地址不能得到段号和段内偏移量。故可以理解为,需要提供段号和段内偏移量两个逻辑地址
    在这里插入图片描述

  3. 分段比分页更容易实现信息的共享和保护
    1. 不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中很多变量,各进程并发地同时访问可能造成数据的不一致)
    2. 如下图中的绿色代码段,只是简单的输出,则只需要让各进程的段表项指向同一个段即可实现共享
    3. 而分页中,同一个功能可能和其他功能的代码放在同一个页面中,这样如果将页面全部共享,则页面中其他不可以共享的代码也会变成共享,这样是不允许的(页面不是按逻辑模块划分的,页面中可能只有一部分是允许共享的,故实现共享很困难)
      在这里插入图片描述
  4. 访问一个逻辑地址需要几次访存?
    1. 分页(单级页表):第一次访存——查询内存的页表,第二次访存——访问目标内存单元。总共两次访存
    2. 分段:第一次访存——查内存中的段表,第二次访存——访问目标内存单元。总共两次访存
    3. 分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样可以少一次访问,加快地址变换速度

段页式管理方式


1. 分页、分段管理方式中最大的优缺点


  1. 分页管理:
    1. 优点: 内存空间利用率高,不会产生外部碎片,只会有少量的页内部碎片
    2. 缺点:不方便按照逻辑模块实现信息的共享和保护
  2. 分段管理:
    1. 优点:很方便按照逻辑模块实现信息的共享和保护
    2. 缺点:如果段长过大,为其分配很大的连续空间会很不方便。另外,段式管理会产生外部碎片(分段管理中产生的外部碎片也是可以用“紧凑”技术来解决,只是需要付出较大的时间代价)

2. 分段+分页的结合——段页式管理方式


  • 将进程按逻辑模块分段,再将各段分页(如每个页面4KB),再将内存空间分为大小相同的内存块(页框、页帧、物理快),进程将各页面分别装入各内存块中
    在这里插入图片描述
  • 分段系统的逻辑结构地址由段号和段内地(段内偏移量)址组成。如:
    在这里插入图片描述
  • 段页式系统的逻辑地址由段号、页号、页内地址(页内偏移量)组成。如:
    在这里插入图片描述
    1. 段号的位数决定了每个进程最多可以分几个段
    2. 页号位数决定了每个段最大有几个页
    3. 页内偏移量决定了页面大小、内存块的大小

    在上述例子中,系统是按字节寻址的,则
    段号占16位,因此该系统中,每个进程最多有216 = 64 K个段
    页号占4位,因此该系统中,每个段最多有24 = 16页
    页内偏移量占12位,因此每个页面(内存块)大小为212 = 4096 = 4 KB

  • 注意:“分段”对用户是可见的,程序员编程时需要显示地给出段号、段内地址。而将各段“分页”对用户时不可见的。系统会根据段内地址自动划分页号和页内偏移量。因此,段页式管理的地址结构是二维的

3. 段表、页表


  • 每段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(用来计算页表存放起始地址)组成,每个段表项长度相同,段号是隐含的
  • 每个页面对应一个页表项,每个页表项由页号、页面存放块号组成。每个页表项长度相同,页号是隐含的

如果要读取0号段

  1. 首先在段表中查到0号段的页表在1号块中存放
  2. 将2号块中的页表读出来
  3. 在该页表中查到0号段的两个页面在k号块、n号块中存放
  4. 故访问这两个内存块读取数据
  5. 总结:
    1. 一个进程只会对应一个段表
    2. 每个段会对应一个页表
    3. 故一个进程会对应多个页表
      在这里插入图片描述


4. 段页式如何实现地址变换


  • 地址转换过程:
    1. 根据逻辑地址得到段号、页号、页内偏移量
    2. 比较段号与段表长度,判断段号是否越界中断,否则继续执行
    3. 查询段表,找到对应的段表项,段表项的存放地址为段表起始地址+段号 * 段表长度
    4. ⭐从段表项中得到该段号对应的页表长度、页表存放的块号,比较页号与页表长度,判断页号是否越界中断,否则继续执行
    5. 根据页表存放块号、页号,查询页表,找到对应的页表项
    6. 根据内存块号、页内偏移量得到最终的物理地址
    7. 访问目标内存单元 在这里插入图片描述
  • 段页式管理二级页表一样需要三次内存访问
  • 也可以引入快表机构,用段号和页号作为查询快表的关键字。若快表命中,则仅需要一次访问内存

推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
mobiledu2502913921
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有