1、淮 阴 工 学 院计算机操作系统报告姓 名:学 号:班 级:学 院: 计算机与软件工程学院专 业: 计算机科学与技术指导教师: 2017 年 12 月实验一:存储器的分配与回收算法实现一、实验内容1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较
2、大的空闲区,登在空闲区表中。5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。二、实验要求:1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4 为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰、描述准确逻辑性强;3、实验过程1.设计思想:运用可变分区的存储管理算法设计主存分配和回收。一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,
3、加一部分又成为一个空闲区。一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。开始添加并创建循环链表确定内存块数选择分配算法最先适应法 最佳适应法 最坏适应法设计思路:利用链表对已有作业进行排序,并根据地址判断该作业状态。2.所用数据库结构:循环链表3.测试用例和结果:初始内存状况:(选择最坏适应法)*打印输出当前内存分配情况分配作业 回收内存输入作业大小输出已分配情况输入回收地址及大小分配作业结束退出=开始地址= =大小= =结束地址= =状态=*80 60 140 0*30 40 70 0*0 20 20 0*第一次分配 32,第二次分配 14,第三
4、次分配 23最终结果:空闲内存如下 :*=开始地址= =大小= =结束地址= =状态=*44 26 70 0*0 20 20 0*135 5 140 0*已分配区如下 :*开始地址 大小 结束地址 状态 进程号*80 32 112 1 1*112 23 135 1 1*30 14 44 1 2*4.注释已在代码中5.实验总结:存储器的分配与回收算法实现方法,采用最先适应法、最佳适应法、最坏适应法分配主存空间。当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。当一个作业撤离时,归还
5、的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。本次实验对于队列数据结构有些陌生,发现自己对课程的掌握不太牢固,课后应进行仔细的复习,加深印象。对某些算法的理解不太透彻,应该巩固完善。在网络和同学的帮助下最终得以解决。并使我更加深刻的了解了计算机操作系统中内存分配的执行过程,内存回收的执行过程的方式。对以后的学习和应用奠定了良好的基础。6.实验源代码:#include#include#include#include#include/链式结构typedef struct rt/起始地址int startaddress;/内存区大小int size;/内存区状态int st
6、ate;struct rt *next;struct rt *last;/已分配区的进程号int thread;memory;/空闲区链表memory *head=NULL;/已分配区链表memory *top=NULL;/全局进程号int threadnum;/按首地址排序void sort()/循环指针变量memory *p,*q;int r;int t;/交换记录变量int s;p=head;/冒泡排序for(p=p-next;p!=NULL;p=p-next)for(q=p-next;q!=NULL;q=q-next)if(q-startaddressstartaddress)t=p-
7、startaddress;p-startaddress=q-startaddress;q-startaddress=t;s=p-size;p-size=q-size;q-size=s;t=r;s=r-next;r=r-last;/改变指针操作,建立 r 和 s 之间的指针关系,“孤立”tr-next=s;if(s!=NULL) s-last=r;/释放 tfree(t);/开始端重叠,或者开始端在当前结点的左边,结束端在当前结点的左右端之间else if(start=leftr-size-=(end-left);r-state=0;r-thread=0;/结束端重叠,或者结束端在当前结点的右边
8、,开始端在当前结点的左右端之间else if(leftright)/内存被局部释放,进程遭破坏,标记状态为结束,进程号清零r-startaddress=left;r-size=(start-left);r-state=0;/开始和结束端都被包含,则结点被拆成了两个else if(startleftr-size=(start-left);r-state=0;r-thread=0;/新建一个结点w=(memory *)malloc(sizeof(memory);/后一部分为 ww-state=1;w-startaddress=end;w-size=(right-end);w-state=0;w-t
9、hread=0;/将 w 加入以已配表if(r-next!=NULL) r-next-last=w;w-next=r-next;r-next=w;w-last=r;/在空闲区里寻找与需要释放的内存区域有公共区域的结点for(r=head-next;r!=NULL;r=r-next)/记录当前结点的左右端left=r-startaddress;right=r-startaddress+r-size;/s-e l-r 两段无重叠,在结点左边if(endstate=0;w-startaddress=start;w-size=size;/改变指针操作cout#include #include #inc
10、lude /共有 3 种资源,3 个进程bool avoid;struct info/进程信息long tot4;/最大占用资源数long p4;/已经占有的资源数pro5;long LeftRes4;/剩余资源数long qu4;void init()/函数功能:输入和初始化if (avoid)if (safe(x);elseprintf(“申请被拒绝! 不符合安全规则。n“);return ;elseprintf(“申请成功!n“);printf(“n=n“);for (i=1;i#include #include#define getMEM() (MEM*)(malloc(sizeof(
11、MEM)typedef struct Memory/可用分区链表节点int base;/基地址int size;/大小struct Memory *next;MEM;MEM *pm = getMEM();/可用分区的链表头MEM *temp;/int SIZE;/总的内存的大小,由用户输入int geti()/让用户只能输入正整数char ch;int i = 0;fflush(stdin);ch = getchar();while(ch = n)printf(“tf 输入不能为空 请重新输入n“);fflush(stdin);ch = getchar();while(ch != n)if(c
12、h 9 | ch base,p-size);p = p-next;puts(“n*主存空间占用情况表:*n“);puts(“基地址tttt 大小n“);p = pm;int main()int size = 0,base = 0;int ch;init();print(pm);while(1)puts(“分配空间请按 1,释放空间请按 2n“);ch = getche();if( ch = 1)puts(“n 请输入需要分配的空间大小 : “);size =geti();if(base = allocMem(pm, size) = -1)puts(“空闲内存分区大小不足n“);elseprin
13、tf(“n 分配内存成功 ,此次分配的内存基地址为%dn“,base);print(pm);else if(ch = 2)puts(“n 请输入要释放内存的基地址 : “);base = geti();puts(“n 请输入要释放内存的大小 : “);size = geti();if(release(pm, base, size)puts(“n 释放内存成功 !n“);print(pm);elseputs(“非法操作,您所给的内存范围没有被分配出去 :n“);return 0;实验四 银行家算法一、目的通过银行家算法设计与实现,可以加深学生对死锁的理解,掌握死锁的预防、避免、检测和解除的基本原
14、理,重点掌握死锁的避免方法银行家算法。使学生初步具有研究、设计、编制和调试操作系统模块的能力。二、要求1问题描述系统在进行资源分配的过程中,允许进程动态的申请资源,为了避免发生死锁,在分配资源前要进行安全性检查,若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则,进程等待。2基本要求1分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。2画出程序的基本结构框图和流程图。3对程序的每一部分要有详细的设计分析说明。4源代码格式要规范。5设计合适的测试用例,对得到的运行结果要有分析。6设计中遇到的问题,设计的心得体会。7按期提交完整的程序代码、可执行程序和课程设计报告。三
15、、设计题目描述 银行家算法是一种最有代表性的避免死锁的算法。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。安全状态:如果存在一个由系统中所有进程构成的安全序列 P1,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。那么什么是安全序列呢?安全序列:一个进程序列P1,Pn是安全的,如果对于每一个进程 Pi(1in),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程 Pj (j i )当前占有资源量之和。银行家算法:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当
16、于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。四、设计思想、环境1设计思想输入当前进程资源的使用情况以及整个系统的资源使用情况,并进行初始化安全性检查;如果是不安全状态,重新初始化系统;否则,从
17、等待队列中提取一个等待进程,使用银行家算法进行检测,输出当前系统的状态和安全序列;如果是安全状态,系统继续从等待队列中提取等待进程进行检查;如果是不安全状态,进程回到等待队列,系统从等待队列中提取等待进程进行检查。系统中申请资源的进程全部进入等待队列等候处理。2环境说明工具:C 语言。在 WINDOWS 环境下使用 VC+6.0 进行开发。五、源程序结构分析及代码实现1程序结构程序共有以下五个部分:(1).初始化 chushihua():用于程序开始进行初始化输入数据:进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。(2).当前安全性检查 sa
18、fe():用于判断当前状态安全性,根据不同地方的调用提示处理不同。(3).银行家算法 bank():进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。(4).显示当前状态 show():显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量。(5).主程序 main()逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。2数据结构程序使用的全局变量:const int x=10,y=10; /定义常量int Availablex; /各种资源可利用的数量int Allocat
19、ionyy; /各进程当前已分配的资源数量int Maxyy; /各进程对各类资源的最大需求数int Needyy; /还需求矩阵int Requestx; /申请各类资源的数量int Workx; /工作向量,表系统可提供给进程运行所需各类资源数量int Finishy; /表系统是否有足够的资源分配给进程,0 为否,1 为是int py; /存储安全序列int i,j; /全局变量,主要用于循环语句中int n,m; /n 为进程的数量,m 为资源种类数int l=0,counter=0;3函数声明void chushihua(); /系统初始化函数void safe(); /安全性算法函数void bank(); /银行家算法函数void show (); /输出当前资源分配情况5. 操作系统银行家算法流程图:初始化函数 chushihua()开始输入进程的数量输入资源种类数输入个资源当前可用资源数输入各进程当前已分配的资源数输入各进程对各类资源的最大需求 输出提示:输入有误,请重新输入AVAILABLEi-=REQUESTi;ALLOCATIONi+=REQUESTi;NEEDi-=REQUESTi;