操作系统实验内存分配(链表实现)

合集下载

实验五模板(内存分配)

实验五模板(内存分配)

实验报告(五)内存分配一、实验目的通过学习Minix操作系统的内存分配,加深理解操作系统内存管理的相关概念和原理。

二、准备工作注:如果熟悉准备工作内容,可忽略。

1、练习使用vi编辑器vi编辑器具有两种模式(1)命令模式通过键盘左上角ESC键进入,在该模式下可以使用编辑命令。

删除一行(连续键入两个d);删除光标处的字符(小写x);在当前光标前插入(i);在当前光标后插入(a);保存(shift+冒号,再键入w);退出编辑器(shift+冒号,再键入q);保存并且退出(shift+冒号,再键入wq);(2)编辑模式在命令模式下,通过在当前光标前插入(i)或在当前光标后插入(a),进入编辑模式。

通过键盘左上角ESC键切换到命令模式。

2、练习修改、编译和安装新操作系统(1)修改/usr/src/kernel/main.c中的announce函数cd /usr/src/kernelcp main.c main.c.backupvi main.c找到announce函数增加打印语句kprintf(“在这儿增加你想打印的语句”);保存退出vi编辑器(通过键盘左上角ESC键进入命令模式,然后shift+冒号,再键入wq)(2)编译新操作系统cd /usr/src/toolsmake image(3)安装新操作系统make install(4)用新操作系统更换旧操作系统:shutdown在boot monitor下(出现d0p0s0>时),键入boot c0d0p0重新进入新操作系统。

三、实验内容、过程与分析(一)实验内容1、学习《Operating Systems Design and Implementation》(Andrew S. Tanenbaum著,第三版)中的第4章4.8.8小节,Memory Management Utilities,内存管理。

Minix内存管理采用了动态分区分配以及首次适应算法。

实现内存分配实验报告(3篇)

实现内存分配实验报告(3篇)

第1篇一、实验目的1. 理解操作系统内存分配的基本原理和常用算法。

2. 掌握动态分区分配方式中的数据结构和分配算法。

3. 通过编写程序,实现内存分配和回收功能。

二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发工具:GCC编译器三、实验原理1. 内存分配的基本原理操作系统内存分配是指操作系统根据程序运行需要,将物理内存分配给程序使用的过程。

内存分配算法主要包括以下几种:(1)首次适应算法(First Fit):从内存空间首部开始查找,找到第一个满足条件的空闲区域进行分配。

(2)最佳适应算法(Best Fit):在所有满足条件的空闲区域中,选择最小的空闲区域进行分配。

(3)最坏适应算法(Worst Fit):在所有满足条件的空闲区域中,选择最大的空闲区域进行分配。

2. 动态分区分配方式动态分区分配方式是指操作系统在程序运行过程中,根据需要动态地分配和回收内存空间。

动态分区分配方式包括以下几种:(1)固定分区分配:将内存划分为若干个固定大小的分区,程序运行时按需分配分区。

(2)可变分区分配:根据程序大小动态分配分区,分区大小可变。

(3)分页分配:将内存划分为若干个固定大小的页,程序运行时按需分配页。

四、实验内容1. 实现首次适应算法(1)创建空闲分区链表,记录空闲分区信息,包括分区起始地址、分区大小等。

(2)编写分配函数,实现首次适应算法,根据程序大小查找空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

2. 实现最佳适应算法(1)创建空闲分区链表,记录空闲分区信息。

(2)编写分配函数,实现最佳适应算法,根据程序大小查找最佳空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

3. 实验结果分析(1)通过实验,验证首次适应算法和最佳适应算法的正确性。

(2)对比两种算法在内存分配效率、外部碎片等方面的差异。

五、实验步骤1. 创建一个动态内存分配模拟程序,包括空闲分区链表、分配函数和回收函数。

操作系统实验四存储管理实验(1)

操作系统实验四存储管理实验(1)

操作系统课程实验年级2012 级专业计算机科学与技术(应用型)姓名学号指导教师日期实验四、存储管理实验一、关键问题1、实验目的理解内存分配和回收原理。

2、实验环境Ubuntu 8.0或者以上,Eclipse集成开发环境3、实验内容3.1 在控制台内观察Linux内存分配情况3.2存储管理模拟实验要求:写一动态分区管理程序,使其内存分配采用最佳适应分配算法。

老师所给的例子为内存分配算法是最先适应分配算法的系统模拟动态分区管理方案,而问题的关键就是如何把最先适应分配算法改为最佳适应分配算法。

二、设计修改思路struct freearea* min1=NULL;//定义了一个符合条件的最小空白块链表首先我们在分配内存函数中需要定义一个记录符合条件的最小空白块的链表结构指针,对当前空闲分区链进行遍历,找到符合条件的最小空白块并记录。

系统为作业分配内存时,根据指针freep查找空闲分区链。

当找到一块可以满足请求中最小的空闲分区时便分配。

当空间被分配后剩余的空间大于规定的碎片,则形成一个较小的空闲分区留在空闲链中。

三、实现修改的关键代码//有两个链:空白块链及作业链.空白块链描述空白块,链首指针freep,初始为一大块空白块.//作业链按从高址到低址的顺序链接,链首指针jobp//为作业jn分配jl大小内存,起始地址为javoid ffallocation(int jl,char jn[10],int* ja){struct mat* jp=NULL;//作业链当前节点struct mat* jp2=NULL;//新的作业节点struct mat* jp1=NULL;//struct freearea* fp=NULL;//当前空白块struct freearea* min1=NULL;//定义了一个符合条件的最小空白块链表int flag=0;int i;*ja=-1;if (totalfree<jl) //剩余空间大小不能满足作业要求return;fp=freep;while (fp!=NULL){if (fp->freesize>jl){ min1=fp;flag=1;break;}fp=fp->next;}if(freep->next!=NULL&&flag==0) {*ja=0;return;}fp=min1->next;while (fp!=NULL){if (fp->freesize>jl&&fp->freesize<min1->freesize)min1=fp;fp=fp->next;//当前空白块大小不满足要求}jobnumber++;totalfree=totalfree-jl;jp2=calloc(1,sizeof(struct mat));//在节点上登记为该作业分配的内存空间// for (i=0;i<10;i++) (jp2->jobname)[i]=' ';i=-1;while(jn[++i])(jp2->jobname)[i]=jn[i];(jp2->jobname)[i]='\0';jp2->joblength=jl;jp2->jobaddress=min1->freeaddress;//登记该作业的起始地址(块的最低地址)*ja=jp2->jobaddress;//将节点jp2插入作业链jobp,按高址到低址的顺序。

操作系统存储管理实验报告

操作系统存储管理实验报告

操作系统存储管理实验报告一、实验目的操作系统的存储管理是计算机系统中非常重要的组成部分,它直接影响着系统的性能和资源利用率。

本次实验的目的在于深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握存储分配、回收、地址转换等关键技术,并对不同存储管理策略的性能进行分析和比较。

二、实验环境本次实验在 Windows 10 操作系统下进行,使用 Visual Studio 2019 作为编程环境,编程语言为 C++。

三、实验内容(一)固定分区存储管理1、原理固定分区存储管理将内存空间划分为若干个固定大小的分区,每个分区只能装入一道作业。

分区的大小可以相等,也可以不等。

2、实现创建一个固定大小的内存空间数组,模拟内存分区。

为每个分区设置状态标志(已分配或空闲),并实现作业的分配和回收算法。

3、实验结果与分析通过输入不同大小的作业请求,观察内存的分配和回收情况。

分析固定分区存储管理的优缺点,如内存利用率低、存在内部碎片等。

(二)可变分区存储管理1、原理可变分区存储管理根据作业的实际需求动态地划分内存空间,分区的大小和数量是可变的。

2、实现使用链表或数组来管理内存空间,记录每个分区的起始地址、大小和状态。

实现首次适应、最佳适应和最坏适应等分配算法,以及分区的合并和回收算法。

3、实验结果与分析比较不同分配算法的性能,如分配时间、内存利用率等。

观察内存碎片的产生和处理情况,分析可变分区存储管理的优缺点。

(三)页式存储管理1、原理页式存储管理将内存空间和作业都划分为固定大小的页,通过页表将逻辑地址转换为物理地址。

2、实现设计页表结构,实现逻辑地址到物理地址的转换算法。

模拟页面的调入和调出过程,处理缺页中断。

3、实验结果与分析测量页式存储管理的页面置换算法(如先进先出、最近最少使用等)的命中率,分析其对系统性能的影响。

探讨页大小的选择对存储管理的影响。

(四)段式存储管理1、原理段式存储管理将作业按照逻辑结构划分为若干个段,每个段有自己的名字和长度。

操作技巧系统之内存分配与回收

操作技巧系统之内存分配与回收

操作系统实验内存的分配与回收实验报告一、实验题目:内存的分配与回收二、实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。

三、实验目的:掌握可变分区首次适应算法的原理以及其编程实现。

四、实验过程:1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。

首次适应算法要求空闲空间链以地址递增的次序链接。

进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。

分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。

内存的回收需要考虑四种情况:⑴回收分区前后两个分区都空闲,则需要和前后两个分区合并;(2)回收分区只有前一分区空闲,则与前一分区合并;(3)回收分区只有后一分区空闲,则和后一分区合并;(4)回收分区独立,不考虑合并。

2、主要数据结构:struct FreeArea{ 链结点包含的数据:分区号、大小、起址、标记int ID;int size;long address;int sign;};struct Node { 双链表结点结构体:数据区、前向指针、后继指针FreeArea data;struct Node *prior;struct Node *next;}*DLinkList;3、输入、输出:输入: I.内存分配时由键盘输入分区ID和大小;II.内存回收时由键盘输入需要回收的分区ID;输出:输出内存的分配情况(按照地址从低到高)4、程序流程图:5、实验结果截屏:6、源程序代码:#include<iostream>using namespace std;#define Free 0 //空闲状态#define Busy 1 //已用状态#define PBusy 2 //碎片已用状态#define FINISH 1 //完成#define FINISH2 1 //完成#define ERROR 0 //出错#define memory 512 //最大内存空间为(单位:KB)#define min 10 //碎片最小值(单位:KB)typedef struct FreeArea//空闲链数据{int ID;int size;long address;int sign;};typedef struct Node//空闲连结构{FreeArea data;struct Node *prior;struct Node *next;}*DLinkList;DLinkList head; //头结点DLinkList tail; //尾结点int Create()//初始化{head=(DLinkList)malloc(sizeof(Node));//分配内存tail=(DLinkList)malloc(sizeof(Node));head->prior=NULL;head->next=tail;tail->prior=head;tail->next=NULL;tail->data.address=0;tail->data.size=memory;tail->data.ID=0;tail->data.sign=Free;return FINISH;}int FirstFit(int ID,int request)//首次适应算法{DLinkList temp=(DLinkList)malloc(sizeof(Node));//新建作业的结点temp->data.ID=ID;temp->data.size=request;temp->data.sign=Busy;Node *p=head;//插入指针Pwhile(p){if(p->data.sign==Free && p->data.size==request)//剩余大小恰好满足{p->data.sign=Busy;p->data.ID=ID;return FINISH;break;}else if(p->data.sign==Free&& p->data.size>request&& (p->data.size-request>min))//满足需求且有剩余且不产生碎片{temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size=p->data.size-request;return FINISH;break;}else if(p->data.sign==Free&& p->data.size>request&& p->data.size-request<=min)//产生碎片时{p->data.sign=PBusy;p->data.ID=ID;return FINISH;break;}p=p->next;//若前面的分区都已分配,P指针后移}return ERROR;}int Allocate()//主存分配{int ID,request;cout<<"请输入作业所在分区号:";cin>>ID;cout<<"请输入分配的主存(单位:KB):";cin>>request;if(request<0 ||request==0){cout<<"分配的主存必须是正整数!"<<endl;return ERROR;}if(FirstFit(ID,request)==FINISH)cout<<"分配成功!"<<endl;elsecout<<"内存不足,分配失败!"<<endl;}int Recycle(int ID)//回收{Node *p=head;while(p){if(p->data.ID==ID){p->data.sign=Free;//p->data.ID=Free;if((p->prior->data.sign==Free)&&(p->next->data.sign==Free))//与前后的空闲块相连{p->prior->data.size=p->prior->data.size+p->data.size+p->next->data.size;p->prior->next=p->next->next;if(p->next->next==NULL)//若p->next是最后一个结点{p->prior->data.ID=Free;p->next=NULL;}else{p->next->next->prior=p->prior;}break;}if(p->prior->data.sign==Free)//与前面的空闲块相连{p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;break;}if(p->next->data.sign==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;if(p->next->next==NULL)//若p->next是最后一个结点p->next=NULL;else{p->next->next->prior=p;p->next=p->next->next;}break;}break;}p=p->next;}cout<<"分区:"<<ID<<"回收成功"<<endl;return FINISH;}void show()//显示{cout<<" 主存分配情况\n";Node *p=head->next;while(p){cout<<"分区号:";if(p->data.ID==Free)cout<<"Free"<<endl;elsecout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address;cout<<" 分区大小:"<<p->data.size<<" KB";cout<<" 状态:";if(p->data.sign==Free)cout<<"空闲"<<endl;else if(p->data.sign==PBusy)cout<<"碎片已分配"<<endl;elsecout<<"已分配"<<endl;p=p->next;}cout<<endl;}void main(){Create();int choice;int i;for(i=0;;i++){cout<<"请输入操作:";cout<<"1.分配内存 2.回收内存 3.显示主存0.退出";cout<<endl;cin>>choice;if(choice==1)// 分配内存Allocate();else if(choice==2)// 内存回收{ i nt ID;cout<<"请输入要释放的分区号:";cin>>ID;Recycle(ID);}else if(choice==3)//显示主存show();else if(choice==0)//退出break;else//非法输入{cout<<"输入有误!"<<endl;continue;}}}。

内存连续分配方式实验

内存连续分配方式实验

内存连续分配方式实验内存连续分配是操作系统中的重要概念之一、在计算机系统中,内存分配是指将进程所需的内存空间分配给其使用,同时也需要满足内存管理的要求。

内存连续分配方式是指将进程所需的内存空间连续地划分并分配给进程。

下面将介绍内存连续分配的几种方式及实验。

1.固定分区分配方式:固定分区分配方式是将整个内存空间分为若干个大小相等的分区,并为每个分区分配一个进程。

这种分配方式适用于进程数固定或进程大小相对稳定的场景。

固定分区分配方式的优点是简单易实现,缺点是可能会造成内存空间浪费,同时,当进程数或进程大小发生变化时,需要重新划分分区,性能较差。

2.动态分区分配方式:动态分区分配方式是根据进程的实际需要动态地分配内存空间。

动态分区分配方式将内存空间划分为若干个大小不等的分区,每个分区都可以独立地分配给进程使用。

当有新进程需要内存空间时,系统会根据分区空闲情况找到合适的分区进行分配。

动态分区分配方式的优点是充分利用内存空间,缺点是可能会出现内存碎片问题。

3.伙伴系统分配方式:伙伴系统分配方式是一种动态分区分配方式的改进版本。

它将内存空间划分为若干个大小相等的块,每个块大小都是2的幂。

当有新进程需要内存空间时,系统会找到与其大小最接近的空闲块进行分配。

如果找到的块大于所需大小,则将其划分为两个大小相等的块,其中一个分配给进程,另一个留作备用;如果找到的块小于所需大小,则会继续查找更大的空闲块进行分配。

伙伴系统分配方式的优点是减少了内存碎片问题,缺点是实现较为复杂。

实验设计:1.实验目的:通过实验,测试和比较不同的内存连续分配方式在不同场景下的性能和效果。

2.实验环境:使用一台具备内存管理功能的计算机,并在上面运行操作系统。

3.实验步骤:a.首先,选择一种内存连续分配方式,如固定分区分配方式。

b.根据选择的分配方式,设置相应的分区大小和数量。

c.运行一些需要内存空间的进程,并观察它们的分配情况。

d.记录每个进程所分配到的内存空间大小和位置,以及未分配的内存空间大小和位置。

操作系统实验-内存管理

操作系统实验-内存管理

操作系统实验-内存管理操作系统实验内存管理在计算机系统中,内存管理是操作系统的核心任务之一。

它负责有效地分配和管理计算机内存资源,以满足各种程序和进程的需求。

通过本次操作系统实验,我们对内存管理有了更深入的理解和认识。

内存是计算机用于存储正在运行的程序和数据的地方。

如果没有有效的内存管理机制,计算机系统将无法高效地运行多个程序,甚至可能会出现内存泄漏、内存不足等严重问题。

在实验中,我们首先接触到的是内存分配策略。

常见的内存分配策略包括连续分配和离散分配。

连续分配是将内存空间视为一个连续的地址空间,程序和数据被依次分配到连续的内存区域。

这种方式简单直观,但容易产生内存碎片,降低内存利用率。

离散分配则将内存分成大小相等或不等的块,根据需求进行分配。

其中分页存储管理和分段存储管理是两种常见的离散分配方式。

分页存储管理将内存空间划分为固定大小的页,程序也被分成相同大小的页,通过页表进行映射。

分段存储管理则根据程序的逻辑结构将其分成不同的段,如代码段、数据段等,每个段有不同的访问权限和长度。

接下来,我们研究了内存回收算法。

当程序不再使用分配的内存时,操作系统需要回收这些内存以便再次分配。

常见的内存回收算法有首次适应算法、最佳适应算法和最坏适应算法。

首次适应算法从内存的起始位置开始查找,找到第一个满足需求的空闲区域进行分配;最佳适应算法则选择大小最接近需求的空闲区域进行分配;最坏适应算法选择最大的空闲区域进行分配。

为了更直观地理解内存管理的过程,我们通过编程实现了一些简单的内存管理算法。

在编程过程中,我们深刻体会到了数据结构和算法的重要性。

例如,使用链表或二叉树等数据结构来表示空闲内存区域,可以提高内存分配和回收的效率。

在实验中,我们还遇到了一些实际的问题和挑战。

比如,如何处理内存碎片的问题。

内存碎片是指内存中存在一些无法被有效利用的小空闲区域。

为了解决这个问题,我们采用了内存紧缩技术,将分散的空闲区域合并成较大的连续区域。

操作系统实验内存分配

操作系统实验内存分配

西安邮电大学(计算机学院)课内实验报告实验名称:内存管理专业名称:软件工程班级:学生姓名:学号(8位):指导教师:实验日期:实验五:进程1.实验目的通过深入理解区管理的三种算法,定义相应的数据结构,编写具体代码。

充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣。

(1)掌握内存分配FF,BF,WF策略及实现的思路;(2)掌握内存回收过程及实现思路;(3)参考给出的代码思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

2.实验要求:1)掌握内存分配FF,BF,WF策略及实现的思路;2)掌握内存回收过程及实现思路;3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

3.实验过程:创建进程:删除其中几个进程:(默认以ff首次适应算法方式排列)Bf最佳适应算法排列方式:wf最差匹配算法排列方式:4.实验心得:这次实验实验时间比较长,而且实验指导书中对内存的管理讲的很详细,老师上课的时候也有讲的很详细,但是代码比较长,刚开始的时候也是不太懂,但是后面经过和同学一起商讨,明白几种算法的含义:①首次适应算法。

在采用空闲分区链作为数据结构时,该算法要求空闲分区链表以地址递增的次序链接。

在进行内存分配时,从链首开始顺序查找,直至找到一个能满足进程大小要求的空闲分区为止。

然后,再按照进程请求内存的大小,从该分区中划出一块内存空间分配给请求进程,余下的空闲分区仍留在空闲链中。

②循环首次适应算法。

该算法是由首次适应算法演变而形成的,在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给进程。

③最佳适应算法将空闲分区链表按分区大小由小到大排序,在链表中查找第一个满足要求的分区。

④最差匹配算法将空闲分区链表按分区大小由大到小排序,在链表中找到第一个满足要求的空闲分区。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{//因为要进行插入操作,所以传的是要分配内存块的前指针
memory *p=q->next;
memory *temp=new memory;
temp=new memory;//代表进程pro的内存块
temp->begin=p->begin;
temp->size=size;
temp->pro=pro;
{
min=p->size;
front=q;
temp=p;
}
q=p;
p=p->next;
}
if(temp==NULL)return 0;//没找到,返回0
else
{
if(manage==0)temp->pro=pro;//静态,直接让进程进驻内存
else assign(front,pro,size);//动态,调用assign来给进程pro分配
}
}
}
}
return 1;
}
void print(char ch,int begin,int size)//根据内存块内容,格式化输入一块内存块
{
switch(ch)
{
case 'o':printf("操作系统区\t%3dk\t%3dk~%3dk\n",size,begin,begin+size-1);break;
else//找到了,返回1
{
if(manage==0)p->pro=0;//静态内存,直接撤销进程,不用内存块合并
else//动态内存,可能要进行内存合并,分4种情况
{
if(q->pro!=0)
{
if(p->next==NULL||p->next->pro!=0)//前后内存块都不是空闲块
p->pro=0;
{
max=p->size;
front=q;
temp=p;
}
q=p;
p=p->next;
}
if(temp==NULL)return 0;//没找到,返回0
else//找到了,返回1
{
if(manage==0)temp->pro=pro;//静态,直接让进程进驻内存
else assign(front,pro,size);//动态,调用assign来给进程pro分配
else if(choice=='3')break;
childmenu(manage);
}
}
q->begin=5;
q->pro=0;
q->size=20;
p->next=q;
p=q;
q=new memory;//空闲块2,大小50,起始地址25k
q->begin=25;
q->pro=0;
q->size=50;
p->next=q;
p=q;
q=new memory;//空闲块3,大小30,起始地址75k
{
assign_pro(manage);system("pause");
}
else if(choice=='2')
{
del_pro(manage);system("pause");
}
else if(choice=='3')break;
}
}
void main()
{
char choice;
int manage;
else
{
result=delpro(manage,pro);
if(result==0)cout<<"没有找到进程"<<pro<<",撤销失败"<<endl;
else cout<<"进程"<<pro<<"撤销成功"<<endl;
}
}
void assign_pro(int manage)//给进程pro根据选择情况分配内存
else if(result==1)cout<<"进程"<<pro<<"分配成功"<<endl;
else cout<<"输入错误"<<endl;
}
void childmenu(int manage)//子菜单
{
char choice;
init(manage);
while(1)
{
system("cls");
delete p;
p=q;
}
}
base=new memory; //操作系统,大小5k,起始地址是0k
base->begin=0;
base->pro='o';
base->size=5;
if(manage==0)//静态内存,初始化7个内存块,第一个内存块是操作系统
{
p=base;
q=new memory;//空闲块1,大小20,起始地址5k
switch(choose)
{
case '1':
result=ff(manage,pro,size);
break;
case '2':
result=bf(manage,pro,size);
break;
case '3':
result=wf(manage,pro,size);
break;
}
if(result==0)cout<<"进程"<<pro<<"分配失败"<<endl;
}
return 1;
}
int delpro(int manage,char pro)//撤销进程,可能要进行内存块的合并
{
memory *p=base,*q;
while(p)//遍历内存,寻找进程pro
{
if(p->pro!=pro)
{
q=p;
p=p->next;
}
else break;
}
if(p==NULL)return 0;//没找到,返回0
q->begin=75;
q->pro=0;
q->size=30;
p->next=q;
p=q;
q=new memory;//空闲块4,大小45,起始地址105k
q->begin=105;
q->pro=0;
q->size=45;
p->next=q;
p=q;
q=new memory;//空闲块5,大小54,起始地址150k
{
q->next=p->next;
q->size=q->size+p->size;
delete p;
}
else//前后内存块都是空闲块
{
q->next=p->next->next;
q->size=q->size+p->size+p->next->size;
delete p->next;
delete p;
case 0 :printf("空闲区\t%3dk\t%3dk~%3dk\n",size,begin,begin+size-1);break;
default :printf("进程%c \t%3dk\t%3dk~%3dk\n",ch,size,begin,begin+size-1);break;
}
}
p=p->next;
}
else break;
}
if(p==NULL)return 0;//没找到,返回0
else//找到了,返回1
{
if(manage==0)p->pro=pro;//静态,直接让进程进驻内存
else assign(q,pro,size);//动态,调用assign来给进程pro分配
delete p;
}
}
int ff(int manage,char pro,int size)//最先适应法
{
memory *p=base;
memory *q=p;
while(p)//遍历内存找到第一个适合进程pro的内存块,保存它的前指针
{
if(p->size<size||p->pro!=0)
{
q=p;
void show()//格式化显示内存的储存情况
{
memory *p=base;
int count=1;
cout<<"内存现在的储存情况是:"<<endl;
printf("块号\t内容\t\t大小\t起始-结束地址\n");
while(p)
{
printf(" %2d ",count++);
print(p->pro,p->begin,p->size);
else//前内存块不是空闲块,后内存块是空闲块
{
q->next=p->next;
p->next->begin=p->begin;
相关文档
最新文档