页表访问磁盘
‘壹’ 虚拟内存的调度介绍
1、页式虚存地址映射页式虚拟存储系统中,虚地址空间被分成等长大小的页,称为逻辑页;主存空间也被分成同样大小的页,称为物理页。相应地,虚地址分为两个字段:高字段为逻辑页号,低字段为页内地址(偏移量);实存地址也分两个字段:高字段为物理页号,低字段为页内地址。通过页表可以把虚地址(逻辑地址)转换成物理地址。
在大多数系统中,每个进程对应一个页表。页表中对应每一个虚存页面有一个表项,表项的内容包含该虚存页面所在的主存页面的地址(物理页号),以及指示该逻辑页是否已调入主存的有效位。地址变换时,用逻辑页号作为页表内的偏移地址索引页表(将虚页号看作页表数组下标)并找到相应物理页号,用物理页号作为实存地址的高字段,再与虚地址的页内偏移量拼接,就构成完整的物理地址。现代的中央处理机通常有专门的硬件支持地址变换。
2、转换后援缓冲器由于页表通常在主存中,因而即使逻辑页已经在主存中,也至少要访问两次物理存储器才能实现一次访存,这将使虚拟存储器的存取时间加倍。为了避免对主存访问次数的增多,可以对页表本身实行二级缓存,把页表中的最活跃的部分存放在高速存储器中,组成快表。这个专用于页表缓存的高速存储部件通常称为转换后援缓冲器(TLB)。保存在主存中的完整页表则称为慢表。
3、内页表是虚地址到主存物理地址的变换表,通常称为内页表。与内页表对应的还有外页表,用于虚地址与辅存地址之间的变换。当主存缺页时,调页操作首先要定位辅存,而外页表的结构与辅存的寻址机制密切相关。例如对磁盘而言,辅存地址包括磁盘机号、磁头号、磁道号和扇区号等。 段是按照程序的自然分界划分的长度可以动态改变的区域。通常,程序员把子程序、操作数和常数等不同类型的数据划分到不同的段中,并且每个程序可以有多个相同类型的段。在段式虚拟存储系统中,虚地址由段号和段内地址(偏移量)组成。虚地址到实主存地址的变换通过段表实现。每个程序设置一个段表,段表的每一个表项对应一个段。每个表项至少包含下面三个字段:
(1)有效位:指明该段是否已经调入实存。
(2)段起址:指明在该段已经调入实存的情况下,该段在实存中的首地址。
(3)段长:记录该段的实际长度。设置段长字段的目的是为了保证访问某段的地址空间时,段内地址不会超出该段长度导致地址越界而破坏其他段。段表本身也是一个段,可以存在辅存中,但一般驻留在主存中。
段式虚拟存储器有许多优点:
①段的逻辑独立性使其易于编译、管理、修改和保护,也便于多道程序共享。②段长可以根据需要动态改变,允许自由调度,以便有效利用主存空间。段式虚拟存储器也有一些缺点:
①因为段的长度不固定,主存空间分配比较麻烦。②容易在段间留下许多外碎片,造成存储空间利用率降低。
③由于段长不一定是2的整数次幂,因而不能简单地像分页方式那样用虚地址和实地址的最低若干二进制位作为段内偏移量,并与段号进行直接拼接,必须用加法操作通过段起址与段内偏移量的求和运算求得物理地址。因此,段式存储管理比页式存储管理方式需要更多的硬件支持。 段页式虚拟存储器是段式虚拟存储器和页式虚拟存储器的结合。实存被等分成页。每个程序则先按逻辑结构分段,每段再按照实存的页大小分页,程序按页进行调入和调出操作,但可按段进行编程、保护和共享。它把程序按逻辑单位分段以后,再把每段分成固定大小的页。程序对主存的调入调出是按页面进行的,但它又可以按段实现共享和保护,兼备页式和段式的优点。缺点是在映象过程中需要多次查表。在段页式虚拟存储系统中,每道程序是通过一个段表和一组页表来进行定位的。段表中的每个表目对应一个段,每个表目有一个指向该段的页表起始地址及该段的控制保护信息。由页表指明该段各页在主存中的位置以及是否已装入、已修改等状态信息。如果有多个用户在机器上运行,多道程序的每一道需要一个基号,由它指明该道程序的段表起始地址。虚拟地址格式如下: 基号 段号 页号 页内地址
‘贰’ 页式虚拟存储系统的有效访问时间怎么计算
缺页时进行的操作有三项,首先将所缺页从磁盘传入主存(20ms),其次访问主存读入所缺页(1微秒),最后更新
快表
(这里相当于访问主存的时间,1微秒),所以这里应该有2个1微秒,答案的第二项是不是应该是20%*90%*1微秒*2?
‘叁’ 为什么linux kernel默认的页面大小是4K,而不是4M或8M
太多了,我就做一次搬运工了。
相信很多人在看内核内存管理部分的时候,都有这样一个疑问,为什么物理页面的大小选择4K,而不是大一些或者小一些呢?
这个问题没有固定的答案,仁者见仁智者见智,每个人的关注点不一样。所以这篇文章不是说给出一个固定的答案,更多的只是一篇讨论性的文章。
内核的页面大小首先跟CPU有关,不同的架构支持的页面大小也不相同,但有一个共同点,那就是肯定支持4K的页面大小。为什么处理器在设计
的时候会选择4K,而不是其他,这个只有熟悉CPU历史的人才能给出答案,本人才疏学浅,回答不上来,有兴趣的自己找一找。当然处理器的设计者在考虑页面
大小的时候,也不是凭空就选择了这个大小,除了历史因素,肯定综合了考虑了大页面、小页面的优缺点,所以这里主要列出这些优缺点,通过这些比较来发现内核
为什么将默认的页面大小选择为4K。
现在更多争论的是大页面还是维持现在的页面4K大小,所以小页面的情况我们就不考虑了,通过比较前两者也可以得出小页面的情况。支持大页面的人通常认为大页面有以下好处:
1、减小page table占用的内存。
假设内存一定的话,页面大小越大,管理页面占用的内存也越小。现在内核中每个页面假设是4K的话,这4K不是全都可用,还有一部分用作
struct
page(大约是64bytes),如果是2.6.32的话,每个页还有一个page_cgroup(32bytes),也就是说内存大小的2.3%
(96/4096)会被内核固定使用。如果页面大小是4M的话,这个比率大约是0.0006%。假设内存时64G的话,页面大小是4K,管理页占用的内存
为1.472G,而页面大小是4M,管理页面占用的内存为0.393M。所以页面比较大时,节省的内存比较多。
2、提高TLB的命中率
每次访问内存的时候,都要将虚拟地址转换为物理地址,如果每次都访问页表的话,消耗比较大。因此,通常使用TLB来加速这个过程。但是
TLB的可以直接转换的地址范围是有限的(具体就是项数乘以页面大小),一旦出现TLB
miss,这时就必须去页表中查找。所以,如果是大页面的话,同样TLB项数的情况下,可以跟踪更大的内存。
3、提高磁盘I/O
我们知道在访问磁盘时,最耗时的操作就是查找写入盘区的起始位置,也就是在磁盘盘片上将读写头置于正确的位置上。所以如果是大页面的话,可以减少写入磁盘的次数。比如要写入4M的缓存,页面大小是4M的话,只需写入1次,而页面大小是4K的话,则需要写入4次。
4、提供缓存利用率
如果是大页面的话,可以减少访问伙伴系统的次数。调用伙伴系统的操作队系统的数据和指令高速缓存有相当的影响。内核越浪费这些资源,这些资源对用户空间进程就越不可用。
除了上面提高的好处,肯定还有的好处,就不一一列举了。那既然有这么好处,而且现在内存越来越大,为什么不更多地采用大页面呢?比如4M?
软件开发中,从来不会有非常完美的方案,都是在优缺点之间找到平衡点。同样,大页面有这样那样的好处,缺点也很明显。
1、最大的问题就是内存浪费,而且这个问题非常严重。比如这时要分配的内存是4M+1byte,这时需要两个页面才能满足分配的需要,这个
时候浪费的内存为4M-1byte。如果页面是4K的话,浪费的内存数量为4k-1byte。页面太大,可能导致每个页面都只使用了部分空间,剩余的空间
就被浪费了。当然对于数据库这样的系统来说,页面越大会越好,但是内核要考虑到通用的情况,而不是专注于特殊的应用场景。再比如,现在系统都是只分配虚拟
地址空间,虚拟地址空间只有在真正被访问的时候,才映射物理页面,而且为了减少物理页面的浪费,对不访问的部分,则不作映射。如果页面太大,在映射很小的
部分时,分配的内存会越大,浪费也就越大。系统在运行时,会频繁地请求内存页的操作,这样导致潜在的浪费会非常严重。这样的浪费会完全抵消减小page
table的优势。
2、页面太大,会导致大量的内存碎片。因为底层的内存管理是以页面为单位。如果系统运行了很长时间,空闲的内存很多,但是连续的内存块都小
于要分配的页面数。这时可以通过移动内存块或者利用swap来获取可用内存,但是会导致分配内存的操作很慢,这种慢会形成恶性循环,严重影响系统的性能。
如果是小页面的话,内存的利用会比较紧凑,分配页面时需要的连续内存块的大小不像大页面那样需要的那么大。
3、如果CPU崩溃,TLB可以访问的内存越大,对系统的影响也越大。这时一把双刃剑,大页面可以提供TLB访问的内存数量,但是CPU崩溃时,会导致很多内存访问要去页表中请求物理地址。
4、兼容性问题。X86处理器支持的页面大小只有4K,所以如果页面过大的话,会导致兼容性问题。
5、如果页面太大,在将内存页换出到swap分区时,需要换出的内存也就越大,会影响性能。
总之,这个页面大小4K是在计算机发展过程中选择的,也是在实践中经过检验的,现在看来这个页面是合适的。
‘肆’ 一个分页表系统,页表存放在内存,如果一次内存的访问时间是200ns,引入快表,并且75%的页表引用发生在快
75%×200+25%×200×2=250ns(因为需要先查页表判断内存具体地址再访问,随意需要访问两次)。磁盘设备在工作时以恒定速率旋转。为了读或写,磁头必须能移动到所要求的磁道上,并等待所要求的扇区的开始位置旋转到磁头下,然后再开始读或写数据。
具体讲,从一次读操作命令发出到该指令完成,将数据读入数据缓冲寄存器为止所经历的时间,存储访问时间略小于存储周期。存储访问时间和存储周期反映了主存速度的指标。
(4)页表访问磁盘扩展阅读:
磁盘存储访问时间:
磁盘设备在工作时以恒定速率旋转。为了读或写,磁头必须能移动到所要求的磁道上,并等待所要求的扇区的开始位置旋转到磁头下,然后再开始读或写数据。故可把对磁盘的访问时间分成以下三部分。
存储周期,是指对存储器进行连续两次存取操作所需要的最小时间间隔。由于有些存储器在一次存取操作后需要一定的恢复时间,所以通常存取周期大于或等于取数时间。读写周期一般与存储器的类型有关,在一定程度上体现存储器的速度。
‘伍’ 页表放是在内存上还是磁盘上,为什么
你说的页表指的是什么,如果是一般文件,在没保存之前是放在内存上,保存之后则在磁盘,因为没保存的时候是临时文件
‘陆’ 页表存放在内存还是磁盘上
页表有单级和多级之分。
单级页表:OS给进程所分配的内存空间并不大的话,就只需要几张页表,这样也没有占据很多的内存空间,所以这个时候页表是全部在内存的。
多级页表:给进程分配的内存空间很大的话,对应页表也很大。于是就要建立多级页表,把高层页表(相对级别比较高的)放在内存,靠这个高层页表找底层页表,再在底层页表里找到对应的实页号。部分底层页表在内存,另外的一些就被塞在磁盘,被高层页表点名之后,才调入内存。
作用
实现从页号到物理块号的地址映射。
逻辑地址转换成物理地址的过程是:用页号p去检索页表,从页表中得到该页的物理块号,把它装入物理地址寄存器中。同时,将页内地址d直接送入物理地址寄存器的块内地址字段中。这样,物理地址寄存器中的内容就是由二者拼接成的实际访问内存的地址,从而完成了从逻辑地址到物理地址的转换。
以上内容参考:网络-页表
‘柒’ 在操作系统的页表问题中提到了某个页面不在内存时,用于保存该页面的磁盘地址不是页表的一部分
地址变换的整个过程大概是这样的。
首先拿到一个逻辑地址,然后拿这个逻辑地址的虚拟页号,到页表上去进行比对(没有TLB)的情况。如果比对存在,说明这个块已经被调入内存了,如果不在,则会产生缺页中断,缺页中断就会启动I/O,然后去外存调块。
‘捌’ 段式虚拟内存情形,假设访问的段在内存中,怎样进行地址转换 页表项包括哪些内容 求详解 高分悬赏 速
页表项包括哪些内容?
逻辑页号,页架号,外存块号,访问权限,内外标志,修改标志
页表虚拟内存管理情形,什么是TLB?
TLB:Translationlookasidebuffer,即旁路转换缓冲,或称为页表缓冲;里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。
X86保护模式下的寻址方式:段式逻辑地址—〉线形地址—〉页式地址;
页式地址=页面起始地址+页内偏移地址;
对应于虚拟地址:叫page(页面);对应于物理地址:叫frame(页框);
X86体系的系统内存里存放了两级页表,第一级页表称为页目录,第二级称为页表。
TLB和CPU里的一级、二级缓存之间不存在本质的区别,只不过前者缓存页表数据,而后两个缓存实际数据。
在设备和I/O管理中,什么叫缓冲,缓冲与高速缓冲有何区别
利用存储区缓解数据到达速度与离去速度不一致而采用的技术称为缓冲,此时同一数据只包含一个拷贝。例如,操作系统以缓冲方式实现设备的输入和输出操作主要是缓解处理机与设备之间速度不匹配的矛盾,从而提高资源利用率和系统效率。缓存是为提高数据访问速度而将部分数据由慢速设备预取到快速设备上的技术,此时同一数据存在多个拷贝。例如,远程文件的一部分被取到本地。当然,在有些情况下,缓冲同时具有缓存的作用。例如UNIX系统对于块型设备的缓冲区,在使用时可保持与磁盘块之间的对应关系,既有缓冲的作用也有缓存的作用,通过预先读与延迟写技术,进一步提高了I/O效率
‘玖’ 在请求分页系统中,页表中的访问位是供( )参考的。
答案选择 A!
页表项(页描述子)中各个位的作用:
1. 页号
2. 块号(页框号)
3. 中断位: 用于判断该页是不是在内存中,如果是0,表示该页面不在内存中,会引起一个缺页中断
4. 保护位(存取控制位):用于指出该页允许什么类型的访问,如果用一位来标识的话:1表示只读,0表示读写
5. 修改位(脏位):用于页面的换出,如果某个页面被修改过(即为脏),在淘汰该页时,必须将其写回磁盘,反之,可以直接丢弃该页
6. 访问位:不论是读还是写(get or set),系统都会设置该页的访问位,它的值用来帮助操作系统在发生缺页中断时选择要被淘汰的页,即用于页面置换
7. 高速缓存禁止位(辅存地址位):对于那些映射到设备寄存器而不是常规内存的页面有用,假设操作系统正在循环等待某个I/O设备对其指令进行响应,保证硬件不断的从设备中读取数据而不是访问一个旧的高速缓存中的副本是非常重要的。即用于页面调入。