专栏首页EdisonTalk操作系统核心原理-5.内存管理(下):段式内存管理

操作系统核心原理-5.内存管理(下):段式内存管理

一、分页系统的缺点

  分页系统存在的一个无法容忍,同时也是分页系统无法解决的一个缺点就是:一个进程只能占有一个虚拟地址空间。在此种限制下,一个程序的大小至多只能和虚拟空间一样大,其所有内容都必须从这个共同的虚拟空间内分配。

二、分段管理系统

2.1 何为分段管理

  分段管理就是将一个程序按照逻辑单元分成多个程序段,每一个段使用自己单独的虚拟地址空间。例如,对于编译器来说,我们可以给其5个段,占用5个虚拟地址空间,如下图所示:

  如此,一个段占用一个虚拟地址空间,不会发生空间增长时碰撞到另一个段的问题,从而避免因空间不够而造成编译失败的情况。如果某个数据结构对空间的需求超过整个虚拟之地所能够提供的空间,则编译仍将失败。不过出现这种可能的概率恐怕不会比太阳从西边出来的概率高出多少。

2.2 分段管理优缺点

  优点:

  (1)每个逻辑单元可单独占用一个虚拟地址空间,这样使得编写程序的空间大为增长。

  (2)由于段式按逻辑关系划分,因此共享起来十分方便。

  (3)对于空间稀疏的程序来说,分段管理将节省大量的空间。

  缺点:

  (1)外部碎片和一个段必须全部加载到内存。

  那么,解决办法是什么呢?分页,不过这次的分页不是前面提到的直接对程序进程进行分页,而是对程序里面的段进行分页,于是就形成了所谓的段页式内存管理模式。

三、段页式内存管理

3.1 何为段页式内存管理

  段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。这样做的目的就是想同时获得分段和分页的好处,但又避免了单独分段或单独分页的缺陷。

  如果我们将每个段看做一个单独的程序,则逻辑分段就相当于同时加载多个程序。

3.2 段页式内存管理的实现

  采用多级页表,顶级为段表,次级为页表。由段号在段表里面获得所应该使用的页表,然后在该页表里面查找物理页面号,如下图所示:

  如果需要,次级页表又可以再分为两个或者多个层次,形成层次更为丰富的段页式层次结构。

四、内存管理的演变

  (1)一开始,人们根据直觉,将一个程序作为一整段进行管理,从而形成了纯粹分段(固定加载地址、固定分区、非固定分区、交换)管理模式,也称为基本内存管理模式,这种模式由于直观易实现,曾经大为流行。

  (2)但是,纯粹分段存在重大缺陷(由于此种模式下一个程序只有一段,从而导致内存空间增长困难,外部碎片、程序不能超过物理内存容量、一个程序必须同时加载到内存才能执行等缺点),为了克服这些缺点,引入了页式内存管理模式。

  (3)显然,页式内存管理克服了纯粹分段的一系列缺点,但又存在共享不方便、一个程序只能在一个徐地址空间增长的问题,为了解决这个问题,引入了逻辑分段。逻辑分段将一个程序按逻辑关系分解为多个段,从而扩大了程序可以使用的虚拟地址空间并解决了共享难的问题。

  (4)但是,逻辑分段终究还是分段,自然又引入了分段的缺点。而要客服这些缺点,自然又想到了分页。这样,人们又引入了段页式管理模式。

  因此,内存管理模式经历了从纯粹分段到分页,再到逻辑分段,再到段内分页的演变过程,如下图所示:

参考资料

邹恒明,《操作系统之哲学原理》,机械工业出版社

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式的征途—5.原型(Prototype)模式

    相信大多数的人都看过《西游记》,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉。孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式...

    Edison Zhou
  • .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码...

    Edison Zhou
  • .NET基础拾遗(1)类型语法基础和内存管理基础

    在.NET中所有的内建类型都继承自System.Object类型。在C#中,不需要显示地定义类型继承自System.Object,编译器将自动地自动地为类型添...

    Edison Zhou
  • [NewLife.XCode]数据初始化

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • Leetcode 100 Same Tree

    Given two binary trees, write a function to check if they are equal or not. Tw...

    triplebee
  • bootstrap treeview实现target功能,iframe中打开页面

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

    hotqin888
  • WOX 糙快猛的实现方法

    昨天同事向我解释糙快猛的工作方式,深有触动,特此致谢。糙快猛的定义:糙是指方法粗糙,甚至比较low,快是指迅速解决问题,猛是指解决问题比较利落。以目标为导向,手...

    邓飞
  • 几种常见的判别分析分类方法在R中实现

    判别分析(Discriminant analysis)用于基于一个或多个预测变量来预测对象属于某个给定类的概率,它对于连续或分类预测变量均适用。与logisti...

    用户7585161
  • 前端知识点总结——ReactNative

    3、TouchableOpacity 将需要添加上点按,透明度渐变效果的组件放在TouchableOpacity中

    前端博客 : alili.tech
  • python中值传递还是引用传递?

    首先,Python中一切事物皆对象,变量是对对象在内存中的存储和地址的抽象。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉...

    黑白格

扫码关注云+社区

领取腾讯云代金券