ch8-内存管理

内存是现代计算机运行的中心,它是由字或字节组成,每个字或字节都有自己的地址。

内存管理背景

基本硬件:

  • 程序必须装入内存才能被执行
  • CPU可以直接访问的存储器只有主存和寄存器
  • 寄存器通常可以在一个(或少于一个)CPU时钟
  • 完成主存访问可能需要多个CPU时钟周期
  • CPU暂停(Stall):在读取内存数据时,CPU空闲。但CPU访问频繁,这种暂停是不能忍受的。
  • 解决办法:在内存和CPU之间,增加高速内存,来协调速度差异。这种内存缓冲区称为高速缓存Cache 。
  • 内存保护需要保证正确的操作。
  • 内存保护保证操作系统内核不被用户程序访问以及进程间不相互干扰。这种保护可通过硬件来实现。
  • 内存管理的目的:提高内存利用率,提高指令执行速度,保证指令安全运行
  • 内存管理的功能:内存分配,内存回收,地址转换,存储保护,内存共享

内存保护

  • 首先需要保证每个进程都有独立运行的内存空间,即确定进程可访问的合法地址范围并确保进程只访问其合法地址。
  • 基址寄存器(Base):保存进程最小的合法物理内存地址
  • 界限寄存器(Limit):保存进程地址的长度
  • 设置好合法地址后,CPU在执行指令时,需要进行地址合法性验证
  • 对内存保护的实现,是通过CPU硬件对用户模式所产生的每一个地址与寄存器的地址进行比较。合法的地址应该是大于等于基址寄存器的值,小于基址与界限寄存器的值之和。
    在这里插入图片描述
  • 这种方案防止了用户程序(有意或无意地)修改操作系统或其他进程的代码或数据

地址绑定

  • 地址绑定(重定位,地址转换):在指令运行时,把程序中的相对地址转换为内存中的绝对地址的过程
  • 把逻辑地址转换到物理地址的过程。
  • 程序以二进制可执行文件的形式存储在磁盘上,为了执行,程序被调入内存并放在进程空间内。任务进程在执行前需要经过多个步骤,其中有些步骤是可选的。原程序通过编译器或汇编器成为目标模块,目标模块与其他编译好的目标模块通过连接器连接称为加载模块。加载模块和系统库可通过加载器加载到内存。二进制内存镜像与动态链接库一同在内存中运行,这些内存中地址可能会有不同的表现形式。如原程序中的符号地址。不管哪种地址,最终需要将指令与数据绑定到内存地址。
  • 通常可以在三个不同阶段实现地址绑定
  • 编译时期(Compile time):如果在编译时就知道进程在内存中的驻留地址,那么就可以生成绝对代码。如果开始位置改变,需要重新编译代码。此时绑定空间效率比较差,常用于嵌入式系统。假设有一个嵌入式内存,分为3块。里面只有3个程序。那这时采用编译时绑定最高效,因为实地址在编译时候绑定一次以后在运行过程中不需要绑定。
  • 加载时期(Load time):将程序从外存加载到内存以后,将指令遍历一遍,把所有地址改过来。如果编译时不知道进程驻留在内存什么位置,则必须生成可重定位代码。这样地址绑定会延迟到加载时进行。
  • 执行时期(Execution time):如果进程执行时可在内存移动,则地址绑定可延迟到运行时。采用这种方案需要特定的硬件对地址映射支持,如基址和界限寄存器。目前大部分通用操作系统采用这种方式。
    在这里插入图片描述
    比较三种方法
  • 编译时绑定的好处:程序不管运行多少次,只要绑定一次就行了
  • 加载时绑定:加载多少次就绑多少次,加载时能加载到任意位置但不能移动
  • 执行时绑定:运行一次绑一次,1万条地址,加载时绑定绑一次,运行时绑定绑1万次。可移动。现代操作系统广泛使用执行时绑定。原因:并没有想象中那么多次的绑定,一个程序里有1万个地址,加载时绑定要绑定1万个地址,但执行时绑定可能只绑定1千个,因为有的地址是用不到的。有了MMU,从逻辑地址到物理地址的转换,不是由软件实现的,而是MMU实现的。

逻辑地址和物理地址

  • 逻辑地址(Logical address):由CPU产生,是进程内的相对地址。也称虚拟地址,相对地址和程序地址。
  • 物理地址(Physical address):内存地址,所有内存都按字或字节统一编址。也称绝对地址,实地址。
  • 编译和加载时的地址绑定生成相同的逻辑地址和物理地址,此时重定位是静态的;但执行时的地址绑定导致不同的逻辑地址和物理地址,此时的重定位称为动态重定位。
  • 由程序所生成的所有逻辑地址的集合称为逻辑地址空间,与这些逻辑地址所对应的所有物理地址的集合称为物理地址空间。逻辑地址空间绑定到物理地址空间这一概念至关重要,是正确进行内存管理的中心。

内存管理单元(MMU)

  • 运行时,从虚拟地址到物理地址的映射是由一个硬件设备来完成的,该硬件称为内存管理单元(简称MMU),它是CPU用来管理内存的控制线路。
    在这里插入图片描述
    重定位寄存器(Relocation register)
  • 在MMU策略中,基址寄存器中的值在其送入内存的时候被加入到由一个用户进程所产生的每个地址中
  • 用户程序所对应到的是逻辑地址,物理地址对它从来都不可见

动态加载

  • 静态加载:程序在运行时已经将程序的所有代码,数据都装到了内存。好处:很方便从一个计算机到另一个计算机转移。
  • 为了获得更好的内存空间使用率,可以使用动态加载(Dynamic Loading)。使用动态加载,一个子程序只有在被调用时才加载
  • 优点:更好的内存空间利用率;没有被使用的例程不被载入;当需大量代码来处理不经常使用的功能时非常有用
  • 不需要操作系统实现,通过程序设计实现。提供子程序库来实现动态加载,如Windows的动态链接库。

动态链接(Dynamic Linking)

  • 和各种库文件的链接被推迟到执行时期
  • 需要动态装载技术支持
  • 存根:一小段代码,用来定位合适的保留在内存中的库程序。当执行存根时,首先检查所需子程序是否在内存中,如不在,就将子程序调入内存,内存用例程地址来替换自己,并开始执行例程。
  • 与动态加载不同,动态链接需要操作系统的支持,操作系统需要检查例程是否在进程的内存空间。

连续内存分配

  • 内存管理的一种常见方法
  • 为一个用户程序分配一个连续的内存空间,这是早期的内存分配方式,运用于内存较少的系统。
  • 三种类型:
  1. 单一连续分配
  2. 固定分区分配
  3. 可变分区分配
  • 主存通常分为两部分:用于驻留操作系统,用于保存用户进程(内存高端)
  • 操作系统既可位于内存低端,也可位于高端。影响这一决定的主要因素是中断向量的位置。由于中断矢量通常保存在内存低端,因此操作系统通常也驻留在内存低端

单一连续分配

  • 单道程序环境下,仅装有一道用户程序,即整个内存的用户空间由该程序独占,这种分配方案称为单一连续分配
  • 单一连续分配:内存分配管理十分简单,内存利用率低。用于单用户,单任务OS。例:CP/M,MS-DOS,RT11。
  • 在实际使用中,该方案并未采用存储器保护措施,这样做可以节省硬件,同时又不影响系统安全

固定分区分配

  • 多道程序环境下,单一连续分配方案不适用了。最早的,也是最简单的一种可运行多道程序的内存管理方式是固定分区分配方案
  • 该方案预先把可分配的主存空间分割成若干个连续区域,每个区域称为一个分区。每个分区的大小可以相同也可以不同。但分区大小固定不变,每个分区装一个且只能装一个程序。因此多道程序的道数受到分区个数的限制。
  • 在内存分配时如果有一个空闲分区,则分配给进程;进程运行结束时,其分区被收回,重新分配给其他进程。
  • 划分分区的两种方法:分区大小一样或不一样
    分区大小一样:缺乏灵活性,程序太小时,浪费内存;程序太大时,又有可能装不下。但在某些场合合适,比如利用一台计算机同时控制多个相同对象时,较合适。
    分区大小不等:可根据需求设置多个小分区,适量中分区,少量大分区。
  • 现在很少使用。
    在这里插入图片描述

可变分区分配

主要用于批处理环境

  • 分区(孔,Hole)是可用的内存块,不同大小的分区分布在整个内存中,当一个进程到来时,它将从一个足够容纳它分区中分配内存。
  • 操作系统包含以下信息:已分配的分区-已分配分区表;空的分区-空闲分区表

在这里插入图片描述

存储分配算法
  • 可变分区分配是动态存储分配问题的一种情况,其存储分配算法主要有首次适应(First-fit),最佳适应(Best-fit),最差适应(worst-fit)
  • 首次适应:分配最先找到的合适的分区。查找从头开始或从上一次查找结束的地方开始。
  • 最佳适应:搜索整个列表,找到适合条件的最小的分区进行分配。为提高查找效率,列表可按分区大小递增排序。
  • 最差适应:搜索整个列表,寻找最大的分区进行分配。为提高查找效率,列表可按分区大小递减排序。
    在这里插入图片描述
  • 在速度和存储空间的利用上,首次适应法和最佳适应法要好于最差适应法。首次适应法和最佳适应法在空间利用上差不多,但首次适应法更快些。

内存回收

  • 可变分区分配方案的内存回收存在4种情况,需要分别考虑。
    a.回收内存块前后无空闲块(直接将回收区变为新的空闲区)
    b.回收内存块前有后无空闲块(则空闲块f1与回收区合并成一个空闲块,维持该空闲块的起始地址为f1的地址,大小为两者之和)
    c.回收内存块前无后有空闲块(则回收区与空闲块合并为一个空闲块,起始地址为回收区的地址,大小为两者之和)
    d.回收内存块前后均有空闲块(则回收区与空闲区f1,f2合并成一个空闲块,起始地址为f1的地址,大小为三者之和)

碎片

  • 随着进程频繁的装入和移出内存,空闲内存空间中可能被分成小的片段。
  • 外碎片:整个可用内存空间可以用来满足一个请求,但它不是连续的。首次适应法和最佳适应法都有这个问题。这个问题可能很严重,最坏情况下,每两个进程之间都有空闲块被浪费。–不连续的系统拥有的小空间(可变分区,分段)
  • 内碎片:分配的内存可能比申请的内存大一点,这两者之间的差别是在分区内部,但又不被使用。
  • 通过紧缩(compaction)来减少外碎片。移动内存内容,以便把一些小的空闲内存结合成一个大的块。紧缩只有在重定位是动态的时候,才有可能在执行时期进行。即使能使用紧缩,也要评估其开销。
  • 最简单的合并算法是简单的将所有进程移动到内存的一端。而所有空闲分区移到另一端,这一种方法的开销大,所以为减少开销,应选择移动内容最小的一种。
  • 另一种可能解决外碎片问题的方法是允许物理地址空间为非连续,也就是接下来要讲的分页和分段。

分页内存管理

解决外碎皮的方案:允许物理地址空间非连续
非连续即离散式的内存管理方式:
分页内存管理方案(现代操作系统常用方案)
分段内存管理方案
段页式内存管理方案

分页

  • 内存管理方案允许进程的物理地址空间可能不连续。即只要有可用的物理内存,就可以分配给进程。
  • 基本方法:
    将物理内存分成大小固定的块,称为(frame),也可以简单称为内存块;
    帧:又称为页框;
    把逻辑内存也分为同样大小的块,称为页(Page)。

    帧和页的大小是由硬件来决定的,通常为2的幂,根据计算机结构的不同,大小不同。早期为512字节至8K字节,现在为4K-64K。
  • 系统将建立一张页表,记录页与帧之间的映射关系。进程运行时,通过查找页表,实现逻辑地址转换为物理地址。
  • 系统保留所有空闲帧的记录; 运行一个有N页大小程序,需要找到N个空帧来装入程序
  • 分页是由硬件来处理的。然而,最新的设计是通过将硬件和操作系统相配合来实现的(尤其是在64位的微处理器上)。
  • 采用分页技术不会产生外碎片,因为每个帧都可以分配给进程;但分页有内碎片,进程请求的内存可能不是页的整数倍,因此最后一帧可能存在多余的内存空间。

地址转换机制

  • 在分页内存管理中,逻辑地址被分为两部分
  • 页号p:它包含每个页在逻辑内存中的基址,用来作为页表的索引
  • 页偏移(d)同基址相结合。用来确定送入内存设备的物理内存地址
    在这里插入图片描述
    逻辑地址的高m-n位是页号,而低n位表示偏移。该逻辑地址为线性地址(linear address)。
    在这里插入图片描述
    根据逻辑地址的页号p检索页表,找到该页在物理地址中的帧号f,最后将f和页偏移d结合,形成物理地址。

空闲帧的分配

  • 操作系统通过一个数据结构来管理物理内存中的空闲帧,这个结构称为空闲帧表,保存系统中所有的空闲帧。
  • 空闲帧的分配:当进程需要n页,如果系统有至少n帧,那么就分配给新进程。进程的每一页装入一个帧中,帧号放入进程的页表中。

页表的实现

  • 页表的硬件实现:当页表比较小时,可放入专用寄存器。然而大量当代计算机都允许页表非常大,因此需将页表保存在主存中,并将页表基址寄存器(PTBR)指向页表,页表限长寄存器(PRLR)表明页表的长度
  • 每一次的数据,指令存取都需要两次内存访问,一次是访问页表,一次是访问数据或指令。内存访问速度慢
  • 解决方案:采用小但专用且快速的硬件缓冲,这种缓冲称为转换表缓冲器(TLB)或联想寄存器或快表
    TLB/联想寄存器的条目由两部分组成:键和值,实现并行查找。这种查找方式比较快,但硬件也比较昂贵。所以通常TLB的条目数并不多,通常在64-1024之间。
    使用TLB的分页硬件:当CPU产生逻辑地址后,其页号提交给TLB,如果在联想寄存器中找到页号,称TLB命中,得到帧号,并可用来访问内存。如果页号不在TLB中,称为TLB失效,需要访问内存中的页表得到帧号,同时将页号和帧号增加到TLB中。
    在这里插入图片描述

有效访问时间

  • 页号在TLB中被查找到的百分比称为命中率,这个比率与TLB的大小有关。
    有效访问时间(EAT):根据概率对每种情况进行加权得到,类似于平均访问时间。
  • 假设查找联想寄存器需要时间为a,内存一次存取时间为b,命中率为 λ \lambda λ,则有效访问时间为:
    E A T = λ ( a + b ) + ( 1 − λ ) ( a + 2 b ) EAT=\lambda(a+b)+(1-\lambda)(a+2b) EAT=λ(a+b)+(1λ)(a+2b)
  • 优点:可以共享公共代码,如果代码是可重入代码(或称为纯代码,只读),则可以在进程间共享。如文本编辑器,编译器,数据库系统等。
  • 每个进程单独保留一个代码和数据的副本,还可以有自己的私有代码和数据,存有这些数据的页能够出现在逻辑空间的任意位置。

内存保护的方法

  • 简单方法:把页号和页表限长寄存器(PRLR)相比较;
  • 细致方法:通过与每个帧相关联的保护位来实现。
    通常这些页保存在页表中。如,可用一个位来定义一个页是否只读,读写,只执行等。还有一个位与页表中的每一个条目相关联,称为有效-无效位。
    有效:相关的页在进程的逻辑地址空间,并且是一个合法的页。
    无效:表示页不在进程的逻辑地址空间内。

页共享

  • 共享代码
    如果代码是可重入代码(只读),可以在进程间共享 (如文本编辑器, 编译器, 数据库系统)
    共享代码必须出现在所有进程的逻辑地址空间的相同位置
  • 私有代码和数据
    每个进程保留一个代码和数据副本
    存有私有数据和代码的页能够出现在逻辑地址空间的任意位置

页表结构

  • 例子:
    32位逻辑地址、页大小4KB
    一个页表最多可包含1百万个表项(232/212)
    每个页表项4个字节,需4MB空间放页表,1024个连续页面
    需要这么多个连续页面来存放页表不一定能实现

  • 解决方法:层次页表、哈希页表、反向页表

层次页表

将页表划分为更小的部分。
两级页表就是将页表再分页。页表中每一项都指向下一级页表的所在位置,第二季页表指向的才是页在内存中的存放位置。

二级分页机制

在这里插入图片描述
例:4KB页大小的32位系统
一个逻辑地址被分为:12位的页偏移和20位的页号;
页表所在页被分页,页号为:10位的页号和10位的页偏移
在这里插入图片描述
p1为外页表的索引,p2为外页表的页偏移。

  • 一个两级32位分页结构的地址转换机制
    在这里插入图片描述
    首先根据p1查找外页表,找到页表所在的位置块,然后以p2为索引,查找页表,找到也所在块号,最后根据页偏移定位物理地址。
三级分页机制

设系统的页大小为4KB( 2 12 2^{12} 212),页表可由 2 52 2^{52} 252个表项组成。
若使用两级分页方案,内部页表p2用10位表示,即 2 10 2^{10} 210个项,可用一页表示,外部页表有 2 42 2^{42} 242项。
在这里插入图片描述
为了减小页表,将外页表进一步切分,得到三级分页。
在这里插入图片描述

哈希页表

  • 通常地址空间 > 32 位
  • 虚拟页号被散列到一个页表中。这种页表的每一个条目都包括一个链表元素,这些元素哈希成同一个位置。
  • 每个元素有3个域:虚拟页号;所映射的帧号;指向链表中下一个元素的指针。
    在这里插入图片描述

如图,虚拟地址中的虚拟页号通过哈希函数的转换到哈希表中,虚拟页号与链表中的每一个元素的第一个域相比较,如果匹配,取出相应的物理帧号,用来形成物理地址。如果不匹配,则继续比较。
每个进程都有一个页表,该进程所用的每一页在页表中都有一项。

  • 缺点:每个页表可能由多个表项,这些表可能占用大量的物理内存。

反向页表

  • 反向页表(inverted page table):对于每个真正的内存页或帧才有一个条目。每个条目保存在真正内存位置的页的虚拟地址,以及包括拥有这个页的进程的信息。因此,每个系统只有一张页表。对每个物理地址的页也只有一条对应的条目。因为系统只有一个页表,而又有多个物理空间映射成物理地址,所以反向页表的条目中需要一个地址空间标识符,以确保一个特定进程的一个逻辑页可以映射到相应的物理帧。
    在这里插入图片描述
    IBM RT系统采用了反向页表机制:
    三元组:<进程id,页号,页偏移>
    反向页表的条目:<进程id,页号>
    进程id为地址空间标识符
    当需要进程引用时,由<进程id,页号>组成的虚拟地址送交到内存子系统,通过查找反向页表来寻找匹配项。
    如果匹配找到,取出这个条目的表项号i,即为内存帧号,与页偏移结合得到物理地址。
  • 减少了需要存储某个页表的内存空间,但是当访问一个页时,增加了寻找页表的时间。由于反向页表按物理地址排序,而查找是根据虚拟地址,因此需要查找整张表来寻求匹配。这样查找会需要很长时间,为解决这个问题,需要借用前面的哈希页表来将查找范围限制到一个或几个页表条目
    使用反向页表的系统在使用共享内存时比较困难,共享内存通常通过多个虚拟地址映射到一个物理地址来实现,这种方法不能用于反向页表。所以每个物理页只有一个虚拟页条目,所以一个物理页不可能有两个或更多的共享虚拟地址。

  1. 把作业地址空间中使用的逻辑地址变成内存中物理地址称为重定位。
  2. 静态重定位的时机是程序装入时。
  3. 能够装入内存任何位置的代码程序必须是可动态绑定的 。
  4. 动态重定位过程依赖于可重定位装入程序,重定位寄存器,地址变换机构。
  5. 程序必须装入内存才能被执行。
  6. 在固定分区分配中,每个分区的大小是可以不同但预先固定。

分段内存管理

  • 分页内存管理的问题:
    用户视角的内存和实际物理内存的分离。用户通常愿意将内存看成是一组不同长度的段的集合,段是逻辑上有意义的单位,而且段与段之间没有一定的顺序。
  • 分段:支持用户观点的内存管理机制;逻辑地址空间是由一组段组成的,每个段都有名称和长度。地址指明了段名称和段内偏移。所以逻辑地址由一个有序对组成:<段号,偏移>。这称为二维地址。
  • 分段的逻辑视图
    在编译用户程序时,编译器会自动根据输入程序来构造段。
    在这里插入图片描述

分段机制1

  • 一个逻辑地址是两个向量的集合:<segment-number, offset>
  • 虽然用户可以通过二位地址来引用程序中的对象,但物理地址仍是一维的。分段机制通过段表(segment table)实现将二维用户地址映射为一维的物理地址。
  • 段表的表项包括:
    基址base-内存中段物理地址的起始地址,
    限长limit-指定段的长度。
  • 段表本身也是放在内存中的。段表基址寄存器(STBR)指向段表在内存中的地址。段表限长寄存器(STLR)表明被一个程序所使用的段的数目。如果段号s<STLR,那么s是合法的
  • 如图,一个逻辑地址由两部分组成,段号s和段内偏移d,段号s作为段表的索引找到对应项,偏移d与对应项中的限长比较,d要<limit,否则陷入操作系统中,进行寻址错误操作;如果偏移d合法,就与表项中的段基地址base相加,得到物理地址。
    在这里插入图片描述
    在分段中,系统为每一段分配一块内存,这些内存可以不连续。

分段机制2

  • 由于段的长度各不相同,因此这种内存分配实际上是一个动态存储分配问题,可采用可变分区方案来实现。相比于连续内存分配,现在的分配对象不是进程,而是进程中的段。
  • 内存分配:首先/最佳适应法(存在外碎片问题)
  • 重定位时采用动态重定位,由段表来执行
  • 内存共享:段是逻辑上有意义的单位,实现比较方便,比页共享更容易实现

分段机制3

  • 在每个段表的表项上设置保护位来达到内存保护的目的。
    有效位=0–>非法段
    读/写/执行权利
  • 保护位同段相联系,在段的级别进行代码共享

段页式原理

分页和分段各有其优缺点,可以结合这两种方式形成新的方案。

  • 原理:先将用户程序分为若干个段,并为每个段赋予一个段号,再把每个段分成若干个页。
  • 逻辑地址由三部分组成:<段号,页号,页内偏移>
  • 这种方案从用户视角看,程序被划分成了逻辑上有意义的段;从系统视角看,物理内存被划分成了固定大小的帧,结合了两者的优点。
    在这里插入图片描述
  • 存在内碎片,无外碎片
  • 例:当前程序被分为三段:主程序段,子程序段,数据段。每段又被分为4KB大小的页。逻辑地址由三部分组成:段号S,段内页号P,页内地址W
    在这里插入图片描述
    段页式方法简单来说,就是CPU产生的逻辑地址首先送入分段单元,生成线性地址,然后将线性地址交给分页单元,生成内存中的物理地址。
    分段单元和分页单元相当于内存管理单元MMU

内存扩充技术

内存‘扩充’并不是指增加系统的物理内存,而是指在现有的物理内存基础上,扩大内存的使用效率
常用的内存扩充技术包括:紧缩,覆盖,交换和虚拟内存。
有一种情况:尽管空闲内存的总量可以满足进程的需求,但这些内存碎片是不连续的,分散在不同的区域,这种情况可以采用可变分区管理中介绍过的紧缩技术。

覆盖技术(Overlaying)

  • 程序大小超过物理内存总和时,所采用的内存扩充技术。具体实现时,是指在程序执行过程中,程序的不同部分相互替换。
  • 程序执行时,只在内存中保留那些在任何时候都需要的指令和数据,将那些不会同时进行的程序段共享同一块内存区域
  • 覆盖技术要求程序各模块之间有明确的调用结构,这个工作是同步完成的,因为只有程序员自己最了解自己的程序,程序员声明覆盖结构后,操作系统只是完成覆盖的过程
  • 优点:不需要操作系统的特别支持
  • 缺点:覆盖结构的程序设计很复杂
  • 主要用于早期的操作系统,现代已不再使用了

交换技术

  • 在多道程序环境下,一方面,在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至可能出现在内存中所有进程都被阻塞而迫使CPU停止下来等待的情况。
  • 另一方面,却又有着许多作业在外存上等待,因无内存而不能进入内存运行的情况
  • 这种情况导致了资源浪费,系统吞吐量下降
  • 为解决这个问题,把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上的备份区,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。这就是交换。
  • 备份区:它是一个固定的足够大的可以容纳所有用户内存映像拷贝的快速磁盘。它必须提供对这些内存映像的直接访问
  • 例:一系统采用时间片轮转调度算法:当一个时间片用完时,内存管理器可以将刚刚执行过的进程换出,将另一个进程换入到刚刚释放的内存空间中。
  • 滚入,滚出(Roll out, roll in )—交换由于基于优先级的算法而不同,低优先级的进程被换出,这样高优先级的进程可以被装入和执行
  • 交换较为耗时,交换时间的主要部分是转移时间,总的转移时间直接同交换的内存的数量成正比。由于这个原因,标准交换技术在现代操作系统中很少使用,但许多变种得以应用。比如在UNIX系统中,只有当空闲内存不够用时才采用交换
  • 交换需要考虑的问题:
    1.进程的哪些内容要交换到磁盘:主要交换的内容应该是进程运行时创建或修改的内容,也就是栈或堆的内容,至于代码部分,由于不需要修改且在外存上有备份,因此不需要被交换出去保存,直接丢弃即可。
    2.在磁盘的什么位置保存被换出的进程:交换区(备份区)系统指定一块特殊的磁盘区域作为交换空间,包含连续的磁道,操作系统可以使用底层的磁盘读写操作对其高效访问
    3.何时需要发生交换:一种是进程只要不用或者很少再用的就换出。第二种使用更多的策略是内存空间不够或有不够的危险时启动交换程序换出。
    4.如何选择被换出的进程:根据进程的各种属性,如,紧缩技术,有些进程在内存里是不能随意搬家的;处于等待I/O状态的进程也不能随意被交换出去。
    5.如何处理进程空间增长:一般采用预留空间法。

段式和页式存储管理的地址结构很类似,但是他们之间有实质上的不同,表现为:页式的逻辑地址是连续的,段式的逻辑地址可以不连续;页式的地址是一维的,段式的地址是二维的;分页是操作系统进行,分段是用户确定;各页可以分散存放在主存,每段必须占用连续的主存空间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值