一些存储概念自己有用需要封装内存分配函数是了解
来源:互联网 发布:软件快捷方式被删除 编辑:程序博客网 时间:2024/06/08 04:33
连续分配存储方式
1.固定分区(Fixed Partitioning)分配
固定分区是在作业装入之前,内存就被划分成若干个分区。划分工作可以由系统管理员完成,
也可以由操作系统实现。然而一旦划分完成,在系统运行期间不再重新划分,即分区的个数不可变,
分区的大小不可变,所以,固定式分区又称为静态分区。
这种分区方式一般将内存的用户区域划分成大小不等的分区,以适应不同大小的作业的需要。系
统有一张分区说明表,每个表目说明一个分区的大小、起始地址和是否已分配的使用标志。
固定分区(Fixed Partitioning)分配
分区说明表
区号 大小 起址 标志
1 16KB 20K 已分配
2 32KB 36K 已分配
3 64KB 68K 已分配
4 124KB 132K 未分配
固定式分区实现技术简单,但是内存的利用率不高,适用于作业的大小和多少事先都比较清楚的
系统中。它用于60年代的IBM-360的MFT操作系统中。
2.动态/可变式(Dynamic Partitioning)分区分配
可变式分区是指在作业装入内存时,从可用的内存中划出一块连续的区域分配给它,且分区大
小正好等于该作业的大小。可变式分区中分区的大小和分区的个数都是可变的,而且是根据作业的大
小和多少动态地划分,因此又称为动态分区。这种存储管理技术是固定式分区的改进,既可以获得较
大的灵活性,又能提高内存的利用率。
可变式分区的分配和释放的基本思想是:在分配时,首先找到一个足够大的空闲分区,即这个空
闲区的大小比作业要求的要大,系统则将这个空闲分区分成两部分:一部分成为已分配的分区,剩余
的部分仍作为空闲区。在回收撤除作业所占领的分区时,要检查回收的分区是否与前后空闲的分区相
领接,若是,则加以合并,使之成为一个连续的大空间。
动态/可变式(Dynamic Partitioning)分区分配
1、 可变式分区数据结构
空闲区表形式
空闲分区表为每个尚未分配的分区设置一个表项,包括分区的序号、大小、始址和状态。空闲区
链形式
为了实现对空闲分区的分配和链接,在每个分区的起始部分,设置一些用于控制分区分配的信息
(如分区的大小和状态位),以及用于链接其它分区的前向指针;在分区尾部,则设置了一个后向指
针,为了检索方便也设置了控制分区分配的信息。然后,通过前、后向指针将所有的分区链接成一个
双向链表。
动态/可变式(Dynamic Partitioning)分区分配
序号P 大小 起址 状态
1 32k 20k 空闲
2 56k 260k 空闲
3 116k 396k 空闲
4 - - 空表目
5 - - 空表目
2、 分区分配算法(Partitioning Placement Algorithm)
最佳适应算法(Best Fit):
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。
为适应此算法,空闲分区表(空闲区链)中的空闲分区要按大小从小到大进行排序,自表头开始查找
到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
首次适应算法(First Fit):
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目
的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进
行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的
空闲区。
循环首次适应算法(Next Fit):
该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从
上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一
块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
(4)动态重定位分区分配
1、 紧凑(Compaction)/拼接
可变式分区也有零头问题。在系统不断地分配和回收中,必定会出现一些不连续的小的空闲区
,称为碎片(fragment)(又称零头)。小的空闲区称外零头,固定分区内的空闲部分称为内零头。
虽然可能所有零头的总和超过某一个作业的要求,但是由于不连续而无法分配。解决零头的方法是紧
凑(或称拼接),即向一个方向(例如向低地址端)移动已分配的作业,使那些零散的小空闲区在另
一方向连成一片。分区的拼接技术,一方面是要求能够对作业进行重定位,另一方面系统在拼接时要
耗费较多的时间。
2、 动态重定位
实现紧凑所需的允许作业在运行过程中在内存中移动的技术必须获得硬件支持。只有具有动态
重定位硬件机构的计算机系统,才有可能采取动态重定位可变分区多道管理技术,系统的硬件包括重
定位寄存器和加法器。
3、 动态重定位分区分配算法
动态重定位分区管理中何时进行存储器紧缩有二种不同的解决办法:
在某个分区被释放后立即进行紧缩,系统总是只有一个连续的分区而无碎片,此法很花费机时。
当"请求分配模块"找不到足够大的自由分区分给用户时再进行紧缩,这样紧缩的次数比上种方法
少得多,但表格管理复杂。采用此法的动态重定位分区分配算法框图。
4、 分区的保护
分区的保护的常用方法是由系统提供硬件:一对界限寄存器。这可以是上界寄存器、下界寄存
器,或者是基址寄存器、限长寄存器。基址寄存器存放起始地址,作为重定位(地址映射)使用;限
长寄存器存放程序长度,作为存贮保护使用。
- 一些存储概念自己有用需要封装内存分配函数是了解
- struts中需要了解的一些概念
- Android初学需要了解的一些概念
- vue需要了解的一些概念
- C语言一些常用内存分配函数
- 封装函数时候,函数内分配内存简单管理方法。
- 由malloc内存分配是否连续 引出的 一些概念
- 存储区划分,堆内存分配函数,其他内存分配函数,内存操作函数
- 关于C语言变量内存分配一些自己的理解。
- 了解一些概念
- 一些很有用的小函数(自己写的)
- 整理了一些编程过程中需要了解HTTP协议,希望有用
- java内存分配存储
- ios 对请求工具AFNetWoring封装自己的一些用法分享(觉得有用的可以看看)
- NewInstance 是分配内存
- malloc函数是C/C++中常用内存分配库函数,本篇文章将以Linux平台上的malloc为剖析对象,深入了解分配一块内存的旅程。
- malloc函数进行内存分配是在什么阶段?
- 我自己的Javascript 库,封装了一些常用函数
- Liferay Portal额外研究(五):对多分发命令Action的支持(方案一)
- 动态链表
- 常用的tar和rpm命令参数列表
- Liferay Portal额外研究(六):Portlet附件上传处理的点滴
- Eclipse使用技巧
- 一些存储概念自己有用需要封装内存分配函数是了解
- Struts + Hibernate 实现 分页
- The collapse of communism ed. by Bernard Gwrtzman, Michael T. Kaufman
- 【推荐】每个初学者都应该搞懂的问题!
- Windows数据类型探幽(4)
- Liferay Portal学习笔记(一):安装
- 一个简单的分页
- Liferay Portal学习笔记(二):使用CMS
- Adobe向Firefox捐献源代码 与Mozilla共同管理