操作系统——内存离散分配

基本分页存储管理方式


概念

内存划分成多个小单元,每个单元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编址,可分别编写和编译。装入内存时每个段赋予各段一个段号。

每个段占据一块连续的内存(既有连续的,又有分离的)

各段的大小不等

地址结构:段号+段内地址

段表:记录每段实际存放的物理地址





分页容易造成共享和非共享数据共处一页,不方便设置权限。


段页式存储

基本原理:
将用户程序分成若干段,并为每个段赋予一个段名。
把每个段分成若干页
地址结构包括段号、段内页号和页内地址三部分


你可能感兴趣的:(操作系统——内存离散分配)