本文已参与「新人创作礼」活动,一起开启掘金创作之路。
段页式内存管理
分页管理优点:内存利用率高,不会产生外部碎片,只会有少量的页内碎片
缺点:不方便按照逻辑模块实现信息的共享和保护
分段管理优点:很方便按照逻辑模块实现信息的共享和保护
缺点:如果段太长,为其分配很大的连续内存空间很不方便,并且会产生外部碎片(原理类似于动态分区分配,外部碎片都可以靠紧凑技术解决,但是时间开销大)
段页式:将进程按照逻辑模块分段,再将每个段分页(每个页面大小仍然一样) ,内存空间也会被分为大小相同的物理块、内存块、页帧、页框。
段号的位数决定了每个进程最多分为多少段
页号的位数决定了每个段最大有多少页
页内偏移量决定了页面的大小、物理块的大小
段页式管理的地址结构是:二维的(需要用户提供段号、段内地址),分段对用户可见,对段的分页对用户不可见。
程序员需要给出段号、段内地址,系统会根据段内地址,自动划分页号和页内偏移量
注意将:段页式的逻辑地址结构需要段号、页号、页内偏移量,但是其地址结构是二维的,只需要提供段号和段内地址(段内偏移量)
分段管理中,段表记录:段号、段长和该段的起始地址
而在段页式管理中,段表记录:段号、页表长度和页表存放的块号(记录页表长度是因为段长度不同,导致页表长度不同)
分页、段页式管理中,页表的结构都是一样的,页号到物理块号的映射关系。
一个进程对应一个段表,但是每个段又对应一个页表,所以一个进程对应多个页表。
段页式管理,如果不使用快表,访问逻辑地址需要进行三次访存,第一次访问段表、第二次访问页表、第三次访问对应的物理地址。
虚拟内存的基本概念
属于内存空间的扩充技术
传统存储管理的特征:
1、一次性:作业必须一次性全部装入内存后才能开始运行,这会造成两个问题:
问题1、作业很大时,不能全部装入内存,导致大作业无法运行(64G大小的游戏,内存只有8G,玩不了呀!)
问题2、大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能够运行,导致多道程序并发度下降,限制了多道程序的并发度
2、驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行。 (在游戏A场景时,还不需要加载B场景)
可用虚拟存储技术解决
局部性原理
分为:时间局部性和空间局部性
1、时间局部性:当前执行的某条指令、或者访问某个数据,在不久后可能再次被执行或者访问。
2、空间局部性:当程序访问了某个存储单元,在不久之后,其附近的存储单元可能被访问。
之前提到的基本地址变换机构中的“页表”,每次要访问一个逻辑地址时,都需要查询内存中的页表(每个进程有一个页表),由于局部性原理,可能每次都是访问的都是同一个页表项。
1、基于局部性原理,在程序装入时,可以将程序中很快就会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
2、在程序执行过程中,当访问的信息不在内存时,由os负责将所需信息从外存调入内存,然后继续执行程序。
3、若内存空间不够,由os负责将内存中暂时用不到的信息换出到外存。
在os的管理下,在用户看来似乎有一个比实际内存大得多的内存,即:虚拟内存,是os虚拟性的一个体现,实际的物理内存大小没有改变,只是在逻辑上进行了扩充。
虚拟内存的三个主要特征:
1、多次性:作业运行时,无需一次性全部装入内存,而是允许被分成多次调入内存
2、对换性:作业运行时,无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出
3、虚拟性:从逻辑上扩充了内存的容量
考虑到虚拟内存技术允许将一个作业分多次调入内存,所以采用内存的连续分配方式就会很不方便,所以,虚拟内存的实现需要建立在“离散分配”的内存管理方式基础上(分页、分段、段页式)
在传统的非连续分配存储管理(基本分页存储管理、基本分段存储管理、基本段页式存储管理)的基础上,采用虚拟内存技术,就形成了相对应的:请求分页存储管理、请求分段存储管理、请求段页式存储管理。
主要区别:
- 程序执行过程中,访问的信息不在内存时,由os负责将所需信息从外存调入内存,然后继续执行程序。os需要提供请求调页(或调段)的功能
- 当内存空间不够时,由os负责将内存中暂时用不到的信息换出到外存。os需要提供页面置换(或段置换)的功能
总结一句:内存中没有需要的信息(页、段)就请求,内存空间不够就置换。
与基本分页管理相比,请求分页管理中,
请求调页: os需要知道每个页面是否已经调入内存(没有调入需要知道在外存的存放位置)
页面置换: os需要知道页面是否被修改(修改了就需要写回外存)
请求页表与基本页表的对比: (多了:状态位、访问字段、修改位、外存地址)
访问字段主要用于页面置换算法使用
请求页表也可以有快表,页表项和请求页表一样
缺页中断机构:
在请求分页系统中,每当访问的页面不在内存时,会产生一个缺页中断,由os的缺页中断处理程序处理中断。 此时,缺页的进程阻塞,放入阻塞队列,调页完成后将其唤醒加入就绪队列。
若内存中有空闲物理块,则为该进程分配一个空闲块,将所缺页面装入该块,并修改页表项内容。
若内存中没有空闲块,则由页面置换算法选择一个页面淘汰,如果淘汰的页面被修改过,还需要将其写回外存 未修改的页面不用写回外存。
缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生,属于内中断,是CPU执行指令时产生的中断
同时,一条指令在执行期间,可能产生多次缺页中断。
请求分页存储管理 与 基本分页存储管理的主要区别:(新增)
1、当查询页表发现页面未在内存中时,请求调页(如果有快表,同时还需要写入快表中)
2、当需要调入页面,但没有空闲块时,页面置换(页面置换算法)
3、需要修改请求页表中页表项