精华内容
下载资源
问答
  • 固定分区存储管理(C语言)
    千次阅读
    2022-04-27 13:45:36

    固定分区存储管理(C语言)

    课程

    操作系统

    实验名称

    固定分区存储管理

    实验要求

    1、 实现固定分区存储管理方式下存储空间的分配和回收。
    2、 已知当前内存分配表如下

    分区号起始地址长度状态
    110KB30KBJob5
    240KB7KB0
    347KB50KBJob2

    3、 有若干个作业申请或释放内存空间,请求如下:
    (1) 作业Job6请求资源,申请20KB大小的内存空间;
    (2) 作业Job7请求资源,申请5KB大小的内存空间;
    (3) 作业Job2执行完毕,释放空间。
    4、编写程序实现相应存储空间的分配和回收,若请求成功,修改主分配表,并输出该表,若请求不能满足,输出“分配失败”。

    实验目的

    通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中固定分区管理方式、主存分配表等相应知识的理解。

    源代码

    #include "stdio.h"
    int begin[]={10,40,47};	//起始地址 
    int len[]={30,7,50};	//长度 
    int t[]={5,0,2};	//状态 
    int n,m,k; // 进程号、完成进程号、申请的资源空间大小 
    char s; //用于接受判断是否继续时输入的字符变量 
    
    //申请资源 
    void p()
    {
    	int flag=0;	//标记1 
    	int flag2=0;	//标记2 
    	while(flag==0) 
    	{ 
    		int sum=0;	//累加器 
    		for(int i=0;i<3;i++)
    		{
    			if(t[i]!=0)		
    				sum=sum+1;
    		} 
    		if(sum==3)	//空间满了,跳出循环,进入释放 
    		{
    			printf("已经满了!不能再添加进程了!\n");
    			break;
    		} 
    		printf("请输入需要申请资源的进程号:"); 
    		scanf("%d",&n);
    		while(flag2==0) 
    		{
    			for(int i=0;i<3;i++)
    			{
    				if(n==t[i])		//判断进程是否存在 
    				{
    					printf("该进程已存在!\n");
    					printf("请重新输入需要申请资源的进程号:"); 
    					scanf("%d",&n);
    				}	
    			}
    		}
    		printf("请输入需要申请资源的内存空间:"); 
    		scanf("%d",&k);
    		for(int i=0;i<3;i++)
    		{
    			if(t[i]==0)	//状态为0 
    			{
    				if(k<=len[i])	//申请的资源小于等于分配的空间大小 
    		 		{
    				 	t[i]=n; 
    		 			printf("申请成功!\n");
       					//申请成功打印新的分配表 
       					printf("分区号  起始地址   	长度  	状态\n");
       					for(int i=0;i<3;i++)
       					{
           					printf("%d KB	   %d KB	%d KB	%d \n",i+1,begin[i],len[i],t[i]);
       					}
    		 		} 
    		 		else	//申请的资源大于分配的空间大小
    				{
    					printf("分配失败!\n");  
    				}
    			} 
    			 
    		}
    		printf("是否继续申请资源(y/n):"); 
    		scanf("%s",&s);
    		if(s=='n')flag=1;
    	} 	 
    }
     
    //释放 
    void v()
    {
    	int flag=0;
    	while(flag==0)
    	{
    		printf("请输入需要执行完成的进程号:"); 
    		scanf("%d",&m);
    		for(int i=0;i<3;i++)
    		{
    			if(m==t[i])
    			{
    				t[i]=0; 
    				//释放成功打印新的分配表 
    				printf("释放成功!\n");
    				printf("分区号  起始地址   	长度  	状态\n");
    				for(int i=0;i<3;i++)
    				{
    					printf("%d KB	   %d KB	%d KB	%d \n",i+1,begin[i],len[i],t[i]);
    		   		}
    		   		printf("是否继续需要执行完成的进程号(y/n):"); 
    				scanf("%s",&s);
    				if(s=='n')flag=1;	
    			}
    			else
    			{
    				printf("请重新输入需要执行完成的进程号:");
    				break;
    			}
    		}
    	}
    } 
    

    主程序(test01):

    int main()
    {
    	//分配表 
    	printf("已知当前内存分配表如下\n");
    	printf("分区号  起始地址   	长度  	状态\n");
    	for(int i=0;i<3;i++)
       	{
           	printf("  %d	  %d KB		%d KB	  %d \n",i+1,begin[i],len[i],t[i]);
       	}	 
    	p(); 
    	v(); 
    }
    

    流程图

    整体模型图
    在这里插入图片描述

    P()模块流程图:
    在这里插入图片描述

    V()模块流程图
    在这里插入图片描述

    实验结果

    在这里插入图片描述

    实验总结

    通过此次实验,加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解,对操作系统怎么实现存储管理有了初步的认识,固定分区的优势是实现简单,只需要极少的操作系统开销,它也有很多的缺点,例如:有部分碎片,对内存的使用不充分。活动进程的最大数目也是固定的。

    教师评语

    更多相关内容
  • 存储管理功能

    万次阅读 2017-05-29 08:57:02
    存储管理功能 存储分配 存储共享 存储保护 存储扩充 地址映射 内存资源管理 内存分区 内存分配 静态等长分区的分配 动态异长分区的去配 紧凑 小结 存储管理功能 ...

    我是一个有强迫症的人,什么文件都要归类,电脑桌面干干净净的放着几个必要的文件夹,所有的文件对应有不同的文件夹存放,如果看到某个文件(只要不是临时存放的)出现在桌面上,就感觉非常刺眼。
    我就是这么管理电脑文件的,感觉…….没救了。

    存储管理的功能


    存储管理可不仅是对外部存储资源(如磁盘文件)进行的管理,也包括了对内存的管理。内外存的资源管理技术可以相同,也可以不同,但一般情况下,都采用相同的管理技术。

    存储管理主要是完成如下功能:存储分配存储共享存储保护存储扩充地址映射

    存储分配

    我们知道,当一个作业进入内存时,操作系统会将其转变为进程,同时为其分配存储空间以供运行,而进程运行结束时,操作系统将进程所占有的存储空间回收。

    一般的存储分配

    如果操作系统带有虚拟存储管理功能,那么进程运行过程中一部分存在于内存,另一部分存在于外存。如果外存部分进入内存,则撤销外存空间,分配内存空间,反之,操作相反。

    带虚拟存储管理的内存分配

    仅仅知道要这样分配还不够,操作系统得记录这些情况——内存与外存资源的使用情况,为此,操作系统设置了两个表用于记录这些信息:
    1. 分配表:记录已经分配的区域。
    2. 空闲表:记录未分配区域。

    存储共享

    多个进程共用内存中的相同区域。

    经常去吃烧烤的小摊儿上就一个老板在忙活,不管谁的串都是老板烤的,但如果老板雇佣很多人,然后不同客人的串分给不同的人去烤,那老板多轻松啊(但这赚的估计还不够老板发工资)。
    据说高档餐厅会为每个桌配一名侍者,不过我没去过就是了……

    我们之所以要进行存储共享,其一便是为了节约内存空间,不然多个进程同时需要使用一个程序资源时,还要为每个进程创建一个程序资源的副本,那内存就算再大也不够用啊(就像那个烧烤摊儿老板,赚的还不够给工人发的工资)。
    另一方面,使用存储共享也是为了方便进程通信,我们知道PV操作就需要公共的内存空间才能够实现。

    一般情况下我们需要共享的是代码和数据,共享代码是为了节约内存空间,而数据则是对应的方便进程通信(也能节约内存空间)。

    存储保护

    存储共享中我们提到了PV操作,那PV操作是为了限制多个进程出现同时进入临界区的情况所提出来的,也算是一种对共享变量的一种保护,不过在存储保护中这种保护则更甚一筹,即对于多个进程共享的存储区域的保护。
    存储保护主要包括以下两个方面:
    1. 防止地址越界
    这个比较容易理解,因为在我们写程序的时候也要注意的,一旦地址越界编译就会出错,无法通过,不过此时还能在编译失败时纠正。
    而在操作系统中,每个进程具有相对独立的进程空间,一旦其中一个进程运行时产生的地址出现在其自身的进程空间之外,此时发生了地址越界,如果侵犯了其他进程空间,就会影响其他进程的正常执行,假如侵犯的进程空间属于操作系统,就可能导致系统崩溃。
    2. 防止操作越权
    对于多个进程共享的存储空间,每个进程有自己的访问权限,如读,写,执行。如果该进程访问共享区域时违反了权限规定,就说这个进程发生了操作越权。
    一般我们选用硬件来提供存储保护,软件作为辅助。

    我们用Windows的时候,如果在系统盘里删一些东西,会有提示说需要提供权限,这就是说当前登录用户权限不够,不能做这种操作。

    存储扩充

    我们知道,cache是高速缓冲,读写速度仅次于寄存器,但是耐不住人家尊贵,如果直接使用cache作为存储器的话,我只能说:“土豪,交个朋友吧!”。
    当然了,这只是玩笑话,cache很贵,其次是内存很贵,再然后咱么所说的机械硬盘就是大街货了,便宜,容量都是以TB做单位的。
    所以为了省钱,也为了性价比,我们就提出了三级缓存,将cache,内存,还有外存有机的结合,形成一个容量大速度快的虚拟存储系统。

    三级缓存都是比较新的技术了,很多年前,还没有cache这个东西,只有内存和外存之说。

    三级缓存

    地址映射

    逻辑地址转换成物理地址的过程。
    完成地址映射的硬件机构称为存储管理部件(MMU)

    地址映射

    逻辑地址是相对的,因此可以被映射到物理地址的不同的位置,物理地址则是绝对的,一旦产生,便固定了,这对于程序的结构化和分层设计带来不便。
    之所以会使用逻辑地址,也是为了程序移植方便。

    内存资源管理


    内存分区

    对内存分区,可以是静态,可以是动态的,分区的大小可以是等长,也可以是异常的。
    所谓静态分区,则是在系统运行之前就将内存划分为若干区域,后期可以直接分配。

    但是,由于分配时只能对已划分好的分区进行选择,故很难出现正好合适的区域。

    动态分区与之对应,是在系统运行的过程中划分内存空间

    通常,按照进程所需存储空间的大小为其分配一个或多个区域。

    等长和异长听名字就知道了,就不废话了。
    一般情况下,我们都是使用静态等长动态异长的组合方式。

    内存分配

    静态等长分区的分配

    通常用于页式和段页式的存储管理方式,被静态的划分为等长区域,每个区域大小为2^iB,称之为页面
    分配与去配的表示方法:

    1. 位示图
      用1位(1bit)来表示一个页面状态,1表示被占用,0表示空闲。假设某个存储空间内忧n个页面:
      位示图

    2. 空闲页面表
      若干个连续的空闲页面作为一组登记在空闲页面表中,该表包含首页面号页面个数。这种分配方法能使一个进程的若干页面连续。
      空闲页面表

      页面首号是指一块连续空闲区的第一块空闲页面号,页面个数则是这块连续空闲区的页面总数。

    3. 空闲页面链
      所有的空闲页面连接成一个链表,分配时取链表头页面,去配(撤销)时将释放的页面连接到链表头。
      空闲页面链

      这种方法适用于内存页面的分配,对于外存,由于需要数据的传输,故而速度慢,不采用。

    动态异长分区的去配

    此种分区常用语界地址和段式存储管理方式。
    存储空间被划分为若干不等长区域,对此的管理采用空闲区域表,该表中记录所有当前未被进程占用的空闲区域。
    空闲区域表

    与空闲区域表相关的算法:

    1. 最先适应算法(First Fit)
      核心思想:对于存储申请命令,选取空闲区域表中满足申请长度,且起始地址最小的空闲区域。
      实现:空闲区域表中的首址按从大到小的次序依次被记录了,当进程申请存储空间时,系统从该表的头部开始查找,取满足要求的第一个表目项,对比长度,若空闲区域大于进程申请空间,进行分割,然后将与申请空间大小相同的空闲区分配给进程,将剩余部分保留在空闲区域表中(需要改变首址)。

      该算法尽可能的使用低地址,造成高地址空间形成较大空闲区,算是一个优点,但是对空闲区的分割又是一个缺点(假设某个空闲区本来刚好可以满足P1的空间申请,但是P2先提出了空间申请,致使空闲区被分割,如此P1的申请将无法被满足)。

    2. 下次适应算法(Next Fit)
      核心思想:从上一次分配空闲区域的下一个位置开始,选取第一个可满足的空闲区域。
      实现:用一个指针记录每次分配结束后的下一个位置。

      此算法不需要像FF算法一样,每次分配都要进行一次查询,减小了时间开销,使空闲区域分布的较为均匀,但依旧没有解决FF算法的缺点。

    3. 最佳适应算法(Best Fit)
      核心思想:分配时寻找满足空间申请并且长度是最小的空闲区域,这样就克服了FF算法的缺点。
      实现:空闲区域按地址由小到大的记录,然后从表头开始查找,过程与FF算法类似,只是多出了一项长度的比较。

      可以预见,BF算法克服了FF算法的缺点,不去分割大的空闲区,但是又可能会形成很小的无法使用的空闲区——碎片。

    4. 最坏适应算法(Worst Fit)
      核心思想:分配时取满足空间申请,并且长度最大的空闲区域。
      实现:按照空闲区域长度由大到小依次记录于空闲区域表中,进程申请空间时,取第一个满足要求的表目项。

      克服了BF的缺点,却保留了FF算法的缺点。

    一说到算法,马上就感觉高大上起来,但实际上…….
    FF算法,NF算法以及WF算法就是图个简单,实现起来省时省力又省心。只有BF算法比较麻烦些。

    我们研究算法的时候,是为了解决一个个的实际问题,总是需要先提出一个最简单的算法,然后发现算法的缺点,针对这个缺点进行算法的进一步改进,不断的重复这一个过程。
    要知道,没有一个粗胚,怎么能够雕刻出一件完美的作品呢?

    紧凑

    这是为了解决碎片问题而提出来的。
    这个方法就是想移动所有的已占有区域,然后将所有的空闲区域连成一块完整的空闲区。

    虽然只有简简单单的一句话,但是我们可以发现,想要实现这个方法,系统的开销非常大,所以尽量避免使用紧凑技术。
    那么,什么时候使用呢?
    只有在一个新的进程申请空间时,所有分散的的空闲区域都不能满足,但是其总和可以满足这个申请时使用杂凑技术。

    小结


    一个适合的存储管理方式,会大大增强系统的易用性。

    所以……我该怎么收尾呢?

    展开全文
  • 存储管理-分区存储管理

    千次阅读 2019-11-21 10:08:00
    存储管理-分区存储管理 分区管理把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理是满足多道程序设计的一种最简单的存储管理方法。 固定分区法 固定分区...

    存储管理-分区存储管理

    分区管理把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理是满足多道程序设计的一种最简单的存储管理方法。

    固定分区法

    固定分区法把内存区固定地划分为若干个大小不等的区域

    划分原则

    分区划分的原则由系统操作员或操作系统决定。例如可划分为长作业分区和短作业分区

    特点

    分区一旦划分结束,在整个执行过程中每个分区的长度和内存的总分区个数保持不变

    管理和控制

    使用数据结构:分区说明表

    分区说明表包括:分区说明表说明各分区号、分区大小、起始地址和是否是空闲区(分区状态)

    分区说明表功能:内存的分配释放、存储保护以及地址变换等都通过分区说明表进行。

    例子:下图中,操作系统占用低地址部分的20K,其余空间被划分为4个分区,其中1,2,3号分区已分配,4号分区未分配。
    1734701-20191121092748982-1252964356.png

    分区的分配和回收

    1.当用户程序要装入执行时,通过请求表提出内存分配要求和所要求的内存空间大小
    2.存储管理程序根据请求表查询分区说明表,从中找出一个满足要求的空闲分区,并将其分配给申请者
    3.当进程执行完毕,不再需要内存资源时,管理程序将对应的分区状态置为“未分配” 即可。

    1734701-20191121094326111-429162175.png

    动态分区法

    与固定分区法相比,动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的,且其大小可随作业或进程对内存的要求而改变

    相比固定分区法的改进

    改变了固定分区法中那种即使是小作业也要占据大分区的浪费现象,从而提高了内存的利用率。

    特点

    采用动态分区法,在系统初启时,除了操作系统中常驻内存部分之外,只有一个空闲分区,随后,分配程序将该区依次划分给调度选中的作业或进程。
    FIFO调度方式时的内存初始分配情况:

    1734701-20191121093007644-350899572.png

    内存的分配和释放

    随着进程的执行,会出现一系列的内存分配和内存释放。

    分配:某一时刻,进程C执行结束并释放内存之后,管理程序为另两个进程E(需内存50K)和F(需内存16K)分配内存。

    释放:如果内存被释放,那么该块内存变为空闲区

    空闲区合并:如果被回收分区有邻接的空闲分区,则进行合并。

    1734701-20191121093345326-579125164.png

    与内存管理相关的数据结构

    1.分区说明表

    2.自由链:动态分区法还把内存中的可用分区单独构成可用分区表或可用分区自由链,以描述系统的内存资源.
    自由链利用每个内存空闲区的头几个单元存放本空闲区的大小及下个空闲区的起始地址,所有的空闲区链接起来。
    系统设置自由链首指针让其指向第一个空闲区,由此管理程序可通过链首指针查到所有的空闲区。
    特点:采用自由链法管理空闲区,查找比可用表困难,但自由链指针利用闲区自身的单元不占用额外的内存区
    1734701-20191121093508141-427569344.png

    3.请求表:请求内存资源的作业或进程也构成一个内存资源请求表。请求表的每个表目描述请求内存资源的作业或进程号以及所请求的内存大小。
    1734701-20191121093616729-563572922.png

    4.可用表:可用表的每个表目记录一个空闲区,主要参数包括区号、长度和起始地址。采用表格结构,管理过程比较简单,但表的大小难以确定,可用表要占用一部分内存。
    1734701-20191121093737787-571107612.png

    动态分区时的分配与回收

    1.根据请求表中要求的内存长度,从可用表或自由链中找出合适的空闲区分配给进程。
    2.分配空闲区之后,更新可用表或自由链。
    3.进程或作业释放内存资源时,新的空闲区和已有的相邻空闲区进行链接合并,更新可用表或自由链

    最先适应法

    1.要求可用表或自由链按起始地址递增的次序排列。
    2.一旦找到大于或等于所要求内存长度的分区,结束搜索。
    3.然后,从找到的分区中划出所要求的内存长度分配给用户,并把余下的部分进行合并(如果有相邻空闲区存在)后留在可用表中,同时修改相应的表项。

    特点:

    • 搜索速度最佳
    • 回收算法最佳

    最佳适用法

    1.要求按从小到大的次序组成空闲区可用表或自由链。
    2.当用户作业或进程申请一个空闲区时,存储管理程序从表头开始查找,当找到第一个满足要求的空闲区时,停止查找。
    3.如果该空闲区大于请求表中的请求长度,则与最先适应法时相同,将减去请求长度后的剩余空闲区部分留在可用表中。

    特点:

    • 找到空间最佳

    最坏适用法

    1.要求空闲区按其大小递减的顺序组成空闲区可用表或自由链。
    2.当用户作业或进程申请一个空闲区时,先检查空闲区可用表或自由链的第一个空闲可用区的大小是否大于或等于所要求的内存长度。
    3.若可用表或自由链的第一个项长度小于所要求的,则分配失败,否则从空闲区可用表或自由链中分配相应的存储空间给用户,然后修改和调整空闲区可用表或自由链。

    特点:

    • 不留下碎片空闲区这一出发点

    动态分区时的回收与拼接

    回收:当用户作业或进程执行结束时,存储管理程序收回已使用完毕的空闲区,并将其插入空闲区可用表或自由链。
    拼接:将回收的空闲区插入可用表或自由链时,和分配空闲区时样,也要碰到剩余空闲区拼接问题,即把不连续的零散空闲区集中起来。

    回收拼接的四种情况

    1734701-20191121095903873-755978264.png

    将一个新可用区插入可用表或队列时,该空闲区和上下相邻区的关系是下述4种关系之一:该空闲区的上下两相邻分区都是空闲区;该空闲区的上相邻区是空闲区;该空闲区的下相邻区是空闲区;两相邻区都不是空闲区。

    四种回收策略

    1.如果释放区与上下两空闲区相邻,则将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。

    2.如果释放区只与上空闲区相邻,则将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的可用表的表目项或自由链指针。

    3.如果释放区与下空闲区相邻,则将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。合并区的长度为释放区与下空闲区之和。同理,合并后修改可用表或自由链中相应的表目项或链指针。

    4.如果释放区不与任何空闲区相邻,则释放区作为一个新可用区插入可用表或自由链。

    有关分区管理其他问题的讨论

    虚拟存储器实现

    1.利用分区式管理,允许每个用户拥有可以自由编程的虚拟空间。
    2.但分区式管理方式无法实现用户进程所需内存容量只受内存和外存容量之和限制的虚拟存储器。
    3.如果不采用内存扩充技术,每个用户进程的内存容量受到分区大小限制。
    4.分区式管理通常使用覆盖或交换技术扩充内存。

    关于地址变换和内存保护

    1.静态地址重定位方法不可用于动态分区时的地址变换
    2.动态地址重定位时,每个分区需要一对硬件寄存器的支持,即基址寄存器和限长寄存器,分别用来存放作业或进程在内存分区的起始地址和长度。
    3.基址寄存器和限长寄存器除了完成动态地址重定位的功能之外,还具有保护内存中数据和程序的功能
    4.保护键法也可以用来提供内存分区

    分区存储管理的主要优缺点

    优点:
    1.实现了多个作业或进程对内存的共享,有助于多道程序设计,从而提高系统的资源利用率
    2.该方法要求的硬件支持少,管理算法简单,因而实现容易

    缺点:
    1.内存利用率仍然不高
    2.存在严重的碎小空闲区(碎片)不能利用的问题,这更进一步影响了内存的利用率
    3.作业或进程的大小受分区大小控制,除非配合采用覆盖和交换技术。
    4.无法实现各分区间的信息共享。

    展开全文
  • 通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。 二、实验内容 1、实现固定分区存储管理方式下存储空间的分配和去配。 2、已知当前内存分配表...
  • 虚拟存储管理

    千次阅读 多人点赞 2018-07-08 00:29:58
    必要性:前面的各种存储管理方式必须一次性全部装入内存才可以运行,直至作业运行结束才能释放全部内存资源,所以存在: (1)内存不满足作业地址空间要求时就不能运行 (2)大量作业要求运行时只有少数作业装入...

    必要性:前面的各种存储管理方式必须一次性全部装入内存才可以运行,直至作业运行结束才能释放全部内存资源,所以存在:
    (1)内存不满足作业地址空间要求时就不能运行
    (2)大量作业要求运行时只有少数作业装入内存运行,其他作业留在辅存等待

    程序执行呈现局部性特征,程序的执行局限于某个部分

    {访访 局 限 性 { 时 间 局 限 性 { 某 条 指 令 被 执 行 , 不 久 之 后 指 令 可 能 再 次 执 行 某 条 数 据 被 访 问 , 不 久 之 后 数 据 可 能 再 次 空 间 局 限 性 : 程 序 一 段 时 间 内 访 问 的 地 址 可 能 集 中 在 一 定 范 围

    根据局部性原理可以把作业信息保存在磁盘上,当作业请求装入时,将当前运行所需要的一部分信息装入主存,作业执行过程时,如果需要的信息调入主存则继续执行;如果此时内存已满,无法将需要的信息加入,则将内存中暂时不用的信息置换到磁盘,腾出空间使需要的信息调入内存使程序继续执行。

    虚拟存储器/虚拟内存
    虚拟存储器的容量由计算机的地址结构辅助存储器的容量决定。建立在离散分配的存储管理方式的基础上,它允许将一个作业分多次调入内存。

    四大特征
    离散性(基础)
    按照页或段进行离散化放置(物理空间可以不连续),以段或者页为单位进行换出换入
    分段或分页内存管理方式是虚拟存储器产生的基础
    多次性(最重要特征)
    一个作业被分成多次调入内存运行,只需要将当前运行的那部分程序或数据装入内存即可
    对换性/对唤性
    允许作业的运行过程中进行换进和换出,【交换分区:在作业对应的进程运行期间,允许将那些暂时不使用的程序和数据,从内存换出至外存的对换区】,可以有效提高内存的利用率
    虚拟性(最重要特征)
    逻辑上扩充内存容量,是以多次性和对换性为基础。
    多次性和对换性又必须建立在离散分配的基础上

    虚拟内存存储管理


    请求分页式存储管理

    { 虚 拟 分 页 式 存 储 管 理 ( 调 入 方 式 不 同 ) { 请 求 分 页 式 管 理 预 调 入 页 式 管 理

    请求分页式管理
    主要功能:当需要执行某条指令而发现它不在内存时或当某条指令需要访问其他的数据或指令时,这些指令和数据不在内存,从而发生缺页中断,于是系统将外存中相应的页面调入内存
    优点:按需访问,只有被访问的页面的才会进入内存,节省了内存空间
    缺点:处理缺页中断次数过多和调页的系统开销较大,由于每次仅调入一页,增加了磁盘I/O次数
    预调入页式管理
    根据某种算法动态预测进程最可能访问哪些页面,在使用前预先调入内存,尽量做到进程在访问页面之前已经预先调入该页,而且每次可以调入多个页面,以减小磁盘的I/O次数
    缺点:若预先调入的页面在实际情况下较少得到访问,则效率较低

    Δ Δ 请求分页式存储管理是在页式存储管理的基础上,增加了请求分页功能和页面置换功能实现的虚拟存储系统
    Δ Δ 主要思想:请求分页式存储管理允许作业只装入部分页面就可以启动运行。
    在执行过程中,如果所要访问的页已调入内存,则进行地址转换,得到欲访问的内存物理地址,如果不在内存中,则产生一个“缺页中断”;
    如果此时内存能容纳新页,则启动磁盘I/O将其调入内存,如果内存已满,则通过页面置换功能将当前所需的页面调入。

    需 要 的 支 持 { 请 求 分 页 的 页 表 机 制 缺 页 中 断 机 构 地 址 变 换 机 构 页 面 置 换 算 法

    1.请求分页的页表机制
    页表格式

    物理块号:指出该页在主存中的占用块(1表示访问)
    状态位:指出该页是否已经调入主存(1表示调入)
    访问字段:记录该页一段时间内被访问的次数或多久未被访问
    修改位:表示该页调入主存后是否被修改
    辅存地址:该页在磁盘上的地址

    由于作业在磁盘上保留一份备份,若此次调入主存中后未被修改置换该页时不需要再将该页写回磁盘,减少系统开销;如果该页被修改,必须将该页写回磁盘上,保证信息的更新和完整。

    2.缺页中断机构
    缺页中断处理流程
    缺页中断与一般中断的区别:
    (1)一般中断是在指令结束后接受中断请求并响应;缺页中断是在指令执行期间所要访问的指令或数据不在内存时产生和处理的
    (2)一条指令在执行期间可能产生多次缺页中断

    3.地址变换机构
    地址变换过程

    查快表 找到:状态位为1则地址转换,状态位为0则缺页中断 调入主存,填上块号,修改状态位、修改位,形成物理地址:::::快表中找不到:主存中查找页表,若未调入主存则调入主存写入快表

    4.页面置换策略

    (1)

    页 面 置 换 策 略 { 固 定 分 配 局 部 置 换 策 略 可 变 分 配 局 部 置 换 策 略 可 变 分 配 全 局 置 换 策 略

    1.固定分配局部置换
    固定分配:为每一个进程分配一定数目的主存物理块,在整个运行期间不在改变

    { 平 均 分 配 算 法 ( 物 理 块 平 均 分 配 给 每 一 个 进 程 ) 按 比 例 分 配 算 法 ( 按 进 程 大 小 按 比 例 分 配 ) 考 虑 优 先 权 的 分 配 算 法 ( 一 部 分 按 比 例 分 配 , 一 部 分 根 据 进 程 的 优 先 权 分 配 )

    缺点:难以为进程分配准确的内存数量。若太少,会频繁出现缺页中断,影响进程性能;若太多,会使内存驻留的进程数据减少,造成内存利用率下降
    2.可变分配局部置换
    主要思想:先分配一定数目的内存物理块,运行过程中频繁缺页中断就分配若干附加的物理块,缺页中断次数过少则缩小为该进程分配的物理块,控制缺页中断次数在一个合理的范围
    3.可变分配全局置换
    主要思想:为每一进程分配一定数目的物理块,保持一个空闲块队列,发生缺页中断则从该队列中取出一块,用完该队列中的物理块采用内存中选择页面进行置换(可能是系统中任一进程的页)

    5.页面置换算法
    抖动现象(颠簸):调入调出反复,使得调度非常频繁,以至于大部分时间都花费在来回调度上

    (1)OPT最佳置换算法(理想化,无法实现)
    Δ Δ 主要思想:淘汰的页面是以后永远不再使用或者是将来最长时间内不再被访问的页面

    最少次缺页中断次数
    最佳置换算法置换图
    20次总访存次数,9次缺页中断,缺页中断率45%
    置换掉那个下一次访问时间最久的页面
    开始7,0,1装入主存三次缺页中断;(701)
    到2时将7出去,因为需要7的在最后面调入2(201)
    到0的时候不需要缺页中断(201)
    到3时将1出去,因为需要1的排在20后面(203)

    (2)FIFO先进先出置换算法
    Δ Δ 主要思想:先淘汰最近进入内存的页面(认为刚被调入的页面在最近的将来被访问的可能很大),淘汰在内存中驻留时间最长的页面

    先进先出置换算法置换图
    20次总访存次数,15次缺页中断,缺页中断率75%
    置换掉最先进入的那个页面

    Belady现象:在未给作业分配足够要求的页面数时,分配的物理块数增多,缺页中断次数反而增加
    产生原因:没有考虑程序执行的动态特征

    Belady现象
    M=3时,缺页中断次数为9;
    M=4时,缺页中断次数为10
    具有Belady现象的例子

    (3)LRU最近最少用置换算法(基于局部性原理)
    Δ Δ 主要思想:将最近一段时间内最长时间没有被访问过的页面调出,认为刚被访问的页面最近的将来还会经常访问他们;
    在页表增加一个引用位,在每次被访问后将引用位‘置零’,重新计时;
    在发生缺页中断需要调入新的页面时,通过检查页表中各页的引用位,选择计时最长时间没有被访问过的页面淘汰,并且把内存中所有页面的引用位全部清零,重新计时

    最近最少用置换算法
    20次总访存次数,12次缺页中断,缺页中断率60%
    置换掉那个最长时间没被访问的页面

    (4)CLOCK时钟置换算法(LRU近似算法)
    Δ Δ 主要思想:
    当该页被访问时,由硬件将它的引用位信息置为1;
    操作系统选择一个时间周期T,每隔一个周期T,将页表中所有页面的引用位信息置 0;
    这样,在时间周期T内,被访问过的页面的引用位为 1,而没有被访问过的页面的引用位仍为0;
    当产生缺页中断时,可以从引用位为0的页面中选择一页调出,同时将所有页面的引用位信息全部重置0

    Δ Δ 关键:
    周期T的确定:T 太大,可能所有的引用位都变成1,找不出最近最少使用的页面淘汰;T太小,引用位为0的页面可能很多,而无法保证所选择的页面是最近最少使用的

    淘汰一个页面时,如果该页面已被修改过,必须将它重新写回磁盘;但如果淘汰的是未被修改过的页面,就不需要写盘操作了,这样看来淘汰修改过的页面比淘汰未被修改过的页面开销要大
    (1)最近没有被引用,没有被修改(r=0,m=0)
    (2)最近被引用,没有被修改(r=1,m=0)
    (3)最近没有被引用,但被修改(r=0,m=1)
    (4)最近被引用过,也被修改过(r=1,m=1)

    (5)LFU最近最不常用置换算法
    Δ Δ 主要思想:
    选择被访问次数最少的页面调出,即认为在过去的一段时间里被访问次数多的页面可能经常需要访问
    Δ Δ 关键:
    周期T的确定:为每一页设置一个计数器,页面每次被访问后其对应的计数器加1,每隔一定的时间周期T,将所有计数器全部清零

    6.缺页中断率分析
    缺页中断处理需要系统的额外开销,影响系统效率,因此应尽可能减少缺页中断的次数,降低缺页中断率

    =FAFA访 缺 页 中 断 率 = F A ( F 次 缺 页 中 断 , A 次 访 问 页 面 )

    (1)缺页中断率与缺页中断次数有关
    $$
    影响缺页中断率的因素
    \begin{cases}
    分配给作业的主存块数\给

    页面大小\
    程序编制方法\
    页面调度算法
    \end{cases}$$

    分配给作业的主存块数
    CPU利用率与进程数关系
    CPU利用率与进程数关系
    随着主存中进程数的增加,频繁的页面换入换出,磁盘I/O占据了主要时间,拉低了CPU利用率

    程 序 的 工 作 集

    程序的工作集:给定的访问序列,选取定长的时间间隔 Δ Δ ,落在工作集窗口中的页面集合,也就是某段时间间隔内进程实际要访问的页面的集合
    内存容量和缺页中断次数之间的关系
    工作集过大:降低缺页中断率不明显,浪费内存
    工作集过小:频繁缺页,降低系统效率
    程序运行时,对页面的访问是不均匀的,即在某段时间内访问仅限于较少的若干页面
    OPT页面算法:预知程序在某段时间间隔内要访问哪些页面预先调入内存,减少置换发生的次数,提高cpu的利用率
    工作集窗口尺寸越大,工作集越大,缺页中断的频率越低
    1.虚拟存储管理程序为每一个进程分配固定数量的物理块,并且这个数目可以进行动态的调整。这个数目就是由每个进程的工作集来确定,并且根据主存的负荷和进程的缺页情况动态地调整其工作集
    2.做法:创建一个最小工作集 该工作集保证进程运行在主存中应有的最小页面数 主存负荷不大可能增大工作集 空闲页不多就使用”自动调整工作集“(检查主存中的每一个进程,与最小工作集进行比较,,大于最小值就从工作集中移去一些页面作为主存自由页面为其他进程使用,主存自由页面太小不断检查直到每个进程的工作集都达到最小值为止)
    3.每个工作集都已达到最小值时,虚拟内存管理程序跟踪进程的缺页数量,根据主存中自由页面数量可以适当增加其工作集的大小


    页面大小
    页面大小会影响页表的长度,检索时间,置换页面的时间,页内零头的大小等,对缺页中断的次数有一定的影响
    页面太大:页面数少,查表速度快,缺页中断次数在系统分配相同主存块下减少,降低了缺页中断率,但是换页时间延长,可能产生的页内零头(内存碎片)所带来的空间浪费较大
    页面太小:换页时间短,页内零头少提高了空间利用率,但在系统分配相同的内存卡情况下,发生缺页中断次数增多,增加了缺页中断率

    程序编写方法
    一般希望编制的程序能集中在几个页面上进行访问,减少缺页中断次数,降低缺页中断率

    页面调度算法
    理想的调度算法是当要装入一个新页而必须调出一个页面时,所选择的调出页应该是以后再也不使用的页或者是距离当前最长时间以后才使用的页(OPT),能使缺页中断率最低,如果选择不当则有可能产生抖动现象。

    请求分段式存储管理

    Δ Δ 与分段式区别:与请求分页式原理一样,是以段式存储管理为基础为用户提供比主存实际容量更大的虚拟空间

    Δ Δ 主要思想:请求分段式存储管理允许作业当前需要的一段或几段装入主存便可启动执行,如果要访问的段在主存就把逻辑地址转换为绝对地址;如果不在主存就产生“缺段中断”,将欲访问的段调入。

    需 要 的 支 持 { 请 求 分 段 的 段 表 机 制 缺 段 中 断 机 构 地 址 变 换 机 构 等

    1.段表机制
    段表机制

    存取方式:只执行或只读或读/写
    访问字段A:记录该段被访问的频繁程序
    修改位M:该段进入主存后是否已被修改
    状态位P:是否在内存
    扩充位:请求分段式特有,表示本段在运行过程中是否有动态增长
    段基址:该段在内存中的起始地址
    辅存地址:本段在辅存中的起始地址

    2.缺段中断机构
    缺页中断步骤:
    (1)空间分配:查主存分配表,找一个足够大的区域容纳该分段,找不到就检查该空闲区总和,能满足就采用移动技术,不符合就调出主存中的一段或几段,再将要访问的段调入主存
    (2)修改段表
    (3)装入段后就让作业重新执行被中断的指令,在主存中找到所要访问的段,继续执行下去
    3.地址变换机构

    请求分段式存储管理地址变换过程

    请求段页式存储管理

    Δ Δ 每个作业仍然按逻辑分段,把每一段再分成若干页面,这样,在请求式存储管理中,每一段不必占用连续的存储空间,可按页存放在不连续的主存块中,甚至当主存块不足时,可以将一段中的部分页面装入主存。
    Δ Δ 采用请求段页式存储管理,需要对每一个装入主存的作业建立一张段表,对每一段建立一张页表,段表中指出该段对应页表所存放的起始地址及其长度,页表中应指出该段的每一页在磁盘上的位置以及该页是否在主存,若在主存,则填上占用的主存块号
    Δ Δ 作业执行时按段号查找段表,找到相应的页表再根据页号查找页表,由状态位判定该页是否已在主存,若在,则进行地址转换,否则进行页面调度
    优点:结合了请求分段式和请求分页式虚拟管理的优点
    缺点 :增加了设置表格(段表,页表)和查表等开销

    展开全文
  • (2)具有创建文件、空间分配、删除文件、释放空间等基本功能; (3)把个文件目录、磁盘空间管理的数据结构变化情况显示出来。 三个功能应该都有,我负责的是空白文件目录结构管理磁盘空间,采用的是队列的方式
  • 利用磁盘文件实现操作系统的文件管理功能,主要包括目录结构的管理、外存空 间的分配与释放以及空闲空间管理三部分。 内容: 1.能够在磁盘文件基础上模拟外存分配与回收流程; 2.支持 dir、 md、 cd、 rd命令。 ...
  • 仿真连续分配存储管理系统,至少包括以下功能:并发分配与回收、查询、拼接等功能。 在动态分区管理系统中,主要的操作是分配内存和回收内存。 分配内存:系统利用某种分配算法,从空闲分区链(表)中找到所需大小...
  • 【Mac篇】如何释放Mac上的存储空间

    千次阅读 2020-10-15 10:02:36
    本文介绍了如何手动清理并释放 Mac 上的存储空间,纯小白教学。
  • 怎么清理电脑磁盘释放存储空间

    千次阅读 2021-07-16 04:46:16
    Windows XP操作系统中自带的工具,更有效地维护计算机性能的三种方法。一、释放磁盘空间通过释放磁盘空间,可以提高...磁盘清理工具功能:•删除 Internet 临时文件。•删除下载的程序文件。•清空回收站。•删除 Wi...
  • 第十七 章动态存储空间管理与链表;一动态存储分配及常见函数说明;1. 引例;2. 问题的本质及解决方案;3. 动态存储分配;4. 动态存储释放存储堆;5. C语言的动态存储管理机制;例;malloc说明;6. calloc;7. 空间释放函数...
  • 第十七 章动态存储空间管理与链表;一动态存储分配及常见函数说明;1. 引例;2. 问题的本质及解决方案;3. 动态存储分配;4. 动态存储释放存储堆;5. C语言的动态存储管理机制;例;malloc说明;6. calloc;7. 空间释放函数...
  • 从小到大,从小到大,简单,轻松,琐碎的符号管理。 。 建置状态 单核细胞增多症 释放 入门 Git和GitHub入门 GitHub的新手应该考虑将 。 如果您决定不使用GHFW,则需要: 最后,您应该研究 我们的Git存储库规则 ...
  • 操作系统实验3 存储管理

    千次阅读 2019-11-25 22:41:00
    理解操作系统存储管理原理 操作系统的发展使得系统完成了大部分的内存管理工作。对于程序员而言,这些内存管理的过程完全透明不可见。因此,程序员开发时从不关心系统如何为自己分配内存,而且永远认为系统可以分配...
  • 操作系统存储管理实验课程设计报告

    万次阅读 多人点赞 2016-05-24 18:47:07
    存储管理 姓名: 郑兆涵  专业: 计算机科学与技术(嵌入式方向) 一、设计目的、意义 本次实验针对:(1)存储管理实验,(2)主存储器空间的分配和回收实验,两个实验进行学习。 (1)存储管理实验:本...
  • 可变分区存储管理-循环首次适应法摘要算法思想和概要设计算法思想分配算法释放算法概要设计初始化分配释放数据结构与变量说明双向链表的表项:全局指针源程序链表结构体与全局变量的定义循环首次适应法的分配函数...
  • 存储管理

    千次阅读 2015-12-05 16:50:58
    虚拟存储器就是将用户逻辑内存与物理内存分离,具有请求换入功能和置换功能,为用户提供了一个存储容量比实际内存大得多的存储器管理系统。 工作集: 在某段时间间隔“Δ“里,进程实际要访问的页面集合。 ...
  • Opus One for mac(效率管理软件)最新版 Spotlight 资料寻找 最基本的Spotlight 功能就是寻找,只要输入关键字,与关键字相关的档案、App、网站、浏览纪录、资料夹甚至是地点都有办法帮你全部找出来。 Spotlight...
  • 磁盘存储管理-----操作系统

    千次阅读 2018-06-14 12:45:06
    磁盘存储管理
  • Harbor仓库管理功能及安装详细说明

    千次阅读 2020-03-21 23:58:37
    一、完善镜像仓库管理功能 1、镜像同步:有了多个镜像仓库,镜像的同步成为了新的需求。 1)提供两种方案 a、使用liunx提供的RSYNC服务来定义两个仓库之间的镜像数据同步。 b、对于使用IaaS服务进行...
  • Win10系统释放磁盘空间的五种方法

    千次阅读 2021-07-25 01:33:54
    如果win10系统电脑在运行时存储不足,我们可以采取释放磁盘空间来解决问题,释放磁盘的方法有很多种,拥有足够的磁盘空间可以加快系统运行速度。为此,接下去教程和大家分享Win10系统释放磁盘空间的五种方法。一、...
  • Linux中手动释放缓存的方法

    千次阅读 2021-05-09 04:08:06
    一、Linux释放内存的相关知识介绍:在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,例如当你在Linux下...
  • 存储管理之页式、段式、段页式存储 以及 优缺点

    万次阅读 多人点赞 2018-09-14 18:08:44
    内存管理方式主要分为:页式管理、段式管理和段页式管理。 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页。把内存空间按页的大小划分为片或者页面,然后把页式虚拟地址与内存地址建立一一对应的...
  • 1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。 2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表。 3、在设计好的数据结构上设计一个主存分配算法,要求实现...
  • 【UCOSIII】UCOSIII的存储管理

    千次阅读 2018-07-05 20:40:02
    通常应用程序可以调用ANSI C编译器的malloc()和free()函数来动态的分配和释放内存,但是在嵌入式事实操作系统中最好不要这么做,多次这样的操作会把原来很大的一块连续存储区域逐渐地分割成许多非常小并且彼此不相邻...
  • mysql存储引擎

    万次阅读 多人点赞 2019-07-31 19:28:44
    不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。 因为在关系数据库中数据的存储是以表的形式...
  • 在我们日常使用智能机时,数据储存功能极为重要。许多华为手机用户都将个人数据保存在手机本地储存中,却忽视了华为手机自带的云空间这一项功能。华为手机中的云空间看似不起眼,实则大有乾坤,它不仅能帮我们在生活...
  • 操作系统连续分配存储管理方式

    万次阅读 2018-07-24 20:50:15
    连续分配方式,是指为一个用户程序分配一个连续的内存空间。...l存储管理方法:将内存分为系统区(内存低端,分配给OS用)和用户区(内存高端,分配给用户用)。采用静态分配方式,即作业一旦进入内存,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 243,125
精华内容 97,250
关键字:

存储管理的释放功能