基本分页存储管理方式
概念
内存划分成多个小单元,每个单元K大小,称(物理)块。作业也按K单位大小划分成片,称为页面。为了找到被离散分配到内存中的作业,记录每个作业各页映射到那个物理块 ,形成页面映射表,简称页表。
页表记录的是页号到物理块号的地址映射
假如要找到作业A,找到页表(通过PCB,页表位置记录在PCB中)–>根据页表找到物理快
页表实际存放的位置是内存(或者页表寄存器中)
地址的处理方式连续方式下,每条指令用基地址+偏移地址则可找到物理地址
由上图可以看出:页面大小为8B(8条指令),则页内地址需要三位二进制数来表示,作业大小32B,32/8=4,则需要4个块,所以在地址中取后三位表示页内地址,(四个页面需要2个二进制位表示,所以再取倒数45位作为块地址),括号中只是举个例子因为并不一定是连续存储,但是原理就是如此,除去后三位其余的表示块号,例如上图中第三页存到了第七个块中,则它的块号为111(页号与块号的映射关系存在页表中)
规律
作业相对地址在分页下不同位置的数有一定的意义结构:
页号+页内地址(即页内偏移)
关键的计算是:根据系统页面大小找到不同意义二进制位的分界线。
从地址中分析出页号后,地址映射只需要把页号改为对应物理块号,偏移不变,即可找到内存中实际位置。
**注意:**一作业所有指令在用户地址空间是顺序编址
举例说明
答:页面大小4K=2^12,所以需要12位二进制数来表示页内地址,作业大小32K,32/4=8,所以需要八页(即8个块),需要三个二进制数表示。
这里的页表的大小是指存块号占的地址
访问内存的有效时间
进程发出逻辑地址的访问请求,经过地址变换,到内存中找到对应的实际物理地址单元并取出数据,所需花费的总时间,称为内存的有效访问时间EAT(effective access time)
设访问一次内存时间为t,则基本分页机制下EAT=2t
:因为操作一条指令需要访问内存两次
减少第1步访问内存的时间。增设一个具有“并行查询”能力的高速缓冲寄存器,称为“快表”,也称“联想寄存器”(Associative memory),IBM系统称为TLB(Translation Look aside Buffer)。
此时:设一次查找访问快表时间为t’ ,则
EAT= at’ + (1-a)(t’+t) + t
= 2t +t’ -ta
两者比较:
两级页表
理解
当页表中的项太多,会存在一个页表放不下的情况(毕竟页表也是存在内存中,当内存的一个块放不开页表,就会将一个页表分开放入两个块中,为了能找到这两个页表的位置,就引入了二级页表,又称为外表用来存放页表分开后的位置)
如图:
理解:
外页号的取值同前边页号的取值一样
每个进程一张页表
一张OS反置页表+没进程一张外部页表
**反置页表:**站在物理角度,记录占用他的已调入内存的进程标识和页号。系统中只需要一张表即可(例如:一个64MB内存,若页面大小4KB[64M/4K=2^16 ,16个物理块],反置页表占用64KB(16K*4B))
**进程外部页表:**每个进程一张,记录进程不在内存中的那些页面所在物理位置。
**如何提高检索反置页表的速度:**内存容量大时,反置页表的页表项还是会很大,利用进程标识符和页号去检索一张大的线性表很费时,可利用hash算法提高检索速度。
分段
程序通过分段划分为多个模块,每个段定义一组逻辑信息(如代码段,数据段,栈段)
段的特点
每个段有自己的名字(一般是段号),都从0编址,可分别编写和编译。装入内存时每个段赋予各段一个段号。
每个段占据一块连续的内存(既有连续的,又有分离的)
各段的大小不等
地址结构:段号+段内地址
段表:记录每段实际存放的物理地址
分页容易造成共享和非共享数据共处一页,不方便设置权限。
段页式存储
基本原理:
将用户程序分成若干段,并为每个段赋予一个段名。
把每个段分成若干页
地址结构包括段号、段内页号和页内地址三部分