第三章unix的存储.ppt
《第三章unix的存储.ppt》由会员分享,可在线阅读,更多相关《第三章unix的存储.ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章第三章 UNIX的存储管的存储管理理 3.1 UNIX存储管理简介 UNIX将内存划分为固定尺寸的片或页面。页面的大小均为2的整次幂,通常为4KB。UNIX采用了虚存系统,进程空间中连续的页在物理内存中不必是连续的。内存管理子系统维护进程的逻辑(虚)页与实际的物理内存之间的映射。当请求一个连续的内存块时,内存管理子系统可以通过分配若干物理上不连续的页面来满足这个请求。虚存系统大大简化了页面分配的工作。内核为空闲页面维护一个键表结构。当进程需要页面时,内核从空闲键表中去掉足够的页面,当释放页面时,内核再将它们键入键表结构中。页的实际物理位置是无关紧要的。页面级分配器有两个主要的客户(下图)
2、。一个是虚存系统的分页系统,它为用户进程分配页面。在许多UNIX系统中,分页系统还为磁盘缓冲捉供页面。另一个客户是内核内存分配器,它为不同的内核子系统提供各种尺寸的内存诀,遁常这些内存块仅使用很短的一段时间。物理内存页面级分配器核心内存分配器分页系统网络缓冲器Proc结构节点、文件描述符 用户进程块缓冲 图3.1 内核中的内存分配 在各种UNIX系统中,大多数分配请求所要求的内存大小都远小于一个页面的大小,很明显不能用页面级分配器来实现这些功能。我们需要一套独立的机制来实现更细粒度上的内存分配。一个简单解决方案就是避免动态地进行内存分配。早期的实现的UNIX为i节点、proc结构等数据结构分配
3、固定大小的内存。当系统需要临时保存路径名或网络报文时,系统借用盘块缓冲系统中的缓冲区。此外,针对特殊情况,还设计了一些ad hoc的分配机制,如终驱动程序中的clists结构。这种策略有许多弊端。首先,它极不灵活。各种表或缓冲区的大小在系统启动或编译时就被固定下来,不能根据系统的请求而调整。系统开放人员根据典型系统的工作负荷来选择表格的缺省大小。尽管系统管理人员通常可以调节这些尺寸,但这样做缺少指导依据。如果某些表过于小,这些表就很可能溢出,并使整个系统在没有任何征兆的情况下崩渍。如果使所有的表都尽可能地大,则会造成内存的浪费。留给应用程序的内存相对减少。这也会造成系统的整体性能下降。3.2
4、资源映射图分配器 资源映射图是一系列记录空闲内存的偶对的集合(见下图)。一开始,资源映射图只有一个项,它的base就是内存池的基址,而size就是内存池的大小(见下图(b))。随着客户不断地分配和释放内存,内存池被逐渐打碎。内核为每一段连续的空闲内存分配一项。资源映射图按基址顺序组织,这样就可以很容易地连接两个邻接的空闲内存区。1,1024(a)初识配置576,448256,128576,448128,256832,32544,128288,64128,32(b)在分配256,320,释放256,128后(c)在释放128,128之后(d)在若干操作后 利用资源映射图,内核可以用如下三种策略之
5、一来满足分配请求:最先适应分配。从第一个可以满足请求的空闲块中分配内存。这是最快的算法,但不利于减少碎片。最佳适应匹配。选择可满足请求的空闲块中最小的一个分配内存。该策略的缺点是可能会造成若干非常小的、不可用的空闲块。最差适应匹配。如果没有正合适的空闲诀,选择可瞒足请求的空闲块中最大的一个。这看上去似乎不合常理,但它是处于这样的考虑:保证分配后剩下的空间足够大,以便满足后续的请求。没有一种算法可以很好地匹配所有的使用模式。UNIX使用最先适应匹配第略。下图给出了一个管理1024字节大小内存的资源映射图。它支持两个操作:offset_t rmalloc(size);/*return offset
6、 of allocation region */void rmfree(base,size);资源映射图是一种简单的分配器,它主要有如下优点:算法易于实现。资源映射图并非仅能用于内存分配。它能管理任何有序的,需要分配和释放连续块 的对象(如页表项,以及以后将讲述的信号灯等)。它可精确地分配请求所需的内存,不浪费空间。通常是将请求取整到4或8的倍数。并不强制客户精确地释放分配的内存。分配器完成邻接空闲块的合并,有利于内存的再利用。然而,资源映射图分配器同时存在一些显著的缺点:在分配器运行一段时间后,资源映射图碎片化非常严重,生成许多很小的空闲块。这将使利用率显著下降。随着分片增加,资源图的大小也
7、在增加,为每一片内存区建立一个表项。如果资源 图预配置成固定数目的表项,它就有可能溢出,分配器就不能再记录某些空闲内存 区了。如果资源图动态的增长,它需要另外一个分配器来为自己分配内存。这成了递归问 题了,我们将在后面给出一个解决方案。为了合并邻接的空闲块,分配器必须按基址升序排列它们们。排序的代价很高。在 某些情况下,如资源映射图采用固定尺寸的数组实现时,情况会更糟。既便资源映 射图动态分配并组织成键表,排序仍然是十分耗时的。分配器为找到足够大的空闲诀必须对资源映射图进行线性搜素。随着碎片的增加,极端情况下搜索耗时很大,变得非常慢。尽管可以将内存池尾部的空闲页面返回给分页系统,算法并没有这样
8、设计。资源映射图算法的性能很差。这一点使它不适合成为一个通用内核内存分配器。但它还是适用于某些内核子系统的。System V的进程间通信就使用资源映射图算法管理信号量集合和消息的数据区。4.3BSD的虚存子系统也使用该算法管理映射用户空间的页表。在某些情形下,映射图的管理可以得到改进。遁常可以将映射图的每一项存放在空闲块的前几个字节中。这种方法不需要额外的内存,也不需要动态分配映射图。只需一个全局指向第一个空闲块的指针,每一个空闲块保存它自身的大小和下一个空闲块的指针。这种方法要求空闲块至少有两个字的大小(一个放尺寸,一个存指针)。一般通过强制分配和释放就可以满足这一点。3.3 对换 对换算法
9、的三个部分:对换设备上的空间管理,将进程换出内存,将进程换入内存 3.3.1 对换空间的分配 对换设备是在一个磁盘的可配置段中的一个块设备。内核在对换设备上是以一组连续的磁盘块为单位来分配空间的。算法:malloc 输入:(1)映射地址;(2)所请求的资源的数目 输出:如果成功返回则为地址,否则返回结果0 for(每个映像图表项)if(当前映射图的表项能满足请求的单位数)if(请求数量=该表项中的单位数)从映射图中删除该表项;else 修改该表项的起始地址及单位数目;return(该表项原来的地址)return(0)释放资源时,注意处理以下三种情况:(1)被释放的资源完全填满了映射图中的一个空
10、洞;它们的地址在映射图中刚刚能连接紧接其后和其前的那些表项;(2)被释放的资源部分填满了映射图中的一个空洞;它们的地址在映射图中刚刚能连接紧接其后或其前的那些表项;(3)被释放的资源部分地填充了映射图中的一个空洞;但其地址不连接映射图的任何表项;传统的UNIX系统只是用一个对换设备,但System V的最新版允许使用多个对换设备。内核采用循环算法来选用对换设备,以保证对换设备上有足够大的连续存储空间。管理人员可以动态地创建和取消对换设备。3.3.2 进程的换出 如果内核需要内存空间,它就换出进程。以下事件可引起进程的换出:(1)系统调用fork必须为子进程分配空间;(2)系统调用 brk扩大一
11、个进程的大小;(3)一个进程由于其栈的自然增长而变大;(4)为了运行以前被换出、而现在又应被换人的进程。其中,由fork引起的情况最为突出,它是唯一不能放弃被进程先前占据的内存映象空间的情况。当内核决定了某一进程应从主存中换出时,它使该进程中的每个区的引用数减回,并把那些引用数减为0的区换出。内核分配对换设备空间,并将该进程锁在内存中(对应于上述事件1、2和3),以防止在当前的对换操作过程中,对换进程将它对换出来。内核将区的对换地址保存在区表表项中。内核绕过高速缓冲,直接在对换设备和用户地址空间之间对换数据,并在一次IO操作中对换尽可能多的数据。如果硬件不能一次传送多个页面的话,内核的软件必须
12、循环地一次传送一页内存。因此,数据传送的精确速率及传送机制,除其他因素外,主要依赖于磁盘控制器的能力和存储管理的实现。例如,如果按页面来组织内存,那么,要被换出的数据在物理存储器上就可能是不连续的。内核必须收集被换出的数据的页面地址,磁盘驱动程序也可能要使用这些页面地址来启动IO。对换进程在换出剩下的数据之前要等待每一个IO操作的完成。内核没有将一进程的整个虚地址空间全部写到对换设备上去。仅将已分配给进程的物理存储拷贝到所分配的对换设备空间上去,而忽略那些尚未分配的虚地址。当内核将该进程换回到内存时,它知道该进程的虚地址映射,从而能将该进程重新分配到正确的虚地址上。内核通过把数据读到先前建立的
13、与虚地址位置一致的物理存储器的位置去,消除了一次额外的从数据缓冲到物理存储器的拷贝。下图给出了一个将一个进程的内存映象映射到对换设备上的例子 0 278K1K 432K空64K 573K65K 647K66K 595K空128K 401K空 虚地址的布局 虚地址 物理地址 正文 数据 栈进程空间到对换设备的映射684690下图给出了一个进程换入内存的例子 0 401K1K 370K空64K 788K65K 492K66K 647K空128K 955K空 虚地址的布局 虚地址 物理地址 正文 数据 栈进程空间到对换设备的映射690684 从理论上说,进程的所有存储空间,包括它的U区和核心栈,都可
14、以被换出,尽管在进行敏感操作时,内核可能暂时地将一个区锁在内存。然而,在实际上,如果U区含有进程地址转换表,则内核在实现上就不能换出U区。实现上还要决定是否一个进程能将其自身换出,还是必须由另一个进程来将其换出。1系统调用 fork的对换 在系统调用fork的描述中,假定了父进程找到了足够的内存空间以创建子进程的上下文。否则,内核将换出该进程但并不释放被(父)进程的内存映象所占据的内存。当换出完成后,子进程在对换设备上,父进程将子进程置为就绪状态,然后返回用户态。由于子进程处于就绪状态,所以对换进程总会将其换入内存。内核在内存中总会调度到它,这时子进程完成它的fork系统调用部分然后返回用户态
15、。2扩展对换 如果进程需要的内存比当前已分配给它的内存还多,不管这是由栈增长引起的还是由于调用系统调用 brk所引起的,内核都要进行一次进程的扩展对换 (expansion swap)。内核在对换设备上预定足够的空间以容纳进程的存储空间,其中包括新申请的空间。然后内核修改进程地址转换映射以适应新的虚存空间,但此时并不分配物理存储地址(由于没有可用的物理空间)。最后内核通过一次通常的对换操作将该进程换出,同时将对换设备上新分配的空间清零(见下图)。当以后内核将该进程换入时,将按新的(增加了尺寸的)地址转换映射图来分配物理地址。这样,当该进程恢复执行时就有了足够的空间。0 278K1K 432K空
16、64K 573K65K 647K66K 595K空128K 401K129K -空 虚地址的布局 虚地址 物理地址 正文 数据 栈为扩展对换修改内存映像图684690 3.3.3 进程的换入 进程0,即对换进程,是唯一的将进程从对换设备上换人内存的进程。在系统初始化结束时,对换进程进入一个无限循环,它的任务就是将进程换人或换出。它总是试图将进程从对换设备上换人内存;如果需要主存空间,就将进程换出内。如果对换进程没有事做(例如没有进程要换入)或不能做任何事情(例如没有进程可以被换出),它就睡眠。内核定期地唤醒对换进程。尽管对换进程具有高优先权,内核同调度其他进程一样调度对换进程运行,但对换进程仅
17、在核心态下运行。对换进程不调用系统调用,但使用内核内部函数来执行对换,这是所有核心进程的主要工作方式。当对换进程被唤醒后,它进行换入进程的工作,此时,它查找所有处在“就绪且换出”状态的进程,从中选取换出时间最长者,如果有足够的内存,就将进程换入。将进程换入的操作是换出操作的逆过程:分配物理存储,将进程从对换设备读入,然后释放对换空间。算法swapper*换人曾被换出的进程,腾出空间。输人:输出:loop:for(所有已被换出的就绪进程)选取被换出时间最长的进程;if(没有这样的进程)sleep(事件:必须换入进程);goto loop;if(主存中有足够的空间存放该进程)换入该进程;goto
18、loop;for(所有已装入内存、非僵死而且没被锁在内存的进程)if(有一个睡眠进程)选取优先权值与驻留时间之和在数值上最高的进程;else *没有睡眠的进程。*选取驻留时间与nice值之和在数值上最高的进程;if(所选择的进程不在睡眠或不满足驻留时间的要求)sleep(事件:必须换入进程);else 换出进程;goto loop;1 如果对换进程成功地换入了一个进程,它仍继续查找状态为“就绪且换出”的进程来换人并重复上述过程。最终会发生下列情形之一:对换设备上没有“就绪”的进程:这时,对换进程进入睡眠,直到一个对换设备上的进程被唤醒或内核换出一个“就绪”状态的进程。对换进程找到了应被换入的进
19、程,但系统没有足够的内存空间:此时,对换进程试图换出另一进程,如果成功则重新启动对换算法,查找需要换入2进程。如果对换进程必须换出一个进程,那么对换进程检查在内存的每一进程:僵死进程不用换出,因为僵死进程不占据任何物理存储;锁在内存中的进程(例如正在进行区操作)也不能换出。内核换出正在睡眠的进程而不是换出“就绪”进程。因为“就绪”进程很可能很快就被调度上。选取哪一个睡眠进程来换出取决于进程的优先权和它在内存驻留的时间。如果内存中没有正在睡眠的进程,那么选择哪个“就绪”进程来换出就取决于进程的nice值和它在内存中驻留的时间。一个就绪进程在被换出前必须至少在内存驻留了2秒,一个要被换入的进程必须
20、至少已被换出了2秒户如对换进程找不到可换出的进程,或者,要换人或要换出的进程在它们的环境里的驻留时间都不超过2秒,对换进程就睡眠于一个事件上。这一事件指出,对换进程要换入一个进程,但是找不到足够的内存来存放它。在这一状态下,时钟每秒唤醒一次对换进程。如果有任何进程要进人睡眠状态,内核也要唤醒对换进程,因为进入睡眠的进程可能比对换进程以前所查找的进程更应被换出。如果对换出了一个进程,或因不能换出一个进程而进人睡眠,它将从头执行对换算法,以换入可被换入进程。对换进程基于进程被换出的时间来选择要换入的进程。另一个换入标准是具有最高优先权的就绪进程,因为这样的进程应该得到较多的运行机会。在系统重负载的
21、情况下,这种策略可获得“略微”好一点的系统吞吐量。但是,选择换出进程以得到内存空间的算法有更为严重的缺陷。第一,对换进程根据进程的优先权、内存驻留时间及它的nice值换出一个进程。尽管对换进程换出一个进程仅仅是为了腾出空间以换入另一个进程,但换出一个进程可能并不能为要换入的进程提供足够的内存空间。举例来说,如果对换进程想要换入一个占1兆字节内存的进程而系统又没有空闲内存,这时换出一个仅占2K字节内存的进程是不解决问题的。一个替代的策略是,仅当一组进程能为换入进程提供足够的内存空间时,才换出这组进程。第二,如果对换进程因为不能为换入进程找到足够的内存空间而睡眠,它醒来时将重新寻找一个要换入的进程
22、,尽管先前它已经有了一个要换入的进程。因为与此同时可能有其他的进程被唤醒,而它们又比先前选中的进程更应被换入。对先前已选中的进程的一点安慰是,对换进程仍然试图将其换入。在一些实现的版本中,对换进程在选择下一个换入进程之前总是试图换出多个较小的进程来为一个要换入的大进程提供空间。第三,假若对换进程选中了一个“就绪”进程换出,但可能该进程自从被换入之后一直没有运行。这一抖动显然不是我们所希望的。最后,值得一提的是另一个危险。如果对换进程要换出一个进程,但在对换设备上又找不到空区,这时若下列四个条件满足时,系统就会产生死锁;在主存中的所有进程都进入睡眠;所有“就绪”进程都已被换出;在对换设备上没有空
23、间以容纳新的进程以及在内存中已无空间来存放要换入的进程。解决对换进程这一问题的希望在于请求调页算法。最近几年,请求调页算法已在UNIX系统上实现。3.3 请求分页 UNIX内核中的内存管理子系统负责完成内存和二级存储器之间的数据分布。它直接操作称为存储管理单元(MMU)的部件,该部件完成CPU与主存间的数据传输。一 UNIX系统内存管理的早期时代 早期的UNIX实现(版本7或更早)运行在PDP-11上,它有一个只有64KB地址空间的16位体系结构。这种限制造成各种用于用户程序和内核的软件覆盖技术的产生。这种方法通过覆盖那些程序暂时不再使用的地址空间来复用内存。例如,一旦系统被加载并运行后,系统
24、初始化代码就不再使用了,就可以把它释放掉,供程序的其他部分使用。这种覆盖技术需要应用程序开发人员的显式参与,他们必须清楚程序及运行它的机器的许多细节。早期UNIX的内存管理机制只有交换机制。进程被整个加载到一片连续物理内存中。物理内存只能同时容纳很少几个进程。它们分时运行,如果又有一个进程要运行,就必须对换出去一个现有的进程。该进程被复制到磁盘上预定义好的交换区中,每个进程在其创建时都在该区上分配一片交换空间,保证进程有足够交换空间可用。1978年,分页系统出现在UNIX系统中(VAX-1/780)。VAX-11/780有一个32位体系结构,4GB地址空间,提供分页硬件支持。3BSD是第一个支
25、持分页系统的UNIX版本。在20世纪80年代中期,所有的UNIX系统都使用分页作为主要的内存管理机制,而交换只起辅助作用。在分页系统中,内存和进程的地址空间都被分成固定大小的页。这些页面在需要时被换进或换出内存,内存的页通常称为页面。在任何时刻可以有若干个活动进程,而每个进程在物理内存中只有一部分页,每个进程都认为自已是系统中的唯一一个程序。程序的地址是虚拟的,由硬件划分为页号和页内偏移。硬件和操作系统一起将程序地址空间的虚页号转换为物理页面号,并访问相应的内存单元。如果所需的页面不在内存中,就必须将其换入内存。对于纯分页系统来说,直到页面需要(被访问时),才将其换人内存。大部分现代UNIX系
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三章 unix的存储 第三 unix 存储
限制150内