操作系统概念 -第七版-重要概念的理解-(85-123)

本文深入探讨虚拟内存技术的原理及其实现机制,包括页表、段表、反向页表等概念,以及如何通过虚拟内存技术提高内存利用率,并讨论了虚拟内存技术在现代操作系统中的应用。
85.页内存的包含是通过物理内存的帧保护寄存器位(用于表示帧的状态为:读写,只读,不可读写)与页表的项状态(有效或无效)共同实现对内存的保护,有时候还会有一个“页大小寄存”,用于校验被访问的地址是否越出进程所分配的内存。


86.页内存的保护功能:保护地址访问不会越出进程所分配的访问,保护每一个页的读写权限。


87.由于计算机操作系统通常都有“共享页”的功能,所以几乎每一个线程都有自己的页表,因此,而由于32位的操作系统,寻址空间为2的32次方,假定一个页大小为4KB,那么就有一块内存就要被分成一百万个页,也就是一个页表需要有100W个条目,一个条目如果是1B,那每个线程就需要1M用来创建页表了。
这绝对是在浪费资源,所以就有了2级分页的概念,也就是说一个逻辑地址有2个字段用来指示1级页号和2级页号。


88.分段机制是面向用户程序的分配机制。分页机制是面向操作系统和硬件的分配机制。


89.分页的作业地址空间是一维的,线性的,程序员只需利用一个记忆符表示一个地址;而分段的作业地址空间是二维的,程序员在表示一个地址的时候既要给出段名,又需要给出段内地址.其中,段名可以理解为函数名等,段内地址可以理解程变量等的地址.
值得一提的是其中页的大小要和物理块或者页框一样,而物理块是操作系统定好了的.也就是说你的操作系统装完之后,物理块的大小是定了的,从而页的大小也是定了的.而段的长度是不定的.
引入分页存储管理方式的目的是提高内存利用率,而引入分段存储是为了满足用户(程序员)在编程和使用上多方面上的要求.还有将两者结合一起的段页式系统.


90.程序经过编译后会固定段表和各个质量的段地址,而页地址或者物理地址则是在运行时才分配的。


91.什么是反向页表?先说明一下什么是正向页表,正向页表就是根据计算机的位数,比如你的计算机是64bit,那么可以寻址空间就是2^64Byte这么大,而正常一台计算机的内存页才8G=8*2^30Byte,如果按照2^64Byte来算的话,页表就会很大,按照可寻址空间(2^64Byte)来算的页表就是正向页表。
按照实际物理内存的空间来算的页表就是“反向页表”,实际上几乎所有的计算机都才有"反向列表"。


92.如果计算机程序很大,内存肯定放不下,再说CPU一下子也跑不了所有代码,所以才有了“虚拟内存技术”。


93.虚拟内存技术存在的意义:1.计算机程序普遍存在大部分代码不执行比如:用于冗余的数组空间和异常代码,这些不必要加载到物理内存中。2.计算程序运行受到物理内存的限制。3.不必要的部分程序代码会导致内存交换和加载负担加重导致IO时间和CPU使用率都降低了。


94.虚拟内存技术使用程序代码对于操作系统底层来说不再是一个原子个体,只有必要的代码才会在物理内存中存放。


95.虚拟内存技术运行程序的动态内存分配更加自由,但是操作系统是否使用虚拟内存技术和程序是否支持动态内存分配没有关系。


96.windows的“虚拟内存”和linux的“交换区”都属于“虚拟内存技术的实现”


97.虚拟内存技术中“虚拟内存映射器”将离散的物理内存帧映射为连续的虚拟内存帧,然后“页表”再离散地将虚拟内存帧映射为 连续的“逻辑页内存空间”,段表则将“连续的逻辑页空间”离散的分配给程序的各个段空间。


98.被页表标记为无效(i为无效,V为有效)的页可能是非法越界的,也可能只是未从虚拟内存空间加载到物理内存,如果只是未加载,操作系统会重新加载,然后重启该指令。


99.调页程序相对于CPU调度算法来说没那么复杂,只是采用了“懒汉调页”算法,也就是在需要的用到页的时候才调用页。而且大部分的指令都不会一下子跨很多页调用内存。所以指令速度还算合理。


100.被页表标记为无效,这种情况叫“页错误”,如果发生“页错误”,需要通过“页错误中断处理程序”来尝试修复页访问错误,这个情况可能会降低计算机内存访问性能。


101.降低“内存访问的页错误率”是“按需页调用”算法很重要的事情,降低错误率的方法就是尽可能的把没加载的页内存分配给不常用的段空间。


102.fork操作,在虚拟内存空间,是复制了一份新的内存副本,而在物理内存空间仍然在共享使用同一副本,只是在共享双方中有一方对内存进行写操作的时候,才会做虚拟内存空间和物理内存空间的同步操作。


103.vfork(虚拟内存fork)操作和fork的区别在于,vfork不采用写时复制,更准确的是,他根本不复制物理内存,他会一直共享物理内存。


104.vfork常用于执行vfork操作后,需要立即执行exec()操作,这样可以提高fork的效率。
那么vfork+exec 和 fork + exec 有什么区别呢?


vfork+exec 就是 创建一个影子分身,然后在虚拟分身上召唤新的实体。
fork+exec 就是创建一个真实的分身,然后把这个分身当做祭品召唤新的实体。


显然fork+exec效率低很多,
因为fork在虚拟内存中引入了“写时复制技术”,而vfork则不采用任何“复制技术”


105.当空闲帧足够时发生页错误,直接加载页数据重启指令,当发生页错误且空闲帧不足,则需要进行“页置换”,“页置换”分为置换“只读页”,和置换"可读可写页",置换只读页,只需要将只读页覆盖,因为只读页都有缓存(不存在脏数据页),而置换“可读可写页”,则需要先将该页写入交换区才能调入需要的页。


106.置换“可读可写页”换花费双倍的IO时间,置换“只读页”则只需要一次IO时间。


107.实现按需调页是实现虚拟内存的基础技术,这个技术可以提高CPU的吞吐量,但是他需要实现“帧分配算法(选着程序哪些内存需要被调入)”和“页置换算法(当帧不够用的时候要置换一些空闲页来用)”。


108.页置换算法常用于选着置换出,而非置换进来,所以常用LRU(而不是MRU)。


109.缓存页技术可以提高页置换的效率,在将牺牲帧写到交换区的时候,可以同时间把交换区中的数据写到内存中的页缓冲池,等牺牲页换出时,再冲缓存池读取(相比等牺牲页换出后再从交换区读取数据页快多了)。


110.帧分配要考虑足够程序运行不能总是发生页错误。


111.全局置换就是允许优先级高的进程占用优先级低的进程的空闲帧,局部置换则限制自己的经常只能使用自己的空闲帧。全局分配表现出更高的吞吐量,更为常用。


112.进程颠簸是指进程用于页置换的时间大于执行时间。


113.内存不足会使系统性能指数下降。


114.当系统颠簸时,进程忙于等到页IO,导致CPU使用率低,导致操作系统加载更多进程,更多进程会使得页置换更频繁,恶化系统内存环境,所以全局置换的缺点在这里,这时候需要采用局部置换机制,去改善内存环境。


115.局部分配,就是根据上一次页引用时间长度去选择牺牲页,而未被牺牲的页(正在引用的页)形成的集合叫做“工作集合”,分配足够的内存给工作集合就叫做局部分配,工作集合会随着时间迁移,适当大小的工作集合可以提高吞吐量,还能避免进程颠簸。


116.工作集合是进程“内存全集”中的一个子集,而且是在不定的变动的,工作集合大规模的改变会导致“页错误率”提高,但是如果提供给工作集合的帧足够的话,这个错误率会马上恢复正常,否则错误率会持续居高。


117.普通的open()read()write()等系统调用是直接在磁盘上进行读写操作的(通常还会使用读写缓存),而内存映射则是利用虚拟内存技术,将文件所在的磁盘区域映射为虚拟内存的一部分,相当于用户不需要关心磁盘的读写过程以及复杂的系统调用,只需要专心的读写内存就可以了。


118.不过Solaris系统比较特殊,不管你是否使用“内存映射文件”技术,都会先将文件映射到内存空间(这里的空间是内核空间,而不是用户空间),然后再伪装成普通的磁盘系统调用的读写操作。


119.内存映射IO是什么?通常我们写数据给IO,会通过IO设备控制器的专用指令先把数据交给IO设备控制器,IO控制器解释指令后设置相应的寄存器,然后再执行读写操作,而"内存映射IO"则是将IO设备控制器的寄存器直接映射到内存中,这样CPU要传输数据给IO的寄存器时,就不需要经过IO设备控制器了,从而提高了IO效率。


120.局部分配可以通过控制进程获得的帧数达到控制“页错误率”的效果。


121.分配策略分为:1.固定物理帧数的分配,2.可以根据策略调整物理帧数的数量。


122.置换策略分为:局部置换与全局置换。


123.分配策略可以影响页错误率,置换策略可以影响系统的颠簸性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值