Holy Null 's Blog
Holy Null!
Toggle navigation
Holy Null 's Blog
主页
机器学习
Flume
Nginx
Hadoop
Apache Shiro
架构理论
Docker
Spring Cloud
关于我
归档
标签
操作系统存储管理中的地址变换
2016-12-15 10:16:04
234
0
0
holynull
# 操作系统存储管理中的地址变换 [看完整文章请点击这里](http://note.youdao.com/noteshare?id=0ca120aa9ee608dcfa63d266b1cbda25) 要了解操作系统的存储管理,我们首先需要明确这里的存储是指的什么?那么,这里的“存储”是指,计算机的内存和外存(比如:硬盘)。目前,大多数的操作系统都采用虚拟存储器的方式来管理存储。所谓虚拟存储技术,即在内存中保留一部分程序和数据,在外存中放置整个地址空间的副本。就是说程序的大部分数据和可执行程序都放在外存上。程序运行时可以访问内存中的数据和程序,如果要访问的程序和数据不在内存中时,就将之前内存中的程序和数据回写到外存,然后从外存中调入所需的程序和数据。 单一连续分区、固定分区、可变分区和可重定位分区,这些存储的组织方式不能实现虚拟存储管理。页式、段式和页段式才是虚拟存储的管理方式。我们这里主要讨论虚拟存储的管理中的地址变换问题。 ## 什么是虚拟存储? 我们来假设我们的一个程序以及它运行起来需要的数据一共是1K bit大小。而我们的内存只有512bit。那么我们可以看做虚拟存储大小为1Kbit。即,我们将程序和程序执行的数据整体看做是虚拟存储。那么,虚拟存储的容量是允许大于内存的容量的,也就是所说的虚拟存储的地址范围是可以大于内存的地址范围的。(在非虚拟存储的一些操作系统中,是不允许作业的大小超过内存容量的,因为作业是一次性装载入内存的。)因为,实际运行过程只有一部分程序和数据存放在内存上,大部分存放在外存上。程序运行过程中,程序和数据在操作系统的管理下,在内存和外存之间进行不断的交换。 ## 地址变换 我们把内存中的实际地址叫做物理地址,而虚拟存储中的地址叫做逻辑地址。也就是说逻辑地址的范围是允许大于物理地址的范围的。那么,如果按照逻辑地址在内存中寻址,就会产生错误。这怎么办?幸运的是计算机硬件会在存储管理的过程中,帮我们把逻辑地址转换成物理地址。 ## 页式存储管理的地址交换 页式存储是将虚拟存储的数据按页分割。然后在内存中按照虚拟存储中页的大小,开辟与页数相同的区。再在内存中创建一个页表。页表中记录虚拟存储的页号和一页开始的物理地址。最后,在控制寄存器中记录页表的长度和页表的物理地址。那么,页式管理的逻辑地址就由页号和页内偏移(即页内存储块的序号)组成。 |页号|页内偏移| |---|---| |0|0000010| 上表中的逻辑地址表示,第0页中的第2(0000010转十进制为2)个存储块(都是从0计数)。通过页内偏移的位数(7位),我们能够确定页的大小为`$2^7$`bit。因为,地址最大值为`$2^7-1$`。 系统在根据逻辑地址寻址时,首先从寄存器的页表地址中,找到页表。然后按照页表找到逻辑地址中页号对应的页的起始物理地址。用这个起始地址加上逻辑地址中的页内偏移,就得到了该逻辑地址对应的物理地址。 下面我们来看一个例子。我们在寄存器中存放了页表的信息如下表: |页表长度|页表地址| |---|---| |512K|010000| 假定页大小为8K,按照下面的页表计算,逻辑地址为9612的物理地址是多少? |页号|物理块号| |---|---| |0|1| |1|3| |2|5| 操作系统根据寄存器中存储的页表物理地址,找到页表。上面关于寄存器的描述其实跟我们计算物理地址没有什么关系,主要是需要一个让操作系统找到页表的方式。 因为,`$8K=2^{13}$`,所以我们可以确定页内地址有13位。逻辑地址9612转成二进制为10 0101 1000 1100,所以其中低13为为页内偏移,高位为页号。那么,页号为1的页物理块号为3(二进制为11)。所以,物理块号与页内偏移合并后得到物理地址110 0101 1000 1100,转换为十进制为25 996。 |注意| |---| |这里的物理块号,并不是物理地址。物理块号作为高位,页内偏移作为低位,即得到合并的物理地址。| 在段式管理中,逻辑地址转物理地址的算法与页式管理基本一致。 下面是转换流程图。 ``` graph TD; a((开始))-->b[在寄存器中找到页表的物理地址即找到页表]; b-->c[在页表中找到对应的页号所对应的物理块号]; d[页号]-->c; c-->e[合并物理块号和页内偏移]; f[页内偏移]-->e; e-->g[物理地址]; g-->h((结束)); ``` ## 段页式地址转换 段页是地址转换,其实就是在页式转换前加入段表寻址,并且寄存器中存储的是段表的长度和段表的物理位置。 段页式管理逻辑地址: |段号|页号|页内偏移| |---|---|---| 寄存器: |段表长度|段表物理地址| |---|---| 段表结构: |段号|页表长度|页表物理地址| |---|---|---| 页表结构: |页号|物理块号| |---|---| 段页式地址转换流程: ``` graph TD; a((开始))-->b[在寄存器中找到段表的物理地址即找到页表]; b-->c[在段表中找到段号所对应的页表物理地址]; d[段号]-->c; c-->e[根据页号找到物理块号]; f[页号]-->e; e-->g[合并物理块号和页内偏移]; j[页内偏移]-->g; g-->h[得到物理地址]; h-->i((结束)); ```
上一篇:
查询关系代数表达式
下一篇:
死锁
0
赞
234 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册