[总结]操作系统真是博大精深(三)

来源:互联网 发布:淘宝已好评怎么修改 编辑:程序博客网 时间:2024/05/16 09:01

存储器管理

1、理想中的存储器:更大、更快、更便宜的非易失性存储器。

2、程序的装入

  ⑴绝对装入方式:绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址和实际内存地址完全相同,故不需要对程序和数据的地址进行修改。

  ⑵可重定位装入方式:装入模块装入内存后,装入模块中的所有逻辑地址与实际装入内存的物理地址不同。通常把装入时对目标程序中指令和数据的修改过程称为重定位。通常地址变换一次完成,以后不再改变,故称为静态重定位。

  ⑶动态运行时装入方式:动态运行时的装入程序,在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址都仍是相对地址。

3、程序的链接

  ⑴静态链接方式

  ⑵装入时动态链接:用户源程序经编译后所得到的目标模块,是在装入内存时,边装入边链接的。

  ⑶运行时动态链接:这种链接方式是将对某些模块的链接推迟到执行时才执行,亦即,在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存, 把它链接到调用者模块上。

4、连续分配方式

  ⑴单一连续分配(单道程序内存分配方式)

①内存分为两个区域:系统区,用户区。每次把一个应用程序装入到用户区运行,由它和操作系统来共享内存。当它运行结束后,操作系统再装入一个新的程序把它覆盖。

②优点:简单、开销小,易于管理;缺点:每次只能运行一个程序;对那些使用空间较少的程序,造成内存浪费;适合于单用户、单任务的OS。

  ⑵分区存储管理

    ①内存分为两大区域:系统区,用户区。又把用户区划分为若干分区(partition),分区大小可以相等,也可以不等。一个进程占用一个分区。

    ②特点:适合于多道程序系统和分时系统,支持多个程序并发执行。分为两类:固定分区和可变分区。

  ⑶固定分区存储管理:各个用户分区的个数、位置和大小一旦确定以后,就固定不变。

①为了满足不同程序的存储需要,各分区的大小可相等,也可不等。分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象);分区大小不等:多个小分区、适量的中等分区、少量的大分区。当进程到来时,根据它的大小,把它放置到相应的输入队列当中,等待合适的空闲分区。

②多个输入队列:对于每一个用户分区,都有一个输入队列。当一个新的进程到来时,把它加入到某个输入队列当中,该输入队列所对应的分区,是能够装下该进程的最小分区。缺点:可能出现小分区的输入队列是满的,而大分区的输入队列却空着,从而造成资源的浪费。

③单个输入队列:对于所有的用户分区,只有一个统一的输入队列。当一个新进程到来时,把它加入到该输入队列当中,然后当某个分区空闲时:离队首最近的、能装入该分区的进程被选中;搜索整个队列,选择能装入该分区的最大进程。

④数据结构:设置内存分配表:分区号、起始地址、长度、状态、进程名。内存分配:放入输入队列,然后采用首次适应算法、最佳适应算法等。内存回收:简单。

⑤优点:易于实现,开销小。缺点:内存利用率不高,内碎片造成很大浪费。所谓内碎片,即进程所占用分区之内的未被利用的空间;分区的总数固定,限制了并发执行的程序个数,不够灵活。

  ⑷可变分区存储管理:分区不是预先划分好的固定区域,而是动态创建的。

    ①系统生成后,操作系统会占用内存的一部分(一般在内存地址低端),其余空间为一个完整的大空闲区。当一个程序要求装入内存运行时,系统从这个空闲区中划分一块分配给它,当程序完成后释放所占用的存储区。

    ②特点:在可变分区当中,分区的个数、位置和大小都是随进程的进出而动态变化的,非常灵活,避免了在固定分区中因分区大小不当所造成的内碎片,提高了内存利用率;有外碎片,即各个占用分区之间难以利用的空闲分区(通常是小空闲分区);使得内存的分配、回收和管理更为复杂。

    ③数据结构:空闲分区表:用于为内存中每个尚未分配出去的分区设置一个表项,每个分区的表项包含分区序号、分区始址及分区大小等表目。空闲分区链:为了实现对空闲分区的分配和链接,在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接各分区的前向指针;再分区尾部则设置一后向指针;然后,通过前、后向指针将所有的分区链接成一个双向链。

    ④分区分配算法:当一个新的进程来到时,需为它寻找某个空闲分区,其大小必须大于或等于该进程的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为“占用”,而另一个分区为余下部分并标记为“空闲”。分区的先后次序通常是从内存低端到高端。分区分配算法主要有:首次适应算法、循环首次适应、最佳适应算法、最坏适应算法。

    ⑤首次适应算法(FF):将空白区按存贮顺序链成一个队列,用一指针指向队首分配时将找到的第一个满足要求的空白区分配给它。特点:在高地址空白区中保持较大空白区。

      循环首次适应(NF):将空白区组成环状队列,按循环顺序寻找空白区。特点:使得小空白区均匀分布,易于与其它空白区合并。

      最佳适应算法(BF):将空白区按大小排成队列,寻找时总是以最小的空白区开始,找到第一个合适的分区。特点:最佳地利用分区;开销比较大,并不是最好算法。

    ⑥分区回收算法:当一个进程运行结束,释放它所占用的分区后,需要将相邻的几个空闲分区合并一个大的空闲分区。在分区回收后,可以很方便地更新分区链表。

  ⑸可重定位分区分配

    ①经过一段时间的分配与回收,内存中存在着很多不连续的很小的空闲分区(外碎片)。当一个新进程到来时,这些小的空闲区都不足以满足分配要求,但其总和满足分配要求。这就是(外)碎片问题。

    ②内存紧凑:把所有的进程尽可能地往地址低端移动,相应的,那些空闲的小分区就会往地址的高端移动,从而形成一个大的空闲区。所有进程的移动需要大量的CPU时间。

    ③实现:存储器一侧设置重定位寄存器,与处理机一侧相对地址结合计算出实际地址。

5、对换

  ⑴内存中某些进程,等待事件发生而被阻塞,占用了大量内存空间。许多作业在外存等待,因无内存无法进入内存运行。所谓对换,就是系统根据需要把主存中暂时不运行的某个(或某些)作业部分或全部移到外存,而把外存中的某个(或某些)作业移到相应的主存区,并使其投入运行。包括“进程对换”,“页面对换”,“分段对换”。

  ⑵通常把外存分为文件区和对换区,文件区:存放文件,需要提高文件存储空间利用率,离散分配方式;对换区:用于存放从内存换出的进程,需要提高进程换入和换出的速度,连续分配方式。对外存空闲盘块管理:空闲分区表,空闲分区链,分配算法与分配过程同其他连续分配方式。

6、分页存储管理

  ⑴分区存储管理方案的一个特性是连续性,即系统对每个程序都分配一片连续的内存区域。连续性导致了碎片问题(内碎片和外碎片),降低了内存资源的利用率。对于内碎片,难以避免;对于外碎片,用于合并碎片的内存紧缩技术又需要花费大量的CPU时间。

  ⑵页式存储管理方案,目的是打破存储分配的连续性,使得一个程序的逻辑地址空间可以分布在若干个离散的内存块上,从而达到充分利用内存,提高内存利用率的目的。

  ⑶把物理内存划分为许多个固定大小的内存块,称为物理页面,或页框。把逻辑地址空间划分为大小相同的块,称为逻辑页面,或简称页面。

  ⑷页面大小为2n,一般在512字节到8K字节之间;对某特定机器,其地址结构是一定的。这种划分是由系统自动完成的,对用户是透明的。当一个用户程序装入内存时,以页面为单位进行分配。若要运行一个大小为n个页面的程序,需要有n个空闲的物理页面把它装入,这些页面不必是连续的。为各页加以编号,从0开始,如第0页、第1页等;同样为内存块加以编号,如0#块、1#块等等。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”

  ⑸页表:系统为每一个进程都建立了一个页表,页表给出了逻辑页面号和具体内存块号(物理页面号)之间的对应关系。

  ⑹内存的分配:计算一个进程所需要的页面数N,并查看位示图,看是否还有N个空闲页面;若有,则申请一个页表,其长度为N,并把页表的起始地址填入PCB;分配N个空闲的物理页面,将其编号填入页表;修改位示图(0→1,空闲页面数-N)

  ⑺内存的回收:当一个进程运行结束,释放它所占用的内存空间后,需要对这些物理页面进行回收。对于每一个物理页面,根据它的编号计算出它在位示图当中的相应位置,并将相应位的值从1改成0;修改位示图中的空闲页面数:加上N。

  ⑻地址映射:一个进程的各个连续的逻辑页面,被分散地装入到内存的各个物理页面当中,必须采用动态的地址映射方法,在程序运行过程中,将逻辑地址转换为物理地址,以确保数据访问和指令运行的正确性。

  ⑼逻辑地址划分:页号、页内地址。把逻辑地址划分为两部分:逻辑页面号和页内偏移地址。这种划分是由系统自动完成的,对用户是透明的。由于页面的大小一般为2的整数次幂,因此,地址的高位部分即为页号,低位部分即为页内偏移地址。页面编号从0开始,页内偏移地址也是相对于0编址。页号 = 虚地址 / 页大小;位移量 = 虚地址 % 页大小。

  ⑽页表的具体实现:页表保存在内存当中;设置一个页表基地址寄存器,用来指向页表的起始地址;设置一个页表长度寄存器,用来指示页表的大小。

  ⑾在现有的方案中,每一次访问内存(数据/指令)时,都要做两次访问内存的工作,第一次是读页表,第二次是真正访问数据/指令。这样,降低了存取速度,将会影响整个系统的使用效率。为缩短页表的查找时间,可以采用一种特殊的快速查找硬件:TLB (Translation Lookaside Buffer) 或称associativememory,用来存放那些最常用的页表项。

  ⑿优点:没有外碎片,内碎片的大小不超过页面的大小;一个程序不必连续存放;便于管理。缺点:程序必须全部装入内存;系统必须为每个进程维护一张页表。

  ⒀多级页表:通过二级页表的地址映射访问主存存取数据需要三次访问主存(一次页目录,一次页表,最后是数据所在物理地址),所需时间是原来的三倍。

7、分段存储管理

  ⑴页式存储管理(和分区存储管理)只有一个逻辑地址空间,即一维的线性连续空间,从0 到某个最大的逻辑地址。但是从程序员的角度来说,一个程序是由一组模块(片段)所组成的,每个片段是一个逻辑单元,为了体现这些逻辑单元的独立性,便于它们的共享、保护和修改,人们提出了段式存储管理的方法。

  ⑵对于程序当中的每一个逻辑单元,设立一个完全独立的地址空间,称为“段”。在每个段的内部,是一维的线性连续地址,从0一直到某个最大的地址。每个段的大小一般是不相等的,它所包含的内容也是不一样的。对于物理内存来说,采用可变分区(动态分区)的管理方法。对于物理内存来说,采用可变分区(动态分区)的管理方法,当一个程序需要装入内存时,以段为单位进行分配,把每一个段装入到一个内存分区当中,这些内存分区不必是连续的。

  ⑶在段式存储管理当中,为了指明用户空间当中的某个地址,程序必须给出一个二元的地址组:〈段号,段内偏移地址〉,段表:段号、所对应内存分区的起始地址、段长度,系统为每一个进程都建立了一个段表,它给出了进程当中的每一个段与它所对应的内存分区之间的映射关系。

  ⑷段表保存在内存当中,设置一个段表基地址寄存器(Segment-tablebase register,STBR),用来指向内存当中段表的起始地址,设置一个段表长度寄存器(Segment-table length register,STLR),用来指示段表的大小,即程序当中的段的个数。

  ⑸优点:程序通过分段来划分多个模块,每个模块可以分别编写和编译,可以针对不同类型的段采取不同的保护,可以按段为单位来进行共享;一个程序不必连续存放,没有内碎片;便于改变进程所占用空间的大小。缺点:程序必须全部装入内存、外碎片等。

  ⑹可重入代码:允许多个进程同时访问的代码。此代码不允许任何进程对之进行修改。

8、分页与分段对比

  ⑴分页是出于系统管理的需要,分段是出于用户应用的需要。页式:为减少碎片,提高内存的使用效率,因此把内存划分为许多个固定大小的物理页面。相应的,把逻辑地址空间也划分为大小相同的逻辑页面。段式:为了实现程序当中的各个逻辑单元的独立性,便于它们的共享、保护和修改,从而为每一个逻辑单元设立一个单独的“段”。相应的,在物理内存的分配和回收上,采用可变分区存储管理方法。

  ⑵程序员对所采用的存储管理技术的关注。页式:对于程序员而言,页式存储管理完全是透明的,不必关心。对逻辑地址空间的分页,是由系统自动完成的,每个页面当中的内容,也是偶然的。程序员甚至不知道分页的发生;段式:程序员知道各个逻辑单元的存在,因此可以对它们进行不同的处理。

  ⑶页大小是系统固定的,而段大小则通常不固定。

  ⑷通常段比页大,因此段表比页表短,可以缩短查找时间,提高访问速度。

  ⑸从逻辑地址的表示来看:页式:逻辑地址是一维的线性连续地址,各模块在链接时必须组织成同一个地址空间;段式:逻辑地址是二维的,即段号和段内的偏移地址,各个模块在链接时可以为每个段组织一个地址空间。

  ⑹从退化形式来看:页式:如果页面比较大,能装下整个程序,那么就退化为一种固定分区的方法;段式:如果段的个数为1,那么就退化为一种可变分区的方法。

9、段页式存储管理方式

  ⑴基本思想:先把程序划分为段,然后在段内分页。逻辑地址:段号、段内地址(页号、页内地址)。内存划分:按页式存储管理方案,内存分配:以页面为单位进行分配。

  ⑵具体实现:段表:记录了每一段的页表起始地址和页表长度,而不是该段所在内存分区的起始地址。页表:记录了逻辑页面号与物理页面号之间的对应关系。(每一段有一个,一个程序可能有多个页表)。需要的硬件支持:段表基地址寄存器(STBR)和段表长度寄存器(STLR)。

10、覆盖和交换技术

  ⑴如果是程序太大,超过了内存的容量,可以采用覆盖(overlay)技术,只把需要的指令和数据保存在内存当中。如果是程序太多,超过了内存的容量,可以采用交换(swapping)技术,把暂时不能执行的程序送到外存中。

  ⑵覆盖:其目标是在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。原理:把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。将程序的必要部分(常用功能)的代码和数据常驻内存;可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存;不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,即这些模块共用一个分区。

  ⑶覆盖缺点:由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度;覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省。

  ⑷交换:多个进程并发运行,可将暂时不能运行的进程送到外存,从而获得空闲内存空间来装入新进程,或读入保存在外存中而目前到达就绪状态的进程。交换单位为整个进程的地址空间。常用于多道程序系统或小型分时系统,与分区存储管理配合使用。

  ⑸只当内存空间不够或有不够的危险时换出;交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取;程序换入时的重定位:最好采用动态地址映射的方法。

  ⑹交换缺点:以进程作为交换的单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销。

11、虚拟存储器

  ⑴象覆盖技术那样,不是把程序的所有内容都放在内存中,因而能够运行比当前的空闲内存空间还要大的程序。但做得更好,由系统自动来完成,无须程序员的干涉;象交换技术那样,能够实现进程在内存与外存之间的交换,因而获得更多的空闲内存空间。但做得更好,只对进程的部分内容在内存和外存之间进行交换。

  ⑵局部性原理(principle oflocality):指程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。具体表现为时间局部性和空间局部性。程序的局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的效果的。

    时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。

  ⑶根据局部性原理,只需将用户进程的部分实体装入内存,通过局部实体之间的内外存交换,仅将进程当前需要执行的部分实体存于内存,且一进程的内存空间不必连续。虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存进行扩充的一种存储器系统。

  ⑷虚拟存储器建立在离散分配的存储器管理方式基础之上。分页请求系统:在分页系统的基础上,增加了请求调页功能,页面置换功能所形成的页式虚拟存储系统。分段请求系统:在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。

  ⑸性质:多次性-多次调入内存;对换性-作业在运行中换进、换出;虚拟性-逻辑上扩充容量。

12、请求分页存储管理

  ⑴当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行。在运行的过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行。

  ⑵页表项:

    ①驻留位:表示该页是在内存还是在外存。如果等于1,表示该页位于内存当中,即该页表项是有效的,可以使用;如果等于0,表示该页当前还在外存当中,如果访问该页表项,将导致缺页中断。

    ②保护位:表示允许对该页做何种类型的访问,如只读、可读写、可执行等。

    ③修改位:表明此页在内存中是否被修改过。当系统回收该物理页面时,根据此位来决定是否把它的内容写回外存。

    ④访问位:如果该页面被访问过(包括读操作或写操作),则设置此位。用于页面置换算法。

  ⑶缺页中断:每当用户程序所要访问的页面不在内存时,产生一缺页中断,请求OS将所缺之页调入内存。与一般中断的区别:指令执行期间产生和处理;一条指令可能产生多次缺页中断。

  ⑷内存分配策略和分配算法:

    ①最小物理块数是指能保证进程正常运行所需的最小物理块数。当系统为进程分配的物理块数少于此值时,进程将无法运行。与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。

    ②在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。

    ③物理块分配算法:平均分配算法;按比例分配算法;考虑优先权的分配算法。

  ⑸调页策略:预调页策略:将那些预计在不久之后便会被访问的程序或数据所在的页面,预先调入内存。请求调页策略:发现要访问的页面不在内存,请求OS调入。

在请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。由于对换区是采用连续分配方式,而文件区是采用离散分配方式,故对换区的磁盘I/O速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况:系统拥有足够的对换区空间、系统缺少足够的对换区空间、UNIX方式。

14、页面置换算法

  ⑴功能:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换。目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体来说,把未来不再使用的或短期内较少使用的页面换出,通常只能在局部性原理指导下依据过去的统计数据来进行预测

  ⑵页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键(time-critical)的应用进程。实现的方法是:在页表中添加锁定标志位。

  ⑶最优置换算法(Optimal):淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。通常可保证获得最低的缺页率。这只是一种理想情况,在实际系统中是无法实现的,因为操作系统无从知道每一个页面要等待多长时间以后才会再次被访问。可用作其他算法的性能评价的依据。

  ⑷先进先出置换算法(FIFO):选择在内存中驻留时间最长的页面并淘汰之。性能较差,调出的页面有可能是经常要访问的页面,并且有Belady异常现象。

  ⑸最近最久未使用置换算法(LRU):当一个缺页中断发生时,选择最久未使用的那个页面,并淘汰之。是对最优页面置换算法的一个近似,其依据是程序的局部性原理。

  ⑹Clock置换算法:为每页设置一位访问位,再将内存中的所有页面都通过链接指针链成一个循环队列。置换算法在选择一页淘汰时,只须检查其访问位,如果是0,就选择该页换出;若为1,则重新将它复0,暂不换出给该页第二次驻留内存的机会。当检查到队列中最后一个页面时,若访问位仍为1,再返回队首检查第一个页面。

15、请求分段存储管理

  ⑴分段的共享:共享进程记数count:用于记录有多少各进程需要共享该分段。存取控制字段:用于控制进程的存取权限。段号:不同的进程可以使用不同的段号去共享同一个段。

⑵分段保护:越界检查;存取控制检查;环保护机构:低编号的环具有高优先级,OS核心在0环,操作系统服务在中间环,一般应用程序在外环,一个程序可以访问驻留在相同环或较低特权环中的数据,一个程序可以调用驻留在相同环或较高特权环中的服务。

16、Linux的内存管理

  ⑴Linux操作系统采用了请求式分页虚拟存储管理方法。 系统为每个进程提供了4GB的虚拟内存空间。各个进程的虚拟内存彼此独立。Linux把进程的虚拟内存分成两部分,内核区和用户区,操作系统内核的代码和数据等被映射到内核区,进程的可执行映像(代码和数据)映射到虚拟内存的用户区。

  ⑵Linux操作系统不使用段的概念但是必须兼容Intel处理器的两次地址转换。所有段的base地址都是0。在Linux下,逻辑地址与线性地址总是一致。

  ⑶buddy算法:Buddy算法是把内存中的所有页面按照2n划分,其中n=0~5,对一个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分。划分后形成了大小不等的存储块,称为页面块,简称页块。包含1个页面的页块称为1页块,包含2个页面的称为2页块,依此类推。对于每种页面块按前后顺序两两结合成一对Buddy“伙伴”,按照1页面划分后,0和1页、2和3页…是1页块Buddy,按照2页面划分,0-1和2-3、4-5和6-7…是2页块Buddy。位图中每一位(bit)表示一对Buddy页面的使用情况,当一对Buddy的两个页面块中有一个是空闲的,而另一个全部或部分被占用时,该位置1,当这两个页面块都是空闲,或都被全部或部分占用时, 对应的位置0。

原创粉丝点击