当前位置: 首页 > 编程日记 > 正文

操作系统--内存管理方式

“碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分 配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。

internal fragmentation:when memory allocated to a process is larger than requested memory,

the difference between these two numbers is internal fragmentation.

external fragmentation:External fragments exists when total memory space exists to satisfy a request,

but it is not continous. storage is broken into little pieces.

在内存管理中,内部碎片是已经被分配出去的的内存空间大于请求所需的内存空间。

外部碎片是指还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块。

固定分区存在内部碎片,可变式分区分配会存在外部碎片;

页式虚拟存储系统存在内部碎片;段式虚拟存储系统,存在外部碎片

为了有效的利用内存,使内存产生更少的碎片,要对内存分页,内存以页为单位来使用,最后一页往往装不满,于是形成了内部碎片。

为了共享要分段,在段的换入换出时形成外部碎片,比如5K的段换出后,有一个4k的段进来放到原来5k的地方,于是形成1k的外部碎片。

---------------------------------------------------------------------------------------------------------

存储器是个宝贵但却有限的资源。一流的操作系统,需要能够有效地管理及利用存储器。

内存为程序分配空间有四种分配方式:

1、连续分配方式

2、基本分页存储管理方式

3、基本分段存储管理方式

4、段页式存储管理方式

连续分配方式

首先讲连续分配方式。连续分配方式出现的时间比较早,曾广泛应用于20世纪60~70年代的OS中,但是它至今仍然在内存管理方式中占有一席之地,原因在于它实现起来比较方便,所需的硬件支持最少。连续分配方式又可细分为四种:单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配。

其中固定分区分配方式,因为分区固定,所以缺乏灵活性,即当程序太小时,会造成内存空间的浪费;程序太大时,一个分区又不足以容纳,致使程序无法运行。但尽管如此,当一台计算机去控制多个相同对象的时候,由于这些对象内存大小相同,所以完全可以采用这种内存管理方式,而且是最高效的。这里我们可以看出存储器管理机制的多面性:即没有那种存储器管理机制是完全没有用的,在适合的场合下,一种被认为最不合理的分配方案却可能称为最高效的分配方案。一切都要从实际问题出发,进行设计。

为了解决固定分区分配方式的缺乏灵活性,出现了动态分配方式。动态分配方式采用一些寻表的方式,查找能符合程序需要的空闲内存分区。但代价是增加了系统运行的开销,而且内存空闲表本身是一个文件,必然会占用一部分宝贵的内存资源,而且有些算法还会增加内存碎片。

可重定位分区分配通过对程序实现成定位,从而可以将内存块进行搬移,将小块拼成大块,将小空闲“紧凑”成大空闲,腾出较大的内存以容纳新的程序进程。

基本分页存储管理方式

连续分配方式会形成许多“碎片”,虽然可以通过“紧凑”方式将许多碎片拼接成可用的大块空间,但须为之付出很大开销。所以提出了“离散分配方式”的想法。如果离散分配的基本单位是页,则称为分页管理方式;如果离散分配的基本单位是段,则称为分段管理方式。

分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。

在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页,依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。

为了能够将用户地址空间中的逻辑地址,变换为内存空间中的物理地址,在系统中必须设置地址变换机构。地址变换任务是借助于页表来完成的。

页表的功能可由一组专门的寄存器来实现。由于寄存器成本较高,且大多数现代计算机的页表又很大,使页表项总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。因为一个进程可以通过它的PCB来时时保存自己的状态,等到CPU要处理它的时候才将PCB交给寄存器,所以,系统中虽然可以运行多个进程,但也只需要一个页表寄存器就可以了。

由于页表是存放在内存中的,这使得CPU在每存取一个数据时,都要两次访问内存。为了提高地址变换速度,在地址变化机构中增设了一个具有并行查询能力的告诉缓冲寄存器,又称为“联想寄存器”(Associative Lookaside Buffer)。

在单级页表的基础上,为了适应非常大的逻辑地址空间,出现了两级和多级页表,但是,他们的原理和单级页表是一样的,只不过为了适应地址变换层次的增加,需要在地址变换机构中增设外层的页表寄存器。

基本分段存储管理方式

分段存储管理方式的目的,主要是为了满足用户(程序员)在编程和使用上多方面的要求,其中有些要求是其他几种存储管理方式所难以满足的。因此,这种存储管理方式已成为当今所有存储管理方式的基础。

(1)方便编程;

(2)信息共享:分页系统中的“页”只是存放信息的物理单位(块),并无完整的意义,不便于实现共享;然而段却是信息的逻辑单位。由此可知,为了实现段的共享,希望存储器管理能与用户程序分段的组织方式相适应。

(3)信息保护;

(4)动态增长;

(5)动态链接。

分段管理方式和分页管理方式在实现思路上是很相似的,只不过他们的基本单位不同。分段有段表,也有地址变换机构,为了提高检索速度,同样增设联想寄存器。所以有些具体细节在这个不再赘述。

分页和分段的主要区别:

1、两者相似之处:两者都采用离散分配方式,且都要通过地址映射机构来实现地址变换。

2、两者不同之处:

(1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页仅仅是由于系统管理的需要而不是      用户的需要。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。

(2)页的大小固定且由系统决定,而段的长度却不固定。

(3)分页的作业地址空间是一维的,即单一的线性地址空间;而分段的作业地址空间则是二维的。

段页式存储管理方式

前面所介绍的分页和分段存储管理方式都各有优缺点。分页系统能有效地提高内存利用率,而分段系统则能很好地满足用户需求。我们希望能够把两者的优点结合,于是出现了段页式存储管理方式。

段页式系统的基本原理,是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。在段页式系统中,地址结构由段号、段内页号和页内地址三部分所组成。

和前两种存储管理方式相同,段页式存储管理方式同样需要增设联想寄存器。

离散分配方式基于将一个进程直接分散地分配到许多不相邻的分区中的思想,分为分页式存储管理,分段存储管理和段页式存储管理. 分页式存储管理旨在提高内存利用率,满足系统管理的需要,分段式存储管理则旨在满足用户(程序员)的需要,在实现共享和保护方面优于分页式存储管理,而段页式存储管理则是将两者结合起来,取长补短,即具有分段系统便于实现,可共享,易于保护,可动态链接等优点,又能像分页系统那样很好的解决外部碎片的问题,以及为各个分段可离散分配内存等问题,显然是一种比较有效的存储管理方式。

转载于:https://www.cnblogs.com/cane/p/3972010.html

相关文章:

题解 UVA11354 【Bond】

并查集按秩合并 传送门 大意:给出一张n个点m条边的无向图, 每条边有一个权值,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的边的最大权值最小。 我们可以发现,跑最小生成树会跑挂&…

管理 zabbix_Zabbix 2019 峰会丨看睿象云如何在 Zabbix 中玩转告警

2019年11月29日-30日,为期两天的 Zabbix 大会中国站在北京盛大召开,本届 Zabbix 大会以“新视界,新技术,共建未来新监控!”为主题,为与会人员提供前沿的监控技术学习,多元的行业案例讲解,以及现…

Oracle存储过程返回游标实例详解

复制代码 代码如下:CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT VARCHAR2, P_SUB VARCHAR2, P_SENDOR VARCHAR2, P_RECEIVER VARCHAR2, P_SERVER VARCHAR2, P_PORT NUMBER DEFAULT 25, P_NEED_SMTP INT DEFAULT 0, P_USER VARCHAR2 DEFAULT NULL, P_PASS VARCHAR2 DEFAUL…

03 Django REST Framework 视图和路由

01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。 比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据…

[Quick-x]制作新手引导高亮区域方法之二:裁剪模式

demo下载:https://github.com/chenquanjun/Quick-x-HighlightArea 2、裁剪模式 (1)创建裁剪对象 local bgColor ccc3(255, 0, 0) --非高亮区域颜色local bgOpacity 0.6 --非高亮区域透明度local layerColor CCLayerColor:create(ccc4(bgColor.r, bgColor.g, bgCo…

单一窗口关区备案_单一窗口税费支付权限管理

企业需先使用法人卡登录“单一窗口”税费支付系统进行业务权限授权后,才可以使用操作员卡查询、支付、打印税单等。“业务权限授权”模块提供税费支付企业相关业务权限(关区、协议)的授权功能。使用“单一窗口”税费支付系统的部门、用户、角色管理与权限配置等操作…

每日一题题目29:五个数字能组成多少互不重复的四位数

#有五个数字:1、2、3、4、5,能组成多少个互不相同且无重复数字的四位数?各是多少? e [] for a in range(1,6):for b in range(1,6):for c in range(1,6):for d in range(1,6):if a!b and a!c and a!d and b!c and b!d and c!d:e.a…

读书:历史 -- 空王冠

15世纪50到80年代的玫瑰战争,短短30年间王冠易手7次,成千上万人死于战乱。这段时期,可以算得上英国历史上最混乱、最残暴的历史时期。 英国统治时间最长的金雀花王朝分崩离析,被都铎王朝取代。

机器人香囊_青少年智能机器人等级评定~户外营~圆满结束!

2020暑期田园探秘~青少年智能机器人等级评定户外营在8月3日至7日短暂而愉快的欢乐时光中圆满结束了让我们一起来回顾一下这愉快、欢乐、体验成长的时光孩子们在激动的心情下踏上了探秘的欢快路途......初到营地的第一件事~组建团队~首先让大家见识一下我们的团队我们的团队由&a…

Linux下DB2数据库安装教程

最近因为工作需要在学习DB2数据库,本教程讲解DB2数据库在inux下的安装步骤。 安装前请查看 DB2版本和许可证 说明来增加了解,先弄明白改安装什么版本,这里我用的是最新的Express-C版本,这个版本是提供给个人学习用的版本。 管理客…

Ubuntu 13.04 安装 OpenCV 及试用

2019独角兽企业重金招聘Python工程师标准>>> 暑假来了,项目需要,得学习一下 OpenCV。 首先,是安装问题。我是参照这个网址安装的:http://karytech.blogspot.com/2012/05/opencv-24-on-ubuntu-1204.html(在…

Python3 调试技巧 —— 死循环

说下Python3不使用gdb的自身调试 前情提要:服务器莫名卡死,用网上的方法用gdb,下载了很多组件,包括那个libpython.py,都没什么用,看不到堆栈,也试了保存core文件等等 大事找官方:官方…

读书:历史 -- 奥斯曼帝国六百年

作者:帕特里克贝尔福 ,英国历史学家、作家、记者。 本书为作者写作生涯的集大成之作,也是最终之作 一部奥斯曼帝国通史: 伊斯兰教大帝国的兴起、转折、衰败和灭亡 奥斯曼帝国的发家史和我们的大清帝国十分相似,两者都…

单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器

http://www.amobbs.com/thread-4503884-1-1.html 这个小玩意,采用 ATMEL 的传统51MCU作主控制芯片,加上SD卡和显示屏,就可以作简单的音乐播放器了,虽然音质不怎么样,不过作为DIY还是蛮有乐趣,希望大家喜欢。…

不带头节点的链表有哪些缺点_23张图!万字详解「链表」,从小白到大佬!

链表和数组是数据类型中两个重要又常用的基础数据类型。数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解决和平衡此问题于是就有了链表…

劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(一)

《写给大家看的C语言书(第2版)》是邮电社图灵公司引进翻译的一本C语言入门书,这是一本垃圾书。搞不清图灵为什么引进了这样一本垃圾书。该书作者基本不懂得C编程技术,书中误导、错谬比比皆是。  该书的附录B给出了一个21点游戏的代码,这是一…

【数学 技巧】2.14计数

有趣的组合数学题;考试时候打满确实挺不容易的…… 题目描述 对于一个 $n$ 阶排列 $p$,我们建立一张无向简单图 $G(p)$,有 $n$ 个节点,标号从 $1$ 到 $n$,每个点向左右两侧最近的比它大的点以及比它小的点连边。 形式化…

冒泡排序 算法

算法思路&#xff1a; 从第一个元素开始遍历&#xff0c;比较当前元素和下一个元素的大小不符合&#xff0c;则交换结束最后一个元素&#xff0c;则重新遍历 实现&#xff1a; void bubble_sort(vector<int> &arr) {for (int i 0;i < arr.size() - 1; i) {//交…

5单个编译总会编译全部_5分钟读懂JavaScript预编译

大家都知道JavaScript是解释型语言&#xff0c;既然是解释型语言&#xff0c;就是编译一行&#xff0c;执行一行&#xff0c;那又何来预编译一说呢?脚本执行js引擎都做了什么呢&#xff1f;今天我们就来看看吧。1-JavaScript运行三部曲语法分析预编译解释执行语法分析很简单&a…

2014百度面试题目---“求比指定整数大且最小的不重复数”解答

题目&#xff1a;给定任意一个正整数&#xff0c;求比这个数大且最小的“不重复数”&#xff0c;“不重复数”的含义是相邻两位不相同&#xff0c;例如1101是重复数&#xff0c;而1201是不重复数。 代码&#xff1a; #include <iostream> using namespace std;bool istha…

3DMAX 批量 场景 对象 导出 .X格式 脚本

一、首先你需要下载一个 Total Commader文件管理软件。利用这个软件你可以收集文件夹下包含子文件夹下的max文件&#xff08;或完整路径&#xff09;打开TotalCMD后使用查找文件&#xff1a;&#xff08;如图红框中的操作&#xff09;1.2.3. 复制文件名和完整路径后粘贴到文本文…

C++复数类面向对象的参考

#include <bits/stdc.h> #include <future> #include <thread>using namespace std;class Complex { public:Complex (double r 0, double i 0): re (r), im (i) {} ///冒号后面是初始化的过程&#xff0c;注意分清初始化和赋值的区别Comp…

快速排序 算法

算法思路 序列终任意选择一个数&#xff0c;把序列分为比这个数大和比这个数小的两个子序列不断重复以上步骤(递归) 代码实现 int partition1(vector<int> &arr, int begin , int end) {int ret arr[begin];int index begin 1;for (int i index;i < end; i…

利用Spring AOP与JAVA注解为系统增加日志功能

Spring AOP一直是Spring的一个比较有特色的功能&#xff0c;利用它可以在现有的代码的任何地方&#xff0c;嵌入我们所想的逻辑功能&#xff0c;并且不需要改变我们现有的代码结构。 鉴于此&#xff0c;现在的系统已经完成了所有的功能的开发&#xff0c;我们需要把系统的操作日…

maven引入hadoop_如何添加Hadoop依赖通过Maven

匿名用户1级2017-09-09 回答Hadoop开发中需要用到至少不下10个的依赖包&#xff0c;它们相互间的依赖关系比较复杂&#xff0c;不同版本的依赖关系也有所不同&#xff0c;而间接依赖导致的程序错误并不会在运行之前报错&#xff0c;因此确定适合一个版本的依赖包&#xff0c;会…

js 闭包作用

2019独角兽企业重金招聘Python工程师标准>>> 一、变量的作用域 要理解闭包&#xff0c;首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种&#xff1a;全局变量和局部变量。 Javascript语言的特殊之处&#xff0c;就在于函数内部可以直接读取全…

vue实用组件——页面公共头部

可伸缩自适应的页面头部&#xff0c;屏幕适应范围更广泛 效果如下&#xff1a; 代码如下&#xff1a; <template> <div class"site-header"> <div class"logo"><img src"/assets/icons/logo.png" alt"">&…

插入排序 算法

算法思路 维护一段有序数列同时遍历待排序数列&#xff0c;在有序数列中找到合适的位置插入元素 基本代码 实现如下: void insertion(vector<int>& arr){for(int i1;i<arr.size();i){int tempi;for(int ji-1;j>0;j--){//有序序列不断得增加if(arr[temp]<…