OS存储器管理(二)

离散分配

分页(Paging),分段,段页式

一、分页

一个进程的物理地址可以是非连续的;

将物理内存分成固定大小的块,称为块(frame);

将逻辑内存分为同样大小的块,称为页(page);

将连续的页分配并存放到不连续的若干内存块中;

建立页表,记录每一页对应的存储块的块号,将逻辑地址转换为物理地址。

将产生内部碎片

地址转换方法

将逻辑地址转换为虚拟地址:

CPU生成的地址分成以下两部分:

1.页号(p):页号作为页表中的索引。页表中包含每页所在物理内存的基地址。

2.页偏移(d):与页的基地址组合就形成了物理地址,就可送交物理单元。

逻辑内存和物理内存的分页模型:

例如:

将逻辑地址转换为物理地址需要寄存器来支持,地址转换体系结构如下:

地址变换机构如下:

假定一页大小为1K(1024B),考察逻辑地址2056,地址变换过程工作原理如下所示:

转换过程分析:逻辑地址机内表示(以16位为例)

无需计算,只需用块号代替高位的页号,就可立即得到对应的物理地址

例如:

页表的实现

1.页表保存在内存中

2.页表基寄存器(PTBR)指向页表

3.页表长度寄存器(PTLR)指示页表的大小

4.在这种方式下,每次数据/指令的访问需要访问两次内存。一次访问页表,另一次访问数据/指令

5.两次内存访问问题可以用特别的快速查找硬件缓冲(TLB,称为快表或联想存储器或关联内存或翻译后备缓冲器)来解决。

带TLB的分页硬件原理如下:

页表结构:

①层次化分页

②Hash页表

①层次化分页

1.将逻辑地址空间分成多个页表

2.一种简单的方法是两层分页法

示意图如下:

两层分页方法实例:

逻辑地址(32位机器,页大小为4K)分成以下两部分:页号(20位),页偏移(12位)

页表又分成页,所以页号又进一步分成:10位页号,10位页偏移

因此,逻辑地址表示如下:

②Hash页表

1.处理超过32位地址空间的常用方法是使用Hash页表。

2.逻辑地址中的逻辑页号被放入hash页表中。hash页表的每一项都包括一个链接组的元素,这些元素hash成同一位置(碰撞)。

3.逻辑页号与链表中的每 一个元素的第一个域相比较。如果匹配,那么对应的块号就用来形成位置地址。如果不匹配,那么就对链表中的下一个域进行页码比较。

Hash页表实例:

二、分段

支持用户观点的内存管理方法

程序是若干段的集合:主程序,子程序,函数,方法,对象,局部变量,全局变量,堆栈,符号表,数组

用户角度的程序:

段的逻辑视角:

段的体系结构:

逻辑地址由两个元素组成:<段号,偏移>

段表:将二维的用户定义地址映射为一维物理地址。段表的每个条目都有段基地址和段界限。

基地址:包含段的起始地址

界限:指定段的长度

段表基地址寄存器(STBR)指向内存中的段表的位置

段表长度寄存器(STLR)指示程序所用的段的个数

段号S小于STLR的时候才是有效的

段硬件实现:

分段实例:

三、交换

进程可以暂时从内存中交换出来到备份存储上,当需要再执行时再调回到内存中。

备份存储 —— 通常是快速磁盘。这必须足够大,以便容纳所有用户的内存映象拷贝,它也必须提供对这些内存映象的直接访问。

换入、换出 - 是交换策略的一个变种,被用于基于优先权的调度算法中。如果一个更高优先级进程来了且需要服务,内存管理可以交换出低优先级的进程,以便可以装入和执行更高优先级的进程。当更高优先级进程执行完后,低优先级进程可以交换回内存以继续执行。

交换时间的主要部分是转移时间。总的转移时间与所交换的内存空间直接成正比。

交换的修改版本在许多系统中被采用。(如UNIX, Linux及Windows)

交换示意图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

3524
来自专栏大史住在大前端

webpack4.0各个击破(7)—— plugin篇

plugin机制是webpack中另一个核心概念,它基于事件流框架tapable,你可以参考浏览器环境中的【DOM事件模型】,【SPA模型中的生命周期钩子】或是...

1652
来自专栏小詹同学

人脸识别(二)——训练分类器的补充说明

之前训练分类器时利用的是一个csv文件的读取,这里仅仅用几句话介绍一种简单易行的方法。 说到底,这类问题可以归类于读取指定文件夹...

4156
来自专栏牛客网

秋招java后端一些公司面经分享

oppo: 一面: java并发包,线程池相关 安全集合类 加密 网络问题:解决多次重复请求 socket编程 知道哪些设计模式 ... 二面: 64人  八跑...

3998
来自专栏蓝天

需要使用一致性哈希吗?

在普通的哈希中,如果节点个数(分母)发生变化,原先的次序会被完全打乱重来,一致性哈希解决了这个问题。实际可看成普通的哈希对着的是物理节点,而一致性哈希对着的是虚...

941
来自专栏linux驱动个人学习

Linux CFS调度器之队列操作--Linux进程的管理与调度(二十七)

完全公平调度器CFS中有两个函数可用来增删队列的成员:enqueue_task_fair和dequeue_task_fair分别用来向CFS就绪队列中添加或者删...

1542
来自专栏腾讯Bugly的专栏

Duang~ Android堆栈慘遭毁容?精神哥揭露毁容真相!

最近精神哥接到多个小伙伴的投诉,说无法看懂Bugly崩溃克星页面上显示的堆栈信息!精神哥赶紧把正研究的Top Crash崩溃和心爱的鸡爪放下,开始着手跟进。经分...

3405
来自专栏owent

ptmalloc,tcmalloc和jemalloc内存分配策略研究

最近看了glibc的ptmaoolc,Goolge的tcmalloc和jemalloc,顺便做了一点记录。可能有些地方理解地不太对,如有发现还请大神指出。

1.1K1
来自专栏Java编程技术

UML建模(状态图)

状态机图是一种行为图,它通过使用有限的状态转移展示了一个系统中一个模块的一些离散的行为,在UML2.4里面有两种状态机图:行为状态机(behavioral st...

1222
来自专栏程序员互动联盟

【C语言系列】C语言编译流程分析

前几天看了《程序员的自我修养——链接、装载与库》中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧。 我现在一般都是用gcc,所以自然以...

3545

扫码关注云+社区

领取腾讯云代金券