思考:连续分配方式的缺点?
1、固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存的利用率很低。
2、动态分区分配:会产生很多外部碎片,虽然可以用"紧凑"技术来处理,但是"紧凑"的时间代价很高。
提高系统资源利用率
把用户程序的地址空间划分成若干大小相等的区域,每个区域称作页面或页。每个页都有一个编号,叫做页号。页号一般从0开始编号,如0,1,2,…等。
把内存空间划分成若干和页大小相同的物理块,这些物理块叫页框(frame)或(物理)块。同样,每个物理块也有一个编号,块号从0开始依次顺序排列。
以页为单位进行内存分配,并按作业的页数多少来分配。逻辑上相邻的页,物理上不一定相邻。
“页内碎片”︰最后一页装不满而形成的碎片,不可利用。
页太大:页内碎片大。
页太小:页表可能很长,换入/换出效率低。
页面大小由硬件地址结构决定,机器确定,页面大小就确定了
一般来说,页面大小为2的若干次幂,根据计算机结构的不同,其大小从512B到16MB不等。
了解完分页技术的基本概念后,那么如何实现地址的转换呢?
对于某台具体机器来说,其地址结构是一定的。如果给定的逻辑地址是A,页面的大小为L,则页号 p 和页内地址 d 可按下式求得:
总结来说地址转换的步骤为:
1、计算出逻辑地址对应的页号。
2、找到对应页面在内存中的存放位置。
3、算出逻辑地址对应的页内偏移量。
4、物理地址 = 页面始址+页内偏移量
分页存储管理的逻辑地址结构如下:
在计算机中,由于所有的数据都是由二进制来表示的。因此计算机内部在计算页号和页内地址时会更加的方便。如下:
为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。
地址变换机构其实就是用于实现逻辑地址到物理地址转换的一组硬件机构。
1、基本地址变换机构
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
由于页表是存放在内存中的,这使CPU在每存取一个数据时都要两次访问内存。
第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量 W 拼接,以形成物理地址。
第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。
因此引入具有快表的地址变换机构
增设一个联想寄存器(快表)
①具有并行查询能力的高速缓冲寄存器
②存放当前访问的那些页表项
③每次地址变换时,先在快表中查找页号
④快表中找不到,再访问内存中的页表,并将页表项存入快表,若快表已满,应换出最老的页表项
可以类比计组中的高速缓冲器Cache
CPU具有32位地址时,使用232逻辑地址空间的分页系统,规定页面4KB时,一个进程页表的表项可达1兆(220)个,若表项占用4个字节,则一个进程需要占用4MB连续内存空间存放页表。这显然是不现实的。
如何解决单级页表的问题?
问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
因此引入两级(多级)页表概念。
多级页表概念:页表和页面一样也进行分页,内存仅存放当前使用的页表,暂时不用部分放在磁盘上,待用到时再行调进。
具体做法:把整个页表进行分页,分成一张张小页表(称为页表页),小页表的大小与页框相同,为进行索引查找,应该为这些小页表建一张页表(外层页表),其表项指出小页表所在页框号及相关信息。
引入分段存储管理方式的目的,则主要是为了满足用户(程序员)在编程和使用上多方面的要求。
进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。
由于各个分段是按照逻辑关系划分的,因此用户编程更方便,程序的可读性更高。
例如:
分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。如:
1、基本思想:
(1) 作业地址空间进行段式管理。(——面向用户)
(2) 每段内再分成若干大小固定的页,每段都从零开始为自己的各页依次编写连续的页号。
(3) 对内存空间的管理仍然和分页存储管理一样,将其分成若干个和页面大小相同的物理块。(——面向机器)
(4) 作业的逻辑地址包括3个部分:段号、页号和页内位移。
(5)为实现地址变换,段页式系统设立了段表和页表。
段页式系统中,访问一次数据,需访问三次内存(段表,页表,数据本身)
分页系统和分段系统都可以支持信息共享。但是分段比分页更容易实现信息的共享和保护。
设想一下这样的系统,有40个用户,每个用户都执行一个文本编辑器。如果文本编辑器有160KB代码段和40KB数据段,如果不采用信息共享,则需要8000KB来支持40个用户。
共享页面时只需要在物理内存中保存一个编辑器的拷贝。每个用户的页表映射到编辑器的同一物理拷贝,而数据页映射到不同的块。
而对于分段系统中信息的共享更加的简单,只需要两个指针即可。
不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)