程序的几种装入方式:
1.绝对装入方式:用户程序编译后将产生绝对地址的目标代码,绝对装入程序按照装入模块的地址将程序和数据装入内存。程序中所使用的绝对地址既可以在编译或汇编时给出,也可由程序员直接赋予,适用于单道程序环境。
2.可重定位装入方式:多道程序环境下,编译程序不可能预知经编译后所得到的目标模块应放在内存的何处。因此,对于用户程序编译所形成的若干个目标模块,它们的起始地址通常都是从0开始,程序中的其他地址都是相对于其实地址计算的,它可以根据内存的具体情况将模块装入到内存的适当位置。
3.动态运行时的装入:可重定位的装入方式不运行程序运行时在内存中移动位置,因为移动位置需要修改程序和数据的地址。动态运行时的装入方式在把装入模块装入内存之后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才运行。因此,装入内存后的所有地址都仍是逻辑地址。
程序链接的几种方式:
1.静态链接:在程序运行之前,先将各个目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开
2.装入时的动态链接:源程序编译成的目标模块,在装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存
3.运行时的动态链接:将对某些模块的链接推迟到程序执行时才运行。亦即,在执行的过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到改模块,并将之装入内存,将其链接到调用者模块上
连续分配内存的几种方式:
1. 单一连续分配:单道程序环境时,整个内存的用户空间由该程序独占
2.固定分区分配:将整个用户空间划分微若干个固定大小区域,在每个分区只装入一道作业。当有一个空闲分区时,便可以再从外存的后备作业队列中选择一个适当大小的作业装入该分区。
3.动态分区分配:根据进程的需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构,分区分配算法和分区分配与回收操作这样三方面的问题。
4.基于顺序搜索的动态分区分配:
1>首次适应算法:这个算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止。然后在按作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链首至链尾都找不到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配失败,返回。
2>循环首次适应算法:与首次适应算法相比,不再是每次从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区。
3>最佳适应算法:每次为作业分配内存时,总是把能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
4>最坏适应算法:它在扫描整个空闲分区或链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用,以至于存储器中缺乏大的空闲分区。
5.基于索引搜索的动态分区分配
1>快速适应算法:又称分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表。同时在内存中设立一张管理索引表,其中每一个索引表项对应了一种空闲分区类型,并记录该类型空闲分区链表表头指针,空闲分区的分类是根据进程常用的空间大小进行划分的。
2>伙伴系统(后面讲)
3>哈希算法:利用哈希快速查找的优点,以及空闲分区在可利用空闲分区表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。
6.动态可重定位的分区分配:
1>紧凑:将内存中所有的作业进程移动,使它们全都邻接。这样,即可把原来分散的多个空闲小分区拼接成一个大分区,可将一个作业装入该区。这种通过移动内存中作业的位置,把原来多个分散的小分区拼接成一个大分区的方法称为紧凑。紧凑会造成内存地址发生变化。
2>动态重定位:作业装入内存后的所有地址是逻辑地址,而将相对地址转换为绝对地址的工作被推迟到程序指令要真正执行时进行。
3>动态重定位分区分配算法:与动态分区分配算法基本相同,差别仅在于:在这种分配算法中,增加了紧凑的功能。
对换:把内存中暂时不能运行的进程或者暂时不用的程序或数据换出到外存上,以便腾出足够的空间,再把已具备运行条件的进程或进程所需要的程序和数据换入内存。
对换的类型:
1.整体对换:以整个进程为单位进程对换
2.页面对换:以进程的一个"页面"或"分段"为单位进行的
进程的换出和唤入:
1.进程的唤出:首先选择处于阻塞和睡眠状态的进程,然后从中选出优先级较低最低的,有时还需要考虑进程在内存中驻留的时间。如果系统中已无阻塞进程,便选择优先级最低的。在对进程唤出时,只能唤出非共享的程序和数据段,然后申请内存,启动磁盘,将该进程的程序和数据传送到磁盘的对换区上。若传送过程未出现错误,便可回收该进程所占用的空间。
2.进程的唤入:首先查看PCB集合中所有进程的状态,从中找出就绪状态和唤出的进程。当有多个这样的进程时,它将选择已唤出时间最久的,并未它申请内存
分页储存管理方式:将用户程序的地址空间分为若干个固定大小的区域,称为"页"或"页面"。相应地,也将内存空间分为若干个物理或页框,页和块的大小相同。这样可将用户程序的任一页放入任一物理快中,实现离散分配。
分段存储管理方式:它把用户空间分为若干个大小不同的段,每段定义一组相对完整的信息。在存储器分配时,以段为单位,这些段在内存中可以不想邻接。
段页时储存管理方式:分页和分段两种存储管理方式结合的产物,它同时具有两者的优点。
页面和物理块:分页存储管理将进程的逻辑地址空间分为若干个页,并未各页加以编号。相应地,也把内存的物理地址空间分成若干个块,同样为它们加以编号。在为进程分配内存时,以块为单位,将进程中的若干个页分别装入到多个可以不相邻接的物理快中。
页面大小:页面过小,会导致进程的页表过长,占用大量内存。页面过大,会使页内碎片增大。页面大小通常为1KB~8KB
页面地址结构:页号和位偏移量
页表:记录着进程中各个页面在内存中的位置,页表是页号到物理块号的地址映射
地址变换机构:为了将用户地址空间的逻辑地址转换为内存空间中的物理地址,就是将逻辑地址中的页号转换为内存中的物理块号
1.基本的地址变换机构:当进程要访问某个逻辑地址时,分页地址变换机构会以页号为索引去检索页表(页表大多存在内存中,在系统中只设置了一个页表寄存器)。在执行检索之前,先将页号与页面长度进行比较,若未发生越界错误,则将页表地址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,再将该页的物理块号装入物理地址寄存器中,与此同时,也把有效的地址寄存器中的页内地址送入物理地址寄存器的块内地址段中,这样便完成了转换
2.具有块表的地址变换机构:基本的地址变换机构需要二次访问内存,为了提高地址变换速度,可在地址变换机构中增设一个具有并行查询能力的特殊高速缓冲寄存器,称为“块表”。每次地址变换机构将页号送入高速缓冲寄存器,并将次页号与高速缓存中的所有页号进行比较,若其中没有与次相匹配的在去访问内存中的页表。
两级页表:由于页表占用进程的空间过大(1MB),而且需要连续的内存,两级页表则可以解决这个问题。可利用将页表进行分页的方法,使每个页面的大小与内存物理块相同,然后离散地将各个页面分别存放在不同的物理块中,但要为离散的分配的页表再建立一张页表,称为外层页表。外层页表中的每个页表项中所存放的是某页表分页的首址。为了方便地址转换,同样需要增设一个外层页表寄存器,用于存放外层页表的始址,并利用逻辑地址中的外层页号作为外层页表的索引,从中找到指定页表的分页地址,再通过该地址找到对应的页表项。在进程运行时,每次仅把当前需要的一批页表项调入内存,以后再根据需要陆续调入,这样能节省空间。
反置页表:为每一个物理块设置一个页表项,并将它们按物理块的编号进行排序,其中的内容则是页号和其所属进程的标识符。在利用反置页表进行进行地址变换时,是根据进程标识符和页号,去检索反置页表。若检索了整个反置页表仍未找到匹配的页表项,则表明此页尚未装入内存。反置页表中只包含已经调入内存的页面,并未包含尚未调入内存的页面。因此,还必须为每个进程建立一个外部页表,该页表包含了各个页在外存的物理位置,通过它可将所需之页面调入内存。
分段储存方式的引入:
1.方便编程:用户把自己的作业按逻辑关系划分为若干个段,每个段都是从0开始编址,并由自己的名字和长度。因此。程序们都迫切地需要访问的逻辑地址是由段名和段内偏移量决定的。
2.信息共享:在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。分页系统中的"页",只是存放信息的物理单位,并无完整的逻辑意义,这样,一个可被共享的过程可能需要占用数十个页面。
3.信息保护: 信息保护同样是以逻辑单位为基础的,而且经常是以一个过程,函数或文件为基本单位进行保护的。
4.动态增长:实际应用中,往往存在着一些段,尤其是数据段需要动态增长
5.动态链接:在程序的运行过程中,当需要某个目标程序时,是将该段(目标程序)调入内存并进行链接。
段表:一张段映射表,每个段在表中占有一个表项,其中记录了该段在内存中的起始地址和段长度。
分段地址变换机构:系统中设置了段表寄存器,用于存放段表始址和段表长度TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。若未发生越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后再检查段内地址是否超过该段的段长。
分段和分页的主要区别:
1>页是信息的物理单位。分页是系统为了消减内存的外零头,提高内存的利用率,是系统的行为。分段中的段则是信息逻辑单位,它通常包含一组意义相对完整的信息,是为了满足用户的需要。
2>页的大小由系统决定,每个系统中只能有一种大小的页面。而段的长度不固定,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
3>分页的用户程序地址空间是一维的,是单一的线性地址空间,程序员只需利用一个记忆符即可表示一个地址。分段是用户的行为,在分段系统中,用户程序的地址空间是二维的,程序员在标识一个地址时,即需给出段名,又需给出段内地址。
段页式存储原理:先将用户程序分为若干个段,再把每个段分成若干个页,并未每一个段赋予一个段名。在段页式系统中,其地址结构由段号,段内页号和页内地址三部分组成。
段页式存储地址变换:系统配置一个段表寄存器,其中存放段表始址和段长TL。进行地址变换时,利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号来获的对应页的页表项位置,从中读出该页所在的物理块号,在利用块号和页内地址来构成物理地址。