(一)分页式管理:硬件地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
(1)把进程的页表起始地址和页表长度(在进程控制块中)装入CPU控制寄存器
(2)把程序计数器中存放的逻辑地址中的页号部分与控制寄存器中的页表长度比较,检查地址越界
(3)将页号与页表起始地址相加,得到访问的所在页在页表的入口地址
(页表的入口地址 = 页表起始地址 +页号 x 页表项占用字节)
(4)访问该地址,得到该页对应的主存块号,与程序计数器中的页内地址拼接就得到了对应的物理地址。
在基本地址变换机构中,每次想访问一个物理地址,都需要到内存中去先查一下页表,再去访问物理地址
快表(联想存储器,TLB),是一种访问速度比内存快很多的硬件高速缓冲寄存器组,用来存放最近访问过的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常被称为慢表。块表中每一项:页号、块号、状态位(该项是否被占用)、访问位
硬件地址变换机构进行转换时,同时开始两个变换过程,一个是利用主存页表进行正常变换,另一个是利用快表,一旦快表中找到页号,将立即停止访问主存页表过程,若没找到,则继续正常的地址转换,把页号和页表中的块号写入快表中状态位为0或访问位为0的一行,将状态位和访问位置1。
(二)分段式管理:
与页式基本相同,段表项:段的起始地址、段的长度、段的访问方式,转换时对三项都要进行检查。
在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的块,程序加载时,可以将任意一页放入内存中任意一个块,不必连续,用页表记录逻辑页和主存块的映射关系。页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)。页式不易进行共享。
在段式存储管理中,将程序的地址空间按照程序的自身逻辑划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间。分配以段为单位,为进程的每一个分段分配一个连续的主存,各段之间不用连续。用段表来记录每个段的主存起始地址、段的长度、允许的访问方法。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片),容易实现对各段的保护和信息共享。
两者的不同点:
主要分为时间局部性和空间局部性。
虚拟内存的基本思想是:为每个进程构造一个独立的足够大的地址空间,允许进程的地址空间不必全部进入主存就可以运行,只需要把运行时用到的部分信息装入。
以请求分页式为例,当程序引用到一部分在内存中的页时,由硬件进行正常地址的映射;当程序引用到一部分不在内存中的页时,操作系统将产生缺页中断,进行缺页处理,从磁盘中取得缺的页放入内存,如果内存已满,还会根据页面淘汰算法将主存中的页换出。这样,对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分对应内存上的一块,还有一些没加载在内存中的对应在硬盘上。
注意,请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。
页表会增加有效位和修改位
当页交换算法不合理时,如果一个页刚被调出内存,下面又要访问它,这样如果频繁地发生这种情况,那么处理器大部分时间都消耗在内存与外存之间的页交换上了,而不是执行指令。这种情况叫做“系统抖动”。
段表增加有效位,修改位,采用段的动态链接,即在程序运行或装入时进行链接,节省时间,便于进行段的共享。
段的逻辑地址转换位一维的线性地址(虚地址),再转换为主存物理地址
在Linux下为4GB,进程私有部分占3GB,进程共享的操作系统部分占1GB。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。