OS存储器管理(一)

存储器的层次:

分为寄存器、主存(内存)和 辅存(外存)三个层次。

主存:高速缓冲存储器、主存储器、磁盘缓冲存储器,

         主存又称为可执行存储器;

辅存:固定磁盘存储器、可移动的外部存储器;

         其可长期保存数据,但不能被处理器直接访问。

此处针对的是在OS层面上对主存(内存)的管理。

内(主)存储器管理的主要功能:① 逻辑地址到物理地址的转换     ② 内存(主存)空间的分配与回收     ③ 内存信息(数据)的共享与保护     ④ 内存的逻辑扩充(虚拟存储器的实现)

一个用户程序在运行之前需要经历若干步骤,为了执行,程序应被调入内存并放在进程内:

在这些步骤中,地址可能有不同的表示形式:

符号(源程序中),可重定位的地址(目标模块),绝对地址(内存映像)

逻辑地址:目标代码的相对编址。由CPU生成,也称为虚拟地址

物理地址:内存存储单元的编址,内存单元的实际地址

逻辑地址空间:目标代码用逻辑地址编址对应的区域

内存存储空间:内存若干存储单元用物理地址编址对应的区域

重定位:逻辑地址转换为物理地址的操作(过程)

接下来,将指令与数据捆绑到内存地址,可以在以下步骤的任何一步中执行:

编译时:MS-DOS的COM格式程序

加载时:编译器生成可重定位代码

执行时:进程在执行时可以从一个内存段移到另一内存段,那么捆绑必须延迟到执行时才进行。

运行时从虚拟地址映射到物理地址的硬件设备称为内存管理单元(MMU)

用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值。

用户程序处理的是逻辑地址,它不会看到真实的物理地址。

原理图如下:

例如:

重定位的方式:

静态重定位:目标代码装入内存时,一次性进行逻辑地址到物理地址的地址转换。

动态重定位:目标代码装入内存时,先不进行地址转换(即原代码装入),在执行时,再实施地址转换。

内存分配的方式:连续分配和非连续分配

内存通常分为两个区域:

一个用于驻留操作系统,常与中断向量一起放在低内存

另一个用于用户进程,常放在高内存。

一、连续分配

四种方式:

①单一连续区分配

②固定分区分配

③可变(动态)分区分配

④可重定位分区分配

①单分区分配方法(Single-partition allocation)

重定位寄存器方案用来保护用户进程之间,用户进程与操作系统之间不会相互修改代码与数据

重定位寄存器包含了最小的物理地址;界限寄存器包含了逻辑地址的范围,每个逻辑地址必须小于界限寄存器

②固定分区分配

* 算法思想

内存可用区划分成若干个大小固定的存区,每个存区分别装入一道作业的代码(数据)。

* 算法实现

建立分区说明表,记录各分区大小、地址及分配情况

例如:

分区号

分区大小

起始地址

状态

1

12k

20k

已分配

2

32k

32k

已分配

3

64k

64k

已分配

4

128k

128k

空闲

5

分配:查分区说明表,找到一个足够大的空闲分区分配之;

回收:将回收分区对应的分区说明表状态改为“空闲”。

优点:内存可同时装入多道作业代码,算法实现简单;

缺点:存在浪费(分区一次性全部分配出去);会产生内部碎片。

③动态存储分配问题

算法思想:事先不划分分区,待作业需要分配内存时,再按需分配划分分区(分区的大小及个数不固定)。

数据结构:

空闲分区表或空闲分区链表  ---->   记录空闲分区的大小、地址等

空闲分区链表状况:

分配:查空闲分区链表,找到第一个足够大的分区,将其一分为二分配之;

分配策略(算法):首次适应算法,循环首次适应算法,最佳适应算法,最差适应算法

回收:先将回收分区与相邻空闲分区合并再修改空闲分区链表。

回收算法:前邻接合并,后邻接合并,前、后邻接合并,不邻接处理

* 优、缺点

按需分配,可解决浪费问题; 分配算法复杂,会产生外部碎片;

邻接合并系统开销大。

* 碎片问题

碎片:可变分区分配过程中形成的若干个非常小的无法再利用的小分区,形成外部碎片

碎片分为外部碎片和内部碎片。

处理碎片的方法:

1.紧缩(compaction,拼接):用来降低外部碎片移动内存内容,以便所有空闲空间合并成一整块。

如果重定位是动态的,是在运行时进行的,那么就能采用紧缩

2.另一种可能解决外部碎片问题的方法是允许物理地址空间为非连续,这样只要有物理内存就可为进程分配:分页或分段

④可重定位分区分配

* 算法思想

在可变分区分配算法的基础上,采用动态重定位方式装入程序(数据)。当无足够大的分区供分配时,若总的空闲存储容量够用,则将各分区中的内容向内存一端移动(紧凑),使另一端形成一个大的空闲分区,然后再分配。

例:前例若要为作业10分配120k的存储空间,因无足够大分区(总空闲容量290k),则先进行合并处理:

内存的离散分配方式见下篇。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逢魔安全实验室

铁人三项2018 pwn [aleph1] Writeup

本文内容比较多,建议点击https://blog.formsec.cn/2018/06/11/%E9%93%81%E4%BA%BA%E4%B8%89%E9%A1...

1253
来自专栏地方网络工作室的专栏

Shell 命令行,生成当前文件夹目录索引 index.html 文件

Shell 命令行,生成当前文件夹目录索引 index.html 文件 做了一些原型图放在 git 上面,在服务器配置好自动拉取 git 中的文件,并配置一个 ...

2759
来自专栏用户2442861的专栏

深入剖析Socket实现

http://blog.csdn.net/zapldy/article/details/5813984

1172
来自专栏用户2442861的专栏

修改npm全局安装模式的路径

刚学nodeJS不久,很纳闷为什么全局安装的模块在 'node安装目录/node_modules‘ 中没找到!后来仔细看了下安装成功后的信息,才发现原来是自动安...

1002
来自专栏逸鹏说道

Owin:“System.Reflection.TargetInvocationException”类型的未经处理的异常

异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR Owin:“System.Reflect...

3865
来自专栏vue学习

33、vuex初探(一)

看完以后应该是有点懵逼的,所以这就是这篇文章存在的意义了:就是让你不那么懵逼;总归理论与实践相结合才能真正弄明白一个东西,所以我们简单实践一下。

1656
来自专栏电光石火

ThinkPHP导出CSV、Excel

如题,我们在实际中EXCEL的导出比导入用的多,这里给大家分享一个导出CSV EXCEL导出,简单,方便。 首先我们在Thinkphp/Library...

3038
来自专栏用户画像

3.1.4.2 基本分段存储方式

分页管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提高计算机的性能,提升计算机的性能,且分页通过硬件机制实现 ,对用户完全透明;

1102
来自专栏Python、Flask、Django

python中用requests获取API参数

2206
来自专栏玄魂工作室

安全杂谈——linux通配符绕过文件名黑名单

linux shell下可以通过正则匹配来匹配相应的程序并且执行。 在linux下输入man 7 glob命令可以查看相关的内容。值得注意的就这些,学过正则的一...

1052

扫码关注云+社区

领取腾讯云代金券