您的位置:首页 > 新闻 > 资讯 > 如何个人创建微信公众号_济南网红隧道_百度手机助手下载安卓版_广州网站优化工具

如何个人创建微信公众号_济南网红隧道_百度手机助手下载安卓版_广州网站优化工具

2025/3/14 10:18:39 来源:https://blog.csdn.net/m0_46224993/article/details/146098524  浏览:    关键词:如何个人创建微信公众号_济南网红隧道_百度手机助手下载安卓版_广州网站优化工具
如何个人创建微信公众号_济南网红隧道_百度手机助手下载安卓版_广州网站优化工具

【从零开始学习计算机科学】操作系统(六)内存管理

    • 内存管理
      • 连续内存管理
        • 单一连续分配
        • 固定分区分配
        • 动态分区分配
      • 分页式内存管理
      • 分段式内存管理
      • 段页式内存管理
      • 内存管理中的安全性问题
      • 虚拟存储器

内存管理

我们目前通常使用的是分级存储系统,即将存储器系统分为寄存器-多级缓存-内存-外存的结构。内存管理属于存储器管理的一部分。

内存(Memory)也被称为内存储器或主存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。内存以字节为存储单位,内存地址空间(也称为物理地址空间)是指对内存编码的范围。所谓编码就是对每一个物理存储单元(一个字节)分配一个号码,通常叫作“物理地址”或“内存地址”。分配一个号码给一个存储单元的目的是为了便于找到它,完成数据的读写,这就是所谓的“寻址”。

在编译器生成机器指令时,系统并不知道该程序的数据会放到什么位置,因此,编译器生成的指令中的地址是虚拟地址,使用虚拟地址的好处是便于程序的开发和运行,使其独立于具体的物理环境。因此,在操作系统中的内存管理中,我们需要一种机制实现虚拟地址到物理地址的变换,即地址重定位。地址重定位指把目标程序中的逻辑地址转换成主存空间的物理地址。

地址重定位可以分为动态地址重定位与静态地址重定位两种方式。

  1. 静态地址重定位:静态地址重定位是在程序执行之前,由装配程序完成的地址映射工作。静态地址重定位的优点是不需要硬件支持,但是缺点是必须占有连续的内存空间,这就难以做到数据和程序的共享。

  2. 动态地址重定位:程序在内存中如果发生移动,就需要采用动态的重定位方式。编译、链接后的装入模块的地址都是从“0”开始的。这种方式需要一个重定位寄存器的支持。

源程序经过编译后,可得到一组目标模块,目标模块在运行之前还需要进行连接操作,即利用链接程序将这组目标模块链接,形成装入模块。程序的连接有以下三种方式。

  1. 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。
  2. 装入时动态链接:将源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
  3. 运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接。其优点是便于修改和更新,便于实现对目标模块的共享。通常被链接的共享代码称为动态链接库(DLL)或共享库(shared library)。

由于内存大小的限制,当一个程序需要的内存空间大于当前内存容量时,若没有一种技术解决此类问题,可能会导致这个程序无法运行。以下介绍几种用于解决内存容量不足问题的技术。

  1. 内存覆盖
    覆盖的基本思想是可以把程序划分为若干个功能上相对独立的程序段,如果内存空间有限,无法容纳程序的全部代码,此时可以把部分程序段先调入内存,首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要使用这些外存中的段时,系统再将其调入覆盖区,替换覆盖区中原有的段。

  2. 内存交换
    交换的基本思想是把处于等待状态(或在CPU调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这一过程叫做“换出”;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为“换入”。

连续内存管理

连续内存管理将内存看成一个连续的空间。程序在申请内存空间时会通过一定的分配方案将连续内存空间中的一部分连续的空间分配给程序。连续内存管理的分配方案主要有以下三种实现模式。

单一连续分配

采用这种管理方案时,内存被分成两个区域,一个是系统区域,仅供操作系统使用,可以驻留在内存的低地址部分,也可以驻留在高地址部分(通常设置在内存的低端);另一个是用户区,它是除系统区以外的全部内存区域,这部分区域是提供给用户程序使用的区域,任何时刻主存储器中最多只有一个进程。所以,单一连续区存储管理只适用于单道程序系统。显然,单一连续分配方式早已经不能满足现代操作系统的需求,如果要支持多道程序系统,则必须要对该管理方法做出相应的改进,分区存储管理就是改进之后的连续内存分配方法。

固定分区分配

固定式分区是在处理作业之前存储器就已经被划分成若干个分区,每个分区的大小可以相同,也可以不同。但是,一旦划分好分区后,主存储器中的分区的个数就固定了,且每个分区的大小固定不变。

  • 当分区大小相同时,称为固定大小的分区方案。固定大小的分区方案将内存分成大小相等的若干分区供进程使用,为了方便管理,系统会使用一张分区表来记录每个分区的使用情况。当用户程序装入内存时,通过查询分区表,从中找出一个满足要求的分区、尚未分配的分区,然后分配给程序,并修改分区表状态。
  • 当分区大小不同时,称为大小不等的分区方案。为了便于管理,此方案通常将分区按大小排序,然后建立一张有序的分区表。当用户程序装入内存时,通过查询分区表,从中找出一个满足要求的分区、尚未分配的分区,然后分配给程序,并修改分区表状态。

固定分区管理方式存在两个问题:1,程序可能太大而放不进任何一个分区中。2,会产生内部碎片。

内部碎片是指处于操作系统分配的用于装载某一进程的内存区域内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。与之相对,外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

动态分区分配

动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在程序装入内存时,根据所需的大小动态地建立分区,并使分区的大小正好适合进程的需要。

动态分区的分配方案中没有内部碎片,但是会产生外部碎片。外部碎片问题的解决方法可以考虑这样一些措施:

  1. 规定分割空闲区的下限值。分割空闲区时,若剩余部分小于下限值,则此空闲区不进行分割,而是全部分配给用户进程。
  2. 内存拼接技术。将所有空闲区集中构成一个大的空闲区。拼接的时机一般在释放区回收的时候或者系统找不到足够大的空闲区的时候;或者定期进行拼接,但是拼接操作会消耗大量的系统资源。
  3. 解除程序占用连续内存才能运行的限制(分页和分段就是借鉴了这种思想)把程序分拆为多个部分装入到不同分区,充分利用碎片。

动态分区分配需要一个被称为空闲分区表或空闲区链表的数据结构实现。具体过程是按照算法规则找到分配的空闲分区,然后从该分区中再按照作业的大小划出一块内存空间分给作业,该分区余下的空闲分区当做一个新的空闲分区留在空闲链中。

系统比较常见的分配策略有如下几种:

  1. 首次适应算法:首次适应算法要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中。
  2. 循环首次适应算法:该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足需求的空闲分区,并从中划出一块来分给作业。该算法能使空闲中的内存分区分布得更加均匀,但将会缺乏大的空闲分区。
  3. 最佳适应算法:该算法总是把既能满足需求又是最小的空闲分区分配给作业。为了加速查找,该算法需要将所有的空闲区按其空间大小从小到大进行排序后,当有作业要分配的时候,查找满足其内存需求,同时又是最小的空闲块,然后分配给作业。这样每次找到的第一个满足需求的空闲区,必然是最优的。但该算法容易由于每次是查找到满足作业的最小空闲块,然后从该分区中再按照作业的大小划出一块内存空间分给作业,该分区余下的空闲分区当做一个新的空闲分区留在空闲链中,由于在没分配前该分区(满足作业的最小空闲块)大小一般不会超过该作业太多,就容易会出现在存储器中将留下许多难以利用的小空闲区,同时每次分配后必须重新排序,这也带来了一定的开销。
  4. 最差适应算法:最差适应算法中,该算法需要将所有的空闲区按其大小从大到小进行排序,分配时直接从空闲区链的第一个空闲分区中分配(不能满足需要则不分配)。非常显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。这种分配方法初看起来不太合理,但他也有非常强的直观吸引力:在大空闲区中放入程式后,剩下的空闲区常常也非常大,于是还能装下一个较大的新程序。

分页式内存管理

分页存储管理的基本思想是将进程的逻辑地址空间分成若干个大小相等的页面(虚页),并为各页加以编号。相应地,也把内存的物理地址空间分成若干个页帧(页框),同样也为他们加以编号。在为进程分配内存空间时,将进程中的若干个虚页分别装入到多个不相邻的页帧中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。

在分页系统中的页面其大小应适中。页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择适中,且页面大小应是2的幂,通常为512B~8KB。

在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页(0~n),依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号,见右图的中间部分。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。

分页地址中的地址结构如下:对于某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按如下所示公式求得:P = INT [ A / L ],d = [ A ] mod L。其中,INT是整除函数,MOD是取余函数。例如,其系统的页面大小为1 KB,设A = 2170 B,则由上式可以求得P = 2,d = 122。

在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页(0~n),依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号,见右图的中间部分。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。

分页式内存管理需要专门的地址转换机制。

  1. 基本的地址变换机构

页表的功能可以由一组专门的寄存器来实现。一个页表项用一个寄存器。由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度;但由于寄存器成本较高,且大多数现代计算机的页表又可能很大,使页表项的总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。在系统中只设置一个页表寄存器PTR(Page-Table Register),在其中存放页表在内存的始址和页表的长度。平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。

当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。

  1. 具有快表的地址变换机构

由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。

为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的特殊高速缓冲寄存器,又称为“联想寄存器”(Associative Memory),或称为“快表”,在IBM系统中又取名为TLB(Translation Lookaside Buffer),用以存放当前访问的那些页表项。此时的地址变换过程是:在CPU给出有效地址后,由地址变换机构自动地将页号P送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如在块表中未找到对应的页表项,则

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com