操作系统-----内存

文章详细阐述了内存管理的重要性,包括内存的分配、回收以及逻辑地址到物理地址的转换。介绍了不同类型的地址转换方式,如绝对装入、静态重定位和动态重定位。同时,讨论了存储保护的实现方法和内存空间的连续与非连续分配策略,特别是分页存储管理的细节,如页表、快表和页面置换算法。此外,还提到了内存扩充技术,尤其是虚拟化技术在提高内存利用率上的作用。
摘要由CSDN通过智能技术生成

为什么要有内存?如果cpu是直接读取外存的数据,那么cpu的处理速度和读取速度会严重不匹配,外存拖累了cpu。而内存的读写速度是外存的几百倍所以需要把外存的程序装入到内存中,cpu直接读取内存数据。操作系统管理内存的方式有四种分别是管理内存的分配与回收,内存空间的扩充(采用虚拟化技术),地址转换,存储保护。

内存是由一个个存储单元组成,一般来说每一个存储单元存储一个字节的数据,每一个存储单元都有一个地址称为物理地址,就拿4GB的内存来说共有2^32个存储单元也就是说地址需要32位二进制来表示。当操作系统创建了一个进程后需要为该进程分配内存空间如100~199地址的存储单元,但是这个地址是物理地址而程序中使用的地址是逻辑地址(相对地址),它是相对于0号地址来定位的但是进程被分配的地址空间不一定是从0开始的所以需要把逻辑地址转化为物理地址。

地址转换:地址转换根据程序从外存装入内存共有三种方式为绝对装入,静态重定向,动态重定向。它们的区别在于地址的转换方式不同。绝对装入:当程序经过编译器转化成二进制代码时会为每一条指令标记在内存中存储的位置,一般来说采用的是逻辑地址来标记等到装入时在把逻辑地址转换为物理地址。但是在绝对装入的方式下,采用的是物理地址来标记是因为已经事先知道了将要被分配内存空间的起始物理地址,缺点是只适用于单道程序的情况下因为在多道程序运行的情况下有可能目标地址被其它进程占用导致无法分配。也无法迁移到其它主机运行因为不知道目标地址是否空闲,无法动态做出改变。静态重定位:编译时形成的地址是逻辑地址,当把程序装入内存时根据被分配的初始地址把逻辑地址都转化成物理地址。缺点:进程无法在内存中移动,一旦移动会导致地址错误。动态重定位:编译时形成的地址是逻辑地址,把程序装入内存时使用的地址还是逻辑地址。只有当cpu读取逻辑地址时才会把逻辑地址转化为相应的物理地址,原理是cpu中有一个重定位寄存器,里面存放的是该模块的起始地址当cpu访问逻辑地址时会把逻辑地址与寄存器的值相加得到物理地址。优点:进程在内存中可以灵活移动,可以动态分配内存。

存储保护:存储保护有两种实现方式第一种是设置一对上下限寄存器用于存储进程的上限地址和下限地址,当cpu想要读取数据时需要判断该地址是否在上下限寄存器中如果在则正常访问,否则发生越界异常。第二种方式是设置两个寄存器一个是重定位寄存器用于记录进程的起始地址另一个是界地址寄存器用于记录进程的最大逻辑地址,当cpu想要访问数据时会先对比界地址寄存器的值看是否小于该值,如果小于说明访问的数据在进程内否则发生越界异常。之后把该逻辑地址与重定位寄存器的值相加得到物理地址完成访问。

逻辑地址是虚拟地址,是应用程序所使用的地址。每个应用程序使用的逻辑地址都是从零开始的,但是进程被分配的物理地址大概率不是从零开始的。逻辑空间指的是虚拟的内存空间它是假想的内存空间,逻辑空间的作用是减轻程序员的负担让他们不需要关注内存的分配这些都由操作系统来管理,因为程序员并不知道该程序被执行时物理内存的使用情况所以很难管理内存所以就假定会被分配一片地址从零开始的内存空间这一片空间就叫逻辑空间,操作系统负责把逻辑空间映射成物理空间。它的大小取决于操作系统的分配而操作系统能分配的最大逻辑空间取决于操作系统能表示的逻辑地址的位数,如32位的逻辑地址代表最大能分配2^32B的逻辑空间。物理空间是指实际被操作系统分配的那片物理空间。当操作系统创建进程时会为该进程分配逻辑空间和物理空间如果采用的是非连续的内存管理方式则会把该逻辑空间划分为一个个大小(大小取决于物理空间的划分,操作系统在运行时就会把物理空间按照相同的大小把内存划分为一个个的页框)相同的页面。每个页面都有编号,之后便建立页表把逻辑空间映射到物理空间。操作系统创建进程时要分配逻辑空间用来储存代码因为进程使用的是逻辑地址所以用逻辑空间来储存(因为逻辑空间是虚拟的所以这里的储存并不是说代码储存在虚拟内存里只是一种表达方式而已,代码是储存在外存中的)。因为进程使用的是逻辑地址所以每一条指令都有对应的逻辑地址用来表示它们储存在逻辑空间的那个存储单元里,是在编译时就记录好的。在装入时要记录好该指令储存的物理地址与它自身的逻辑地址并记录好映射关系,这一过程就是逻辑空间到物理空间的映射,不同的内存管理方式有不同的记录映射的方式,如分页管理是采用页表来记录映射关系,不管采用那种方式只要能在访问逻辑地址时能转化成对应的物理地址即可。

内存空间的管理与分配:有两种分配方式一种是连续分配的管理方式另一种是非连续分配的管理方式。区别在于连续分配需要一片连续的内存空间,非连续分配则不需要。

连续分配的管理方式:一共有三种方式分别为单一连续分配,固定分区分配,动态分区分配。单一连续分配:内存中只能拥有一道进程,该进程独占整个内存。优点:实现简单,无外部碎片(由于这部分内存太小不足以分配给进程使用,所以称为外部)可以采用覆盖技术扩充内存。缺陷:内存利用率极低,会产生很多内部碎片(操作系统给进程分配的内存中有一部分该进程没有使用,没有使用的这一部分称为内部碎片)。固定分区分配:操作系统会把内存的用户区划分为一个个分区,有两种划分方式一种是每个分区大小相同另一种是分区大小逐渐递增。采用这种方式操作系统给进程分配的内存空间就是一个个的分区,如果采用分区大小相同的划分方式会导致严重的内部碎片的产生。采用递增的方式划分分区可以更好的适应每个进程的需求小的进程分配小的分区,大的进程去大的分区。但是有一种情况是如果有一个大的进程到来但是划分的最大分区也无法存储那么该进程就无法运行即使内存的空余空间完全可以支持它的运行,所以采用固定分区的分配是很不灵活的但也实现了多道进程同时运行。动态分区分配:操作系统不会预先划分分区,只会划分空闲分区(相当于记录进程空闲的区域)。等到把进程装入时才会根据动态分区分配算法选择一个空闲分区按照进程的大小划分一个分区给该进程。操作系统采用空闲分区表和空闲分区链这两种数据结构来记录空闲分区的情况为动态分区分配算法提供数据支持。cd358d7492484ce0901e34f9801f1a0c.png

5b475dcea67c47c0938e4fa4c8348728.png

 动态分区分配算法有四种为首次适应算法,最佳适应算法,最坏适应算法,邻近适应算法。首次适应算法:每次都从低地址开始查找,找到第一个能满足大小的空闲分区,所以空闲分区表需要按照地址递增的顺序排列按顺序依次查找直到遇到满足大小的空闲分区。把该空闲分区分配给该进程后需要修改空闲分区表的记录如果分配完后还有剩余则把分区大小改为剩余的大小,起始地址也要做修改,但不需要对空闲分区表进行重新排序。最佳适应算法:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用里小的空闲区。所以空闲分区表要按照空闲分区大小递增的顺序进行排列,查找时按顺序查找第一个满足的空闲分区。缺点是会造成很多的外部碎片。最坏适应算法:为了鲜决最佳适应算法的问题一一即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。所以空闲分区按大小递减顺序排列,每次分配内存时顺序查找空闲分区,找到大小能满足要求的第一个空闲分区。缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。邻近适应算法:首次适应算法每次都从表头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索就能解决上述问题,所以需要记录每次查找的结束位置。空闲分区以地址递增的顺序排列。每次分配内存时从上次查找结束的位置开始查找空闲分区表,找到大小能满足要求的第一个空闲分区。缺点:首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)。紧凑:紧凑技术是用于解决外部碎片的问题的,原理是把被小碎片隔开的进程进行移动让它们挨在一起这样小碎片和小碎片就能组合在一起形成一片较大的区域。紧凑技术需要搭配动态重定位装入使用。

非连续分配的管理方式:非连续分配的管理方式共有三种分别为基本分页存储管理,基本分段存储管理,基本段页式存储管理。基本分页存储管理:操作系统会事先对内存按照一定的大小划分为一个个大小相等的区域称为页框(划分的方式是先把物理内存进行数据化即创建一个物理空间这个物理空间储存的是内存的所有物理地址,有了数据后就可以进行划分了。之所以要数据化是因为只有把硬件这个现实中的物体用数据给描述出来后才能进行计算和管理),每个页框都有一个编号称为页框号,页框号的位数通过计算算出。比如一个4GB的内存共2^32B字节,该操作系统设定一个页框的大小为4KB则2^32/2^12=2^20,所以该内存被划分为了2^20个页框则页框号的范围为0~2^20-1,每个页框都要有一个编号所以编号至少需要20位二进制数来存储但是存储单元是以字节为单位的所以至少需要3B的存储空间用来存储页框号。逻辑空间需要根据页框的大小来划分页面即页面大小等于页框大小,每个页面都有一个编号称为页面号,页面号的位数也能使用上面的方式算出。注意如果没有采用虚拟化技术对内存进行扩充那么逻辑空间的大小必须小于物理空间(不是进程的物理空间而是整个内存的物理空间)的大小。逻辑地址由两部分组成页面号和页内偏移量,有两种计算方式可以算出第一种逻辑地址/页面长度(取整数部分)得到页面号,逻辑地址%页面长度(取余数部分)得到页内偏移量。第二种方法是如果页面大小为2的整数幂那么把逻辑地址用二进制表示的话就可以很快划分页号和页内偏移量。如4KB的页面大小为2^12B所以逻辑地址的后12位为页内偏移量前面的位数表示页号。页表:记录页面和页框的映射关系表明该页面放在了那个页框上。页表由页表项构成每个页表项都记录则页面和页框的映射关系即记录了页面号和页框号但是由于页面号是连续的所以页面号不会记录只会记录页框号,所以页表项长度取决于页框号长度即3B,但一般来说存储时会用4B来存储页框号因为页框的大小基本都为2的倍数,设置4B储存时就可以占满一个页框不会像3B那样留下内部碎片。页表的起始地址会存储在进程的pcb中,当cpu访问逻辑地址时会把逻辑地址分为页号和页内偏移量,然后根据页号和页表的起始地址算出页表项的地址(页表起始地址+页号*页表项长度)得出页框号,之后根据页框号和页内偏移量算出物理地址(页框号*页框大小+页内偏移量)。

ce631d47809543e297577f13dce6c868.png

 

基本地址变换机构:属于内核程序,用于把逻辑地址转换为物理地址,转换过程就是上面写的。当需要进行逻辑地址转换时就会调用该程序。页表寄存器:存放进程页表的起始物理地址和页表的长度,当进程被调度上cpu运行时会把储存在pcb中的页表起始地址和长度放入页表寄存器当中(这一过程叫恢复运行环境)。程序计数器:储存下一条要访问的指令的逻辑地址。在把逻辑地址转换为物理地址之前还需要判断该逻辑地址是否有越界。注意页号大于或等于页表长度都属于越界因为页号是从零开始的。e97a8f9ae2f04576b43693ab5c0dcd02.png

快表:又称联想寄存器(TLB,translation lookaside buffer),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。cpu访问硬件的速度比较:寄存器>高速缓存>内存>外存,前两个都是在cpu内部的所以速度很快。在引入快表机制后把逻辑地址转换为物理地址的过程也会发生改变,当cpu遇到逻辑地址时会调用内核程序基本地址变换机构由该程序负责把逻辑地址转换为物理地址。步骤如下:基本地址变换机构会先把逻辑地址拆分成页号和页内偏移量,并把页号和页表寄存器中储存的页表长度进行对比判断是越界,如果没有越界则会根据页号在快表中进行查找,如果快表中没有记录该页号则需要访问内存中的慢表找到相应的页号从中取出对应的页框号并把该记录写入快表中那么下次访问时就可以直接从快表中命中了。如果记录时发现快表已经满了则需要根据一定的算法对旧的页表项进行替换。

5f7bb7919d0e4ce3be9bf8026b633526.png

 采用了快表机制的操作系统它的地址转换速度会提升大约90%,这里会有个疑问快表不是只能储存一部分的页表项吗?为什么会提升这么大,这都要归公于局部性原理,局部性原理分为时间局部性和空间局部性。时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个致据被访问过,不久之后该数据很可能再次被访问(因为程序中存在大量的循环)。空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问(因为很多数据在内存中都是连续存放的)。

两级页表:由于在单级页表中页表在内存中是连续存储的这就导致了一个问题,那就是页表需要占用很大一片的连续内存空间这违背了非连续管理的原则,所以我们需要把一个页表拆分成多个小页表每个页表都有一个页表号,每个小页表的大小都不能超过页框的大小。同时建立一个项目录页表用来记录页表号和页框号的对应关系。

93991d09fe784b9c8c054cac155e131b.png

如页面大小为4KB,逻辑地址为32位则后12位为页内偏移量,前20位为页号。因为采用多级页表所以需要建立一个一级页表(也叫项目录表)用来记录二级页表的信息,二级页表的大小不能超过页框的大小。所以二级页表最大的大小为4KB,又因为每一个页表项的大小为4B,所以一个二级页表能储存4KB/4B=2^10个页表项也就是说20位的页号中后10位表示二级页号前10位表示一级页号。采用多级页表时的越界判断方式:先把逻辑地址拆分为一级页号,二级页号,页内偏移量。把一级页号与一级页表的长度进行对比看是否小于,如果小于则把二级页号与二级页号对应的二级页表的长度进行比较看是否小于如果小于则说明没有越界否则越界。

基本分段存储管理:按照程序自身的逻辑划分段,所以段的大小是不定的而且物理空间不做任何划分只划分逻辑空间,每个段都是从零开始编址。操作系统以段为单位分配物理内存各个段之间可以不连续但是段内必定连续。逻辑地址由段号和段内地址两部分构成,段号的位数决定了该进程最多能分几个段,段内地址的位数决定了每个段的最大长度,而位数的划分取决于操作系统。假设逻辑地址的位数为32位其中后16位为段内地址,前16位为段号。则该进程最多划分2^16个段每个段最大为2^16B。为了管理段和实际物理地址空间的映射关系,需要建立段表来进行记录。

821ca81c2841414d96b58adb7db2ee2a.png

 由于段表是连续存储的并且每个段表项的大小相同所以段表项中不需要存储段号信息,只需要存储段的长度和在物理内存中的起始物理地址。所以段表项的长度为段长16bit(也就是上面算的段内地址的长度)+地址32bit为6B。分段式的逻辑地址转换与分页式有些许不同。

055e4e49460742e3b2b1518c2cc65348.png

 分页式和分段式的对比:分页是系统的操作用户是无法感知的,只知道会被分配一片地址从零开始的地址空间(但实际上并不会因为是离散存储的,只是假设会被分配这样的空间并在此基础上使用该空间,使用完后操作系统在把逻辑地址转化为物理地址)。而分段的操作是用户进行的,在编写地址时需要指定段号和段内地址,每个段的地址都是从零开始。分段可以更好的实现进程之间的数据共享,只需要把想要共享的数据设置为一个段,那么想要访问的进程只需要在它们的段表中添加该段的记录即可。但是分页式实现起来就很难,因为分页的操作是操作系统进行的,所以可以共享的部分和不可共享的部分可能在一个页面中,这样就很难向上面那样操作。

基本段页式管理:用户按照逻辑结构进行分段,每个段的逻辑地址都是从零开始,分段完成后操作系统会把段进行分页操作,页面大小小于等于页框大小,物理内存在一开始就完成了页框的划分。用户只能感知到分段无法感知分页,分页是操作系统的操作。逻辑地址由三部分组成段号,页号,页内偏移量。段号决定进程能被划分成几段,页号决定每个段能被划分成几个页,页内偏移量决定每个页的最大长度。为了管理逻辑地址到物理地址的映射需要建立段表和页表,段表储存段号和页框的映射关系但段号是隐式存储,每个段表项的长度为页框号的大小。页表储存页号和页框号的映射关系,页号同样是隐式储存。ffb7394537cf447eb1baa958f27b87aa.png

 519fc8b34eaf43ce8ace7999bc1af7b9.png

 

9989594efd4a4352ac8b2a29665b12fd.png

内存空间的扩充:扩充内存的技术有三种为覆盖技术,交换技术,虚拟化技术。这些技术扩充内存的本质都是提高内存的利用率,在逻辑上扩充内存空间,其中最为高效的就是虚拟化技术。

虚拟化技术:传统的内存管理方式(不采用任何内存扩充方式)满足两个特性,一次性和驻留性。一次性:是指在创建进程时逻辑空间需要全部映射到物理空间中,驻留性:是指处于内存中的代码即使没有被读取也依旧要待在内存中直到进程执行完毕被销毁。正是由于这两个特性导致在传统的内存管理方式下内存的利用率极低,如果有一个大的进程想要运行但是它的逻辑空间无法一次性映射入物理空间那么该进程无法运行。又比如明明进程的一部分代码已经执行完毕不会在执行了可是却要一直占用内存。所以正是由于这两个特性导致内存利用率极低,而虚拟化技术(覆盖技术和交换技术也解决了一点)就完美解决了这两点。在采用虚拟化技术的操作系统中在创建进程时不需要一次性把逻辑空间全部映射入物理空间中,只需要把进程一开始要执行的那部分映射进物理空间即可,剩余的部分在进程需要执行时在映射进去即可。如果代码执行完毕或则暂时不会被使用就会把这一部分的代码调出内存去到外存中。所以虚拟化技术满足三个特性,多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。虚拟化技术是建立在离散管理的方式之上的,于是离散管理的三种方式就变成了,请求分页管理,请求分段管理,请求段页式管理。主要区别:在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。所以操作系统需要提供两个功能,请求调页功能(或调段)负责发生缺页时把对应的页从外存中调入内存,页面置换功能负责当内存不够时把暂时用不到的页给调出内存给调入内存的页腾出空间如果调出外存的页被修改了则需要写入外存的对换区当中如果没修改则直接删除。

采用虚拟化技术的页表结构与传统方式的页表结构不同。

40a55381046a470b8fa9d6312d96544d.png

缺页中断机构:在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断(发生缺页中断不一定发生页面置换),然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

地址变换机构:负责地址转换的内核程序(和上面基本分页中写的基本一样只是多了些步骤而以功能是一样的)

d8d684ac1e414a439ba32533dac93c9e.png

 5e45be815c5c464cb6a587ce577ac309.png

 页面置换算法:当内存不足时通过页面置换算法决定把那个页调出内存。页面置换算法一共有五种分别为:最佳置换算法(OPT),先进先出置换算法(FIFO),最近最久未使用置换算法(LRU),时钟置换算法(CLOCK),改进型的时钟置换算法。

最佳置换算法(OPT):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。但实际上,只有在进程执行的过程中才能知道接下来会访问到
的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。

先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面。实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少个内存块。Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。只有FIFO算法会产生Belady异常。另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此,算法性能差。

最近最久未使用置换算法(LRU,least recently used):每次淘汰的页面是最近最久未使用的页面。实现方法:在每个页面对应的页表项中增加一栏记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大。

时钟置换算法(NRU,Not Recently Used):是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法。实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位 置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描)。

改进型的时钟置换算法:在时钟置换算法的基础上为页表项添加了一个新的一栏用来记录该页面是否被修改过,0表示没有被修改,1表示被修改。为方便讨论,用(访问位,修改位)的形式表示各页面状态。如(1,1)表示一个页面近期被访问过,且被修改过。算法规则:将所有可能被置换的页面排成一个循环队列。第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描
不修改任何标志位。第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于
替换。本轮将所有扫描过的帧访问位设为0。第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位。第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描。

驻留集:指在请求分页存储管理中操作系统给进程分配物理块的集合。驻留集的大小就是该进程被分配的物理内存的大小,一般小于进程的大小。驻留集太小会导致缺页情况频繁发生,驻留集太大会导致一个进程占用太多内存导致内存利用率降低,进程并发度。

固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变。
可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变。
局部置换:发生缺页时只能选进程自己的物理块进行置换。
全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

分配方式和置换方式两两结合组合成3种页面分配和页面置换的方式,为固定分配局部置换,可变分配全局置换,可变分配局部置换(至于固定分配全局置换是无法实现的因为互相违背原则)。

工作集:指在某段时间间隔里,进程实际访问页面的集合。

固定分配局部置换:系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。这种策略的缺点是:很难在刚开始就确定应为每个进程分配多少个物理块才算合理。(采用这种策略的系统可以根据进程大小、优先级、或是根据程序员给出的参数来确定为一个进程分配的内存块数)。
可变分配全局置换:刚开始会为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。采用这种策略时,只要某进程发生缺页,都将获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。
可变分配局部置换:刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程在运行中频繁地缺页,系会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值