1,虚拟存储器
连续分配、基本分页和基本分段存储管理方式都要求将一个作业全部装入内存后方能运行,于是,会出现:
- 作业很大,需求总容量超过了内存总容量。会因不能全部装入内存而导致该作业无法运行。
- 有大量作业要求运行,但由于内存容量不足以容纳所有作业,只能将少数作业装入内存让它们运行,大量作业留在外存上等待。
解决的办法:从物理上增加内存容量—受机器自身的限制,增加系统成本;从逻辑上扩充内存容量—用虚拟存储器技术解决;
1.1,常规存储管理方式
1,常规存储管理方式的特征
- 一次性:作业在运行前需一次性地全部装入内存。作业每次运行时,并非全部程序和数据都要用到,如果全部装入,造成了对内存空间的浪费。
- 驻留性:作业装入内存后,便一直驻留在内存中,直至运行结束。尽管有的进程会因等待I/O而长期等待,或有的程序模块在运行过一次后就不再需要了,但它们都仍继续占用宝贵的内存资源。
2,局部性原理:指程序在执行过程中的一个较短时间内,所执行的指令地址和指令的操作数地址,分别局限于一定区域。
- 时间局部性:如果程序中的某条指令被执行,则不久以后该指令可能再次执行;如果某条数据被访问过,则不久之后该数据可能再次被访问。产生时间局限性的典型原因是在程序中存在着大量的循环操作。
- 空间局部性:一旦程序被访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能是集中在一定范围之内,其典型情况原因是程序的顺序执行。
具体表现:
- 程序在执行时,大部分是顺序执行的指令,少部分是转移和过程调用指令。
- 过程调用的嵌套深度一般不超过5,因此执行的范围不超过这组嵌套的过程。
- 程序中存在相当多的循环结构,它们由少量指令组成,而被多次执行。
- 程序中存在相当多对一定数据结构的操作,如数组操作,往往局限在较小范围内。
3,虚拟存储器的基本工作情况
- 基于局部性原理可知,应用程序在运行之前没有必要将之全部装入内存,而仅须将那些当前要运行的少数页面或段先转入内存便可运行,其余部分暂留在盘上。
- 程序在运行时,如果它所要访问的页(段)已调入内存,便可继续执行下去;但如果程序所要访问的页(段)功能未调入内存(缺页或缺段),便发出缺页(段)中断请求,此时OS将利用请求调页(段)功能将它们调入内存,以使进程能继续执行下去。
- 如果此时已满,无法再装入新的页(段),OS还须再利用页(段)的置换功能,将内存中暂时不用的页(段)调至盘中,腾出足够的内存空间后,再将要访问的页(段)调入内存,使程序继续运行下去。
这样,便可使一个大的用户程序在较小的内存空间中运行,也可在内存空间中同时装入更多的进程,使它们并发执行。
1.2,定义和特征
1,虚拟存储器的定义
虚拟存储器定义:仅把作业一部分装入内存就 可运行的系统。
虚拟存储器:是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近内存速度,而每位的成本又接近于外存。虚拟存储技术是一种性能非常优越的存储器管理技术,故被广泛的应用于大中小型计算机。
2,虚拟存储器的特征
- 多次性:多次性是相对于传统存储器管理方式的一次性而言的,是指一个作业中的程序和数据无需在作业运行时一次性的全部装入内存,而是允许被分成多次调入内存运行,即只需要把当前要运行的那部分程序和数据装入内存即可开始运行。
- 对换性:对换性是相对于传统存储器管理方式的常驻性而言,是指一个作业中的程序和数据,无需在作业运行时一直常驻内存,而是允许在作业运行时换进换出,允许将那些暂时不使用的代码和数据从内存调至外存的对换区,带以后需要时再将它们从外存调至内存。
- 虚拟性:虚拟性是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。
虚拟性是以多次性和对换性为基础;多次性和对换性是以离散分配为基础;
1.3,实现方式
虚拟存储器中,允许将一个作业分多次调入内存。如果采用连续分配方式时,要求必须将作业装入一个连续的内存区域中,则必须事先为作业一次性地申请一个足以容纳整个作业的空间,以便能将该作业分先后地多次地装入内存。这不仅会使相当一部分内存空间处于暂时或永久的空闲状态,造成内存资源的浪费,而且无法、也无意义再从逻辑上扩大内存容量。所以,虚拟存储器的实现,都毫无例外的建立在离散分配存储管理方式的基础上。
分页请求系统和请求分段系统
- 分页请求系统是在分页系统的基础上增加了请求调页功能和页面置换功能所形成的页式存储系统。
- 请求分段系统是在分段系统的基础上增加了请求调段功能和段置换功能所形成的段式存储系统。
硬件支持:请求分页(段)的页(段)表机制;缺页(段)中断机构;地址变换机构;
软件支持:置换软件
步骤:
- 地址空间部分装入:在程序装入时,只将当前需要执行的部分页或段装入到内存,就可让程序开始执行。
- 执行中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),硬件产生缺页或缺段中断。
- 中断处理程序,将相应的页或段调入到内存,然后继续执行程序;如果内存无空闲空间,系统将内存中暂时不使用的页或段调出保存在外存交换区,从而腾出空间存放将要调入的页或段。
2,请求分页存储管理
每次调入和置换的基本单位都是长度固定的页面,使得请求分页系统在实现上比请求分段系统简单。
优点:
- 请求分页存储管理具有分页存储管理的全部优点,特别是它有效地缓解了碎片的问题。
- 提供了大容量的多个虚拟存储器;
- 作业地址空间不再受实际存储容量的限制;
- 更有效地利用主存;
- 有利于运行多道程序;
- 提高了系统效率,方便了用户,特别是大作业用户;
缺点:
- 要求有相应的硬件支持,从而增加了成本,如动态地址变换、快表、缺页中断的产生等都要求有相应的硬件支持。
- 缺页中断增加了处理机时间的开销,如页表的建立与管理、缺页中断处理等;
- 页面淘汰算法如选择不当,有可能产生抖动现象,为防止抖动,会增加系统的复杂性;
- 虽然减少了碎片,但每个进程的最后一页内总有一部分空间得不到利用;
2.1,请求分页中的硬件支持
1,请求页表机制:在简单页式存储管理的基础上,PMT中增加请求调页和页面置换功能。
2,缺页中断机构:在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断,请求OS将所缺的页面调入内存。缺页中断作为中断,同样需要经历保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理,以及在中断处理完成后再恢复CPU环境。但是缺页中断又是一种特殊的中断,它与一般的中断相比有着明显的区别:
(1)在指令执行期间产生和处理中断信号。通常CPU都是在一条指令执行完后,才检查是否有中断请求到达。若有,便去相应,否则,继续执行下一条指令。然而,缺页中断是在指令执行期间,若发现所要访问的指令或数据不在内存时便立即产生和处理缺页中断信号,以便能及时将所缺之页调入内存。
(2)一条指令在执行期间可能产生多次缺页中断。基于这种特性,系统中的硬件机构能保存多次中断时的状态,并保证最后能返回到中断前产生的缺页中断的指令。
3,地址变换机构
2.2,请求分页中的内存分配
为进程分配内存时,将涉及到三个问题:
第一,最小物理块数的确定;是指能保证进程正常运行所需的最小物理块数。当系统为进程分配的物理块数少于此值时,进程将无法运行。进程应获得的最小物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
第二,物理块的分配策略;
- 固定分配局部置换 为每个进程分配一定数目的物理块,整个运行期间都不再改变。
- 可变分配全局置换 先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一定空闲物理块队列。当某进程发现缺页时,由系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的页装入其中。
- 可变分配局部置换 为每个进程分配一定数目的物理块,当某进程发现缺页时,只允许从该进程在内存的页面中选出一页换出,这样就不会影响其它进程的运行。若进程运行过程中频繁地发生缺页中断,则系统为该进程分配附加的物理块,直至该进程的缺页率减少到适当程度为止;反之,可适当减少分配给该进程的物理块数。
第三,物理块的分配算法;并非一个进程分配几个物理块就可运行, 太少可能造成系统抖动。在采用固定分配策略时,如何将系统中可供分配的所有物理块分配给各进程。可采用以下几种算法:
- 平均分配: 将系统中所有可供分配的物理块平均分配给各个进程。内存块平均分给各进程。小进程有利,长进程中断率高。
- 根据进程大小按比例分配 : 根据进程的大小按比例分配物理块。如果系统中共有n个进程,每个进程的页面数为Si,则系统中个进程页面数的总和为:
,再假定系统中可用的物理块总数为m,则每个进程所能分到的物理块数bi可由下式计算:
。
- 考虑优先权的分配 算法 : 为了照顾到重要的、紧迫的作业能尽快地完成,应为它们分配较多的内存空间。通常将可供分配的所有物理块分成两部分:一部分按比例分配给各进程。另一部分则根据各进程的优先权进行分配,可为高优先级进程适当地增加其相应份额。在重要的实时系统中,则可能是完全按优先权为各进程分配其物理块。
2.3,页面调入策略
为使进程能够正常运行,必须实现将要执行的那部分程序和数据所在的页面调入内存。
1,何时调入页面
预调页策略:以预测为基础需要调入某页时,一次调入该页以及相邻的几个页。(通常用于进程首次调入内存, 可同时调入几页)
优点:提高调页的I/O效率。缺点:基于预测,若调入的页在以后很少被访问,则效率低。常用于程序装入时的调页。
2,从何处调入页面
通常对换区的I/O效率比文件区的高。关于调入页面的来源,这里有三种做法:
- 从对换区: 进程装入前,将其全部页面复制到对换区,以后总是从对换区调入。执行时调入速度快,要求对换区空间较大。
- 未被修改的页面从文件区读入,而被置换时不需调出;已被修改的页面从对换区调入,节省对换区空间。被修改过的页面淘汰时送入对换区。
- UNIX方式。未运行过的页面都应从文件区调入。而对于曾经运行过但又被换出的页面,应从对换区调入。又由于UNIX系统允许页面共享,如果某进程所请求的页面已经被其他进程调入内存,此时也无须从对换区调入。
3,页面调入过程
- 页面未在内存时(存在位为“0”),程序向CPU发出一缺页中断申请。
- 转入缺页中断处理程序(调入或置换)
- 修改快表
- 访问内存数据
4,缺页率
缺页率 :设一个进程的逻辑空间为n页,系统为其分配的内存物理块数为m ( m ≤ n )。
如果在进程的运行过程中,访问页面成功(即所访问的页面在内存中)的次数为S。访问页面失败(即所访问的页面需从外存调入)的次数为F。则总的页面访问数次为A=S+F,那么缺页率为:
。
影响缺页率 的因素:
- 页面大小:页面划分较大,则缺页率较低;反之,缺页率较高。
- 进程所分配物理块的数据:所分配的物理块数目越多,缺页率较低;反之则越高;
- 页面置换算法:算法的优劣决定了进程执行过程中缺页中断的次数,因此缺页是衡量页面置换算法的重要指标。
- 程序固有特性:程序本身的编制方法对缺页中断次数有影响,根据程序执行的局部性原理,程序编制的局部化程度越高,相应执行的缺程度越低。
事实上,在缺页中断处理时,当由于空间不足,需要置换部分页面到外存时,选择置换页面还需要考虑到置换的代价。页面未修改过,直接放弃。页面修改过,必须保存。设被置换的页面被修改的概率为β,其缺页中断处理时间为
,被置换页面没有被修改的的缺页中断时间为
。则缺页中断处理时间的计算公式是:
。
3,页面置换算法
在进程运行过程中,若其所要访问的页面不在内存,而需把它们调入内存,但内存已无空闲时间时,为了保证该进程能能够正常运行,系统必须从内存中调出一页程序或数据送到磁盘对换区中。但应将那个页面调出,须根据一定的算法来确定。通常把选择换出页面的算法称为页面置换算法。置换算法的好坏直接影响到系统的性能。
不适当的算法可能会导致进程发生“抖动”:即刚被换出的页面很快又被访问,需要将它重新调入,此时又需要再选一页调出;而此刚被调出的页很快又被访问,又需将它调入,如此频繁地更换页面,以至一个进程在运行中把大部分时间都花费在页面置换工作上。一个好的置换算法应具有较低的页面更换频率。
3.1,最佳置换算法和先进先出置换算法
1,最佳置换算法
思想:其选择的被淘汰页面将以后永不使用的,或许时在最长(未来)时间内不再被访问的页面。采用最佳置换算法通常可保证获得最低的缺页率。这是一种理想情况,实际中是无法预知的,因而不能实现。可用作某算法性能评价的依据。
假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
2,先进先出算法(FIFO)
思想:FIFO算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择进入内存中驻留时间最长的页面进行淘汰。
可以把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。该算法性能较差。较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,可能产生Belady(贝莱迪)异常。
Belady(贝莱迪)异常:在分页式虚拟存储器管理中,发生缺页时的置换算法采用FIFO(先进先出)算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的物理块数目增多,但缺页率反而提高的异常现象 。即替换策略不符合随着物理块数量的增大,缺页率一定减少的规律。
FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。
3.2,最近最久未使用和最少使用置换算法
1,最近最久未使用置换算法(LRU)
思想:选择内存中最久未使用的页面被置换。这是局部性原理的合理近似,性能接近最佳算法。但由于需要记录页面使用时间的先后关系,硬件开销太大。硬件机构如:
- 一个特殊的栈:把被访问的页面移到栈顶,于是栈底的是最久未使用页面。
- 每个页面设立移位寄存器:被访问时左边最高位置1,周期右移并且最高位补0,于是寄存器数值最小的是最久未使用页面。
LRU置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,须有两类硬件之一的支持:寄存器或栈。
寄存器:为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为:
某进程在内存中具有8个页面,为每个内存页面配置一个8位寄存器时的LRU访问情况。这里,把8个内存页面的序号分别定为1~8。由图可以看出,第3个内存页面的R值最小,当发生缺页时,首先将它置换出去。
栈:可利用一个特殊的栈(不符合一般栈的定义)来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。
假定现有一进程所访问的页面的页面号序列为:4,7,0,7,1,0,1,2,1,2,6
在访问页面6时发生了缺页,此时页面4是最近最久未被访问的页,应将它置换出去。
2,最少使用置换算法(LFU)
思想:在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。
该置换算法选择在最近时期使用最少的页面作为淘汰页。由于存储器具有较高的访问速度,极短时间可能对页面访问成千上万次,因此,通常不能直接利用计数器来记录某页被访问的次数,只能采用较大的时间间隔来记录对存储器某页的访问与否,从而可以采用移位寄存器方式。
每次访问某页时,便将该移位寄存器的最高位置1,再每隔一定时间(例如100 ms)右移一次。这样,在最近一段时间使用最少的页面将是∑Ri最小的页。
3.3,Clock置换算法
1,简单的Clock置换算法
思想:当利用简单Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置为1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置为0,暂不换出,给与该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位为1,则再返回到队首去检查第一个页面。
2,改进型Clock置换算法
在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。对于修改过的页面,再换出时所付出的代价比未修改过的页面大(置换代价大)。在改进的Clock算法中,除须考虑页面的使用情况外,还需再增加一个因素——置换代价。这样,选择页面换出时,既要是未使用过的页面,也要是被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。
- 1类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页;
2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页;
- 3类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问;
- 4类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。
在进行页面置换时,可采用与简单clock算法相类似的算法,其差别在于该算法须同时检查访问位与修改位,以确定该页是四类页中的哪一种。
- 从指针指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
- 如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0。
- 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到淘汰的页面。
3.4,页面缓冲算法
虽然LRU和Clock置换算法都比FIFO算法好,但它们都需要一定的硬件支持,并需付出较多的开销,而且,置换一个已修改的页比置换未修改页的开销要大。而页面缓冲算法(PBA)则既可改善分页系统的性能,又可采用一种较简单的置换策略。它采用可变分配和局部置换的方法。
该算法规定将一个被淘汰的页放入两个链表中的一个,即如果页面未被修改,就将它直接放入空闲链表中;否则,便放入已修改页面的链表中。须注意的是,这时页面在内存中并不做物理上的移动,而只是将页表中的表项移到上述两个链表之一中。
空闲页面链表,实际上是一个空闲物理块链表,其中的每个物理块都是空闲的,因此,可在其中装入程序或数据。当需要读入一个页面时,便可利用空闲物理块链表中的第一个物理块来装入该页。当有一个未被修改的页要换出时,实际上并不将它换出内存,而是把该未被修改的页所在的物理块挂在自由页链表的末尾。
在置换一个已修改的页面时,也将其所在的物理块挂在修改页面链表的末尾。利用这种方式可使已被修改的页面和未被修改的页面都仍然保留在内存中。当该进程以后再次访问这些页面时,只需花费较小的开销,使这些页面又返回到该进程的驻留集中。当被修改的页面数目达到一定值时,例如64个页面,再将它们一起写回到磁盘上,从而显著地减少了磁盘I/O的操作次数。一个较简单的页面缓冲算法已在MACH操作系统中实现了,只是它没有区分已修改页面和未修改页面。
4,“抖动”与工作集
4.1,多道程序度与“抖动”
1,多到程序度与处理机的利用率
由于虚拟存储器系统能从逻辑上扩大内存,这时,只需装入到一个进程的部分程序和数据便可开始运行,故人们系统在系统中能运行更多的进程,即增加多道程序度,以提高处理机的利用率。L是缺页之间的平均时间,S是平均缺页服务时间。
2,产生“抖动”的原因
同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况。
4.2,工作集
1,工作集的基本概念
2,工作集的定义
所谓工作集,是指在某段时间间隔Δ里,进程实际所要访问页面的集合。虽然程序只需少量的几页在内存便可运行,但为了较少地产生缺页,应将程序的全部工作集装入内存中。然而我们无法事先预知程序在不同时刻将访问那些页面,故仍只有像置换算法那样,用程序的过去某段时间内的行为作为程序在将来某段时间内的行为的近似。
4.3,“抖动”的预防方式
1.采取局部置换策略:当某进程发生缺页时,只能在分配给自己的内存空间内进行置换,不允许从其它进程去获得新的物理块,即使“抖动”也不影响其它进程。
2.把工作集算法融入到处理机调度中:从外存调入作业时,先检查每个进程在内存的驻留页面是否足够多。如果已经足够多,新作业的调入不会导致缺页率的增加;反之,如果某些进程的页面不足,应首先为那些缺页率居高的作业增加新的物理块。
3 .利用“L=S”准则调节缺页率:利用“L=S”准则调节多道程序度,L是缺页之间的平均时间,S是平均缺页服务时间,即用于置换一个页面所需的时间。L<S,频繁发生缺页;L>S,很少缺页;L与S接近,磁盘和处理机都可达到它们的最大利用率。
4.选择暂停的进程:挂起某些暂停的进程。
5,请求分段存储管理方式
在分段基础上所建立的请求分段式虚拟存储器系统,则是以分段为单位进行换入、换出的。在请求分段系统中,程序运行之前,只需先调入少数几个分段(不必调入所有的分段)便可启动运行。当所访问的段不在内存中时,可请求OS将所缺的段调入内存。
5.1,请求分段中的硬件支持
1,请求段表机制
在请求分段式管理中所需的主要数据结构是请求段表。在该表中除了具有请求分页机制中的访问字段A、修改位M、存在位P和外存地址四个字段外,还增加了存取方式字段和增补位。
- 存取权限:如读R,写W,执行X。
- A访问字段:段访问统计, 在近期内被访问的次数,或近一次访问到现在的时间间隔,为淘汰算法提供依据。
- M修改位:该段是否被修改过。
- P存在位(状态位):该段在主存否。
- 增补位:该段动态增长过否。
- 外存始址:该段外存起始盘块号。
2,缺段中断处理
请求分段系统中采用的是请求调段策略。每当发现运行进程所要访问的段尚未调入内存时,便由缺段终中断机构产生一缺段中断信号,进入OS后,由于缺段中断处理程序将所需的段调入内存。与缺页中断机构类似,缺段中断机构同样需要在一条指令的执行期间产生和处理中断,以及在一条指令期间,可能产生多次缺段中断。但由于分段式信息的逻辑单位,因而不可能出现一条指令被分割在两个分段中,和一组信息被分割在两个分段中的情况。
3,地址变换机构
因为被访问的段并非全在内存,所以在地址变换时,若返现所要访问的段不在内存,必须先将所缺的段调入内存,并修改段表,然后才能利用段表进行地址变换。
5.2,分段的共享与保护
1,共享段表:为了实现分段共享,可在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项。表项中记录了共享段的段号、段长、内存始址、存在位等信息,并记录了共享此分段的每个进程的情况。共享段表如图所示。
- 共享进程计数count。记录有多少个进程需要共享该分段。
- 存取控制字段。不同进程对该段的存取权限。
- 段号。对于一个共享段,不同的进程可以各用不同的段号去共享该段。
2,共享段的分配与回收
(1)共享段的分配
对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写有关数据,把count置为1;
之后,当又有其它进程需要调用该共享段时,由于该共享段已被调入内存,故此时无须再为该段分配内存,而只需在调用进程的段表中增加一表项,填写该共享段的物理地址;
在共享段的段表中,填上调用进程的进程名、存取控制等,再执行count =count+1操作,以表明有两个进程共享该段。
(2)共享段的回收
当共享此段的某进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行count =count-1操作。若结果为0,则须由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,表明此时已没有进程使用该段;否则(减1结果不为0),只是取消调用者进程在共享段表中的有关记录。
3,分段保护
在分段系统中,由于每个分段在逻辑上是独立的,因而比较容易实现信息保护。目前,常采用以下几种措施来确保信息的安全。
(1)越界检查
在段表寄存器中放有段表长度信息;同样,在段表中也为每个段设置有段长字段。在进行存储访问时,首先将逻辑地址空间的段号与段表长度进行比较,如果段号等于或大于段表长度,将发出地址越界中断信号;其次,还要检查段内地址是否等于或大于段长,若大于段长,将产生地址越界中断信号,从而保证了每个进程只能在自己的地址空间内运行。
(2)存取控制检查:在段表的每个表项中,都设置了一个“存取控制”字段,用于规定对该段的访问方式。通常的访问方式有:
- 只读,即只允许进程对该段中的程序或数据进行读访问。
- 只执行,即只允许进程调用该段去执行,但不准读该段的内容,也不允许对该段执行写操作。
- 读/写,即允许进程对该段进行读/写访问。
(3)环保护机构:这是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。OS核心处于0环内;某些重要的实用程序和操作系统服务占居中间环;而一般的应用程序则被安排在外环上。在环系统中,程序的访问和调用应遵循以下规则:
- 一个程序可以访问驻留在相同环或较低特权环中的数据。
- 一个程序可以调用驻留在相同环或较高特权环中的服务。