赞
踩
程序装载到内存才可以运行
通常,程序可以执行文件格式保存在磁盘上
多道程序设计模型
允许多个程序同时进入内存
每个进程有自己的地址空间
一个进程执行时不能访问另一个进程的地址空间
进程不能执行不合适的操作
说明:
在左边的单处理器系统中,如果一个进程想要运行,那么必须将进程地址空间装载到物理内存中才可以运行。
而右边的是多处理器系统中有多个进程需要进入物理内存执行,这里要解决的问题就是,如何将进程地址空间合理的装载到物理内存中,如何合理的分配使用内存,使得每个进程能正确执行。
这就需要地址重定位来解决这些问题。
为了保证cpu
执行指令时可以正确访问内存单元,需要将用户程序中的逻辑地址转换为运行时可由机器直接寻址的物理地址,这一过程称为地址冲地位。
0
表示空闲,1
表示占用(或者相反)。对于不等长的划分可以使用下面两种分配结构。这里我们使用空闲区表、已分配区表为例来说明内存分配算法。
first fit
next fit
best fit
worst fit
当找到满足进程需求的空闲区表后,需要将空闲区分为两部分,一部分供进程使用,另一部分形成新的空闲区。
这是Linux
底层内存管理采用的一种方法
2
的整数次幂进行划分,组成若干空闲块表;查找该链表找到能满足进程需求的最佳匹配块。2^U
s
,2^(U-1)<s<=2^U
,则分配整个块2^(U-1)
s
的最小块。特点:一段时间内只有一个进程在内存中,简单、内存利用率低。
这种方案是在早期系统中使用的,有三种不同的布局:
碎片问题解决
设计思想
用户进程地址空间被划分为大小相等的部分,称为页(page
),从零开始编号。
这是逻辑地址空间上的称谓。
page frame
),从零开始编号4K
或4M
逻辑地址
内存分配
相关数据结构及地址转换
cpu
取到逻辑地址,自动划分为页号和页内地址;5
页加一条指令,于是这里我们需要分配6
页给这个进程。相关数据结构及地址转换
cpu
取到逻辑地址,用段号查段表,得到该段在内存的起始地址,与段内偏移地址计算出物理地址思想
用户进程划分:先按段划分,每一段按页面划分
逻辑地址:
内存划分:同页式存储管理方案
内存分配:以页为单位进行分配
即如何在一个较小的物理内存空间中运行一个会占用较大地址空间的进程?
overlaying
)swapping
)virtual memory
)解决问题:程序大小超过物理内存总和
程序执行过程中,程序的不同部分在内存中相互替代。
程序员声明覆盖结构,操作系统完成自动覆盖
这种技术主要用于早期的操作系统,现在使用不多。
设计思想
内存空间紧张时,系统将内存中某些进程暂时移动到外存,把外存中某些进程交换进内存,占据前者所占用的区域(进程在内存与磁盘之间的动态调用)。
讨论:实现时遇到的问题
进程的哪些内容要交换到磁盘?会遇到什么困难?
在磁盘的什么位置保存被换出的进程?
交换时机?
如何选择被换出的进程?
如何处理进程空间增长?
哪些内容要交换到磁盘?会遇到什么困难?
1、运行时创建或修改的内容:栈和堆
2、交换区:一般系统会指定一块特殊的磁盘区域作为交换空间,包含连续的磁道,操作系统可以使用底层的磁盘读写操作对其高效访问。
3、何时需要发生交换?只要不用就换出;内存空间不够或有不够的危险时换出,一般与调度器结合使用
4、考虑进程的各种属性;不应换出处于等待I/O
状态的进程
进程空间增长的困难及解决
我们将虚拟存储技术和页式存储管理方案结合起来得到了虚拟页式存储管理系统。具体有两种方式,一是请求调页,二是预先调页。以cpu
时间和磁盘换取昂贵内存空间,这是操作系统中的资源转换技术。
基本思想
页表由页表项组成
页框号、有效位、访问位、修改位、保护位
页框号(内存块号、物理页面号、页帧号):通过页框号给出具体对应的物理页面
有效位(驻留位、中断位):表示该页是在内存还是在磁盘
访问位:引用位。当要使用某个页面时,需要访问位作出相应的记录,表示此页面被访问过
修改位:此页在内存中是否被修改过
保护位:读/可读写
通常,页表项是硬件设计的。
32
位虚拟地址空间的页表规模?
页面大小为4k
,页表项大小为4
字节,则一个进程地址空间有2^20
页。这里首先是虚拟地址空间可以达到2^32
字节,这里注意:在二级页表中才可以表示2^32
的地址空间,除以页面大小可以得到有多少个页面。而一个页表项可以表示1k
的页面,于是页表项就要占用1024
页(页表页,就是页表项占用的空间)。
64
位虚拟地址空间
页面大小为4k
,页表项大小为8
字节,则页表规模为32000TB
。这里没说清楚,到底是几级页表中的结果?
页表页在内存中若不连续存放,则需要引用页表的地址索引表,即页目录。即一个多级页表结构。
说明:这里还是32
位的虚拟地址空间。每个进程有一个页目录,根据页目录得到页表地址,然后从页表中的页表项的页框号找到真正的物理内存地址。32
位的虚拟地址分为页目录偏移、页表偏移和页内偏移。页目录地址保存在一个寄存器中,根据此地址找到页目录起始地址,然后根据月页目录偏移找到对应的页表地址,根据页表偏移找到页表项,从页表项中取得页框号,然后结合页内偏移找到对应的物理内存。对于二级页表,在32
位系统中可以表示4G
的虚拟地址空间。如果需要超过4G
的虚拟地址空间,则二级页表满足不了。
说明:总共有32
位地址。
地址转换
从虚拟地址空间出发:虚拟地址-->查页表-->得到页框号-->形成物理地址,其中每个进程一张表,这样页表会占用很大的空间。注意:反转页表和实际物理地址大小是固定比例的,与进程个数无关。
解决思路
* 从物理地址空间出发,系统建立一张页表
页表项记录进程的某个虚拟地址(虚页号)与页框号的映射关系。
说明:系统建立一张页表可以节省很大的空间,这被很多64
位系统采用,但是每次进行运行都需要查整张表,这样会耗费很大的资源,于是我们采用了一个哈希表,这样查找更快。
cpu
的指令处理速度与内存指令的访问速度差异较大,cpu
的速度得不到充分利用。TLB
)。TLB
(Translation Look-aside Buffers
)cpu
中引入的高速缓存,可以匹配cpu
的处理速度和内存的访问速度。是一种随机存取型存储器,除连线寻址机制外,还有接线逻辑,能按特定的匹配标志在一个存储周期内对所有的字同时进行比较。TLB
,如果能找到页框号,则直接和偏移结合找到对应的物理内存;如果
TLB
中没有页框号,则需要去查页表,之后在找到对应的物理内存;在页表中如果对应的页表项无效,则会出现
page fault
的异常,然后由系统处理之后再进行同样的操作。
又称页面错误、页故障、页面失效
地址转换过程中硬件产生的异常
具体原因
1、所访问的虚拟页面没有调入物理内存,即缺页异常
2、页面访问违反权限(读/写、用户/内核),比如用户访问内核空间。
3、错误的访问地址,比如
图中标注的位置都是有内容的,如果访问地址指向没有标注(没有内容)的位置,则就是错误的访问地址。
是一种页错误
在地址映射过程中,硬件检查页表时发现所要访问的页面不在内存,则产生异常--缺页异常
操作系统执行缺页异常处理程序:获得磁盘地址,启动磁盘,将该页调入内存
所谓驻留集,是指在某段时间间隔内,进程要访问的页面集合
驻留集大小:给每个进程分配多少页框?
固定分配策略
进程创建时确定。可以根据进程类型(交互、批处理、应用类)或者基于程序员或系统管理员的需要来确定
可变分配策略
根据缺页率评估局部性表现
缺页率高-->增加页框数
缺页率低-->减少页框数
系统开销
置换范围
计划置换页面的集合是局限在产生缺页中断的进程,还是所有进程的页框?
置换策略
为什么要锁定页面?
I/O
缓冲区。特别是正在I/O
的内存页面。Windows
中的VirtualLock
和VirtualUnLock
函数。清除:从进程的驻留集中收回页框
虚拟页式系统工作的最佳状态:发生缺页异常时,系统中有大量的空闲页框。
结论:在系统中保存一定数目的空闲页框供给比使用所有内存并在需要时搜索一个页框有更好的性能。所以一般清除的策略如下:
* 设计一个分页守护进程,多数时间处于睡眠状态,可定期唤醒以检查内存的装填
当进程需要使用一个已置换出的页框时,如果该页框还没有被新的内容覆盖,将它从空闲页框集合中移出即可恢复该页面。就是说当进程还需要使用某个页框,同时这个页框虽然被移出了,但是内容还没有被覆盖,则我们只需要将其从空闲页框集合中移出即可恢复页面。于是可以利用此技术解决已经回收的页框再利用的问题。注意:所有的讨论都是在进程没有结束的情况下进行的。如果进程结束了,则所有的页框都会还给系统。这种技术叫页缓冲技术:
* 不丢弃置换出的页,将它们放入两个表之一:如果未被修改,则放到空闲页链表中,如果修改了,则放到修改页链表中。
I/O
操作的数量,从而减少了磁盘访问的时间)最佳算法-->先进先出-->第二次机会-->时钟算法-->最近未使用-->最近最少使用-->最不经常使用-->老化算法-->工作集-->工作集时钟
在先进先出算法的基础上进行该机而来的,此算法按照先进先出算法选择某一页面,检查其访问位R
,如果为0
,则置换该页;如果为1
,则给第二次机会,并将访问位置零,并将其从链头取下放到链尾。
在第二次机会算法中当给某个页面第二次机会的时候,将其访问位置零,然后将其挂到链尾,这都是需要开销的,于是我们改进为时钟算法。
说明:其实就是将之前的链表改为了环形链表,当给某个页面第二次机会的时候不需要将其取下然后挂到链尾,只需要移动一下指针即可,这样可以降低开销。
选择在最近一段时间内未使用过的一页并置换
实现:置换页表表象的两位,访问位R
,修改位M
。硬件会设置这些位,如果硬件没有这些位,则可用软件模拟。
进程启动时,R、M
位置零,R
位被定期清零。
发生缺页中断时,操作系统检查R、M
:
* 第一类:无访问,无修改(`00`)
01
)10
)11
)算法思想
随机从编号最小的非空类中选择一页置换出去。
时钟算法的实现
对此算法有一个时钟算法的实现
1、从指针的当前位置开始,扫描页框缓冲区,选择遇到的第一个页框(r=0,m=0
)用于置换(本扫描过程中,对使用位不做任何修改)
2、如果第一步失败,则重新扫描,选择第一个(r=0;m=1
)的页框(本次扫描工程中,对每个跳过的页框,将其使用位置为零)
3、如果第二部失败,指针将回到它的最初位置,并且集合中的所有页框的使用位均为零。重复第一步,并且,如果有必要,重复第二步,这样将可以找到置换的页框。
选择最后一次访问时间距离当前时间最长的一页并置换,即置换未使用时间最长的一页
0
页时先将页的第0
行置为1
,然后将第0
列置为0
,j
中最小的是第1
行,于是将第1
页置换出去。当然这里只有四页。即Not frequently Used
,选择访问次数最少的页面置换
一开始提出此算法是LRU
(最近最少使用算法)的一种软件解决方案,但是实际上差距有点大。
实现
* 软件计数器,一页一个,初值为零
每次时钟中断时,计数器加R
LRU
):计数器在加R前先右移一位,R
位加到计数器的最左端。这样如果R
值为零,则计数器没有影响,如果值为1
,则会变得很大,于是如果一个页面长久不被访问,则计数器值就会越来越小。最后选择值最小的置换出去。
例子:
2 3 2 1 5 2 4 5 3 2 5 2
要求:
计算应用FIFO、LRU、OPT
算法时的缺页次数
应用FIFO、LRU
页面置换算法
可以看到FIFO
发生六次缺页异常,而LRU
发生四次缺页异常。
应用OPT页面置换算法
发生三次缺页异常。
例子:系统给某进程分配m
个页框,初始为空页面访问顺序为
1 2 3 4 1 2 5 1 2 3 4 5
,采用FIFO
算法,计算当m=3
和m=4
时的缺页中断次数。
结论:m=3
时,缺页中断九次;m=4
时,缺页中断十次。注意:FIFO
页面置换算法会产生异常现象(Belady
现象),即:当分配给进程的物理页面数增加时,缺页次数反而增加。
该算法采用了可变分配和局部置换方式,置换算法则采用FIFO。
该算法规定将一个被淘汰的页放入两个链表中的一个,
若页面未被修改,直接放入空闲链表末尾,否则放入已修改页面链表末尾。
这种方式使得已修改和未修改的页面都仍然留在内存中,当进程以后再次访问这些页面时,只需花较小的开销,使这些页面又返回到该进程的驻留集中。
当被修改页面达到一定数量时,才一次性地将他们写回到外存,这样就显著地减少了外存的I/O次数
假设采取FIFO固定分配局部置换,每次缺页都要淘汰该进程最早装入内存的页面,而这里采用可变分配局部置换,即分配进程一个空白块,将原本应该淘汰的最早装入的页面挂在两个队列之一,直到没有空白块或修改页面达到上限才启动磁盘写回外存
缺页越多,系统的性能越差,这称为颠簸(抖动):虚存中,页面在内存与磁盘之间频繁调度,使得调度页面所需的时间比进程实际运行的时间还多,这样导致系统效率急剧下降,这种现象称为颠簸或抖动。
确定页面大小对分页的硬件设计非常重要,而对操作系统是个可选的参数
要考虑的因素
内部碎片
页表长度
辅存的物理特性
Intel 80x86/Pentium: 4096
或4M
多种页面尺寸:为了有效使用TLB
带来灵活性,但给操作系统带来复杂性。
例子:
分配了一个页框,页面大小为128
个整数,矩阵A(128 x 128)
按行存放。
可以看到左边是按列赋值,右边是按行赋值。按列编制就是首先读入第一页(一行,因为矩阵是按行存放的),然后给第0
个位置赋值,每次读入一行,直到将第0
列赋值完,读完之后再给第1
列赋值,这样会产生128*128
次缺页异常;而按行赋值,第一次读入一页,给第0
行的所有元素赋值,这样会产生128
次缺页异常。于是可以看到程序的编制方法对缺页次数是有很大影响的。
W
,超过这个点之后页框数的增加对缺页率的降低有限,这也是工作集算法的出发点。
基本思想
根据程序的局部性原理,一般情况下,进程在一段时间内总是集中访问一些页面,这些页面称为活跃页面,如果分配给一个进程的物理页面数太少了,使得该进程所需的活跃页面不能全部装入内存,则进程在运行过程中将频繁发生中断。
如果能为进程提供与活跃页面数相等的物理页面数,则可减少缺页中断次数,这是由Denning
提出的。
工作集:一个进程当前正在使用的页框集合
例子
基本思路
找出一个不在工作集的页面并置换它
* 每个页表项中有一个字段:记录该页面最后一次被访问的时间
设置一个时间值T
根据一个页面的访问时间是否落在“当前时间 - T
”之前或之中决定其在工作集之外还是之内。
实现:扫描所有页表项,执行操作
1、如果一个页面的R
位是1
,则将该页面的最后一次访问时间设为当前时间,将R
位清零
2、如果一个页面的R
位为0
,则检查该页面的访问时间是否在“当前时间 - T
”之前,如果是,则该页面是需要被置换的页面;否则,记录当前所有被扫描过页面的最后访问时间里面最小值。扫描下一个页面并重复上述操作。
基本思想
进程通过一个系统调用(mmap
)将一个文件(或部分)映射到其虚拟地址空间的一部分,访问这个文件就像访问内存中的一个大数组,而不是对文件进行读写
在多数实现中,在映射共享的页面时不会实际读入页面的内容,而是在访问页面时,页面才会被每次一页的读入,磁盘文件则被当作后备存储。
当进程退出或显式地解除文件映射时,所有被修改页面会写回文件
说明:如图,两个进程共享同一块物理内存,每个页面都被标志成了写时复制。注意:共享的物理内存中每个页面都是只读的。如果每个进程想改变某个页面时,就会与只读标记冲突,而系统在检测出页面是写时复制的,则会在内存中复制一个页面,然后进行写操作。新复制的页面对执行写操作的进程是私有的,对其他共享写时复制页面的进程是不可见的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。