虚拟内存的学习

什么是虚拟内存?

首先我们了解分页的概念。

把内存按照不等的固定长度分区(把内存分成大大小小的区域,来等待进程的进入)或者按照可变长度分区(当一个进程调入内存的时候,分配的内存大小可以与进程所需要的大小相同),这两种方式在进程进进出出之后总容易产生空块,或者说碎片,导致内存的使用效率下降。我们可以看出这两种方式不是把内存作为衡量单位就是把进程大小作为依据,那为何不让他们二者都符合相同的规则呢?那么就有了分页的想法。

把存储器分成相当小的、相等的固定长度的存储块,将每个进程也划分成小的固定长的程序块,那么程序的每个程序块(被称为页)能分配到存储器的可用存储块(称为帧)中,这样浪费的空间最多也就是最后一页的一小部分。

进而不难想到,程序的页表是什么了。页表就是存着程序的一个接一个页在存储器的帧地址的表。

当无足够的连续空闲帧来存储这个进程的时候,也不会妨碍操作系统装入这个进程。因为我们有页表了啊,像链表一样,我们不一定非得连续存储进程的页们。

但是在一个接一个在帧中找进程的页们的时候,我们还需要用到逻辑地址。逻辑地址有两部分构成,首先是页号,然后再有一个地址相对于这个程序存储时起始地址的偏移量,那么我们就能将它转换为物理地址去寻找这一页的信息到底在进程页表的哪个位置,进而通过该位置上存的帧号,去寻找主存里的那一帧。


进程分页这一策略导致了另一概念的产生——虚拟存储器

我们对刚刚讨论的分页方案进行改进,我们不把进程所有的页都装进内存里,只在需要的时候才装进内存里,而且在一小段时间内,程序所需要的只有其中一小部分数据,这就是局部性原理。同时,操作系统必须比如明白一种机制,当它调入一页时,必须把另一页换出去,这就是页替换。如果它换出的页正好是要使用的页,则有要把它调入内存,这种现象频繁发生就称为抖动。一种解决方案是最近最少使用算法。

因为进程只在内存中执行,座椅内存被称为实存储器,但是程序员或者用户往往看到一个大得多的存储器,它分配在磁盘上,这就是虚拟存储器。

想要访问虚拟内存,那么要用到逻辑地址向物理地址转换。一个进程拥有一个页表,但这个页表往往很大,所以大多数操作系统将页表也存放在虚拟内存中,那么访问这些页表也需要分页,这就形成了二级页表结构


原则上,每次虚拟存储器的访问要引起两次物理存储器的存取,一次是获取相应的页表项,另一次是获得所需的数据,这样使存取时间加倍。为了解决这个问题,虚拟存储器使用了一个特殊的高速缓存来存储页表项,成为快表(TLB)。

补充一点,相对于刚刚所讲的分页,还有一种策略是分段,分段不同于分页,分段是对程序员可见的。分段后,存储器由多个地址空间或者段组成。段长度是可变的、可动态分配的。各程序可以有许多的程序段和数据段。

对于程序员来讲,分段有以下几个优点:

1.      简化了对数据结构的处理。数据结构可以自己分配它的段。

2.      允许每段程序独立的修改和重编译,不需要整个程序重新连接和重装入,而用多个段来完成。

3.      进行进程共享,将某程序或者数据表放入一段,其他进程也可以访问该段。

4.      可以实现段保护。

分段和分页有哪些区别呢?总结如下:

(1)式的逻辑地址是连续的,段式的逻辑地址可以不连续
(2)页式的地址是一维的(页表中存放着物理块号),段式的地址是二维的(段表中存放着 )

(3)分页是操作系统进行,分段是用户确定
(4)各页可以分散存放在主存,每段必须占用连续的主存空间

        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值