资源描述
河南省高等教育自学考试实验报告册计算机及应用专业(本科段)操作系统 目 录一、实验报告要求.1二、实验一:单处理器系统的进程调度模拟.2三、实验二:可变分区管理方式的主存分配回收模拟.5四、实验三:文件操作模拟.8五、实验四:银行家算法的模拟.10实验报告要求1、实验报告应包括以下的内容:(1)程序清单(2)实验结果(3)分析与讨论2、实验报告应写明实验名称、班号、实验者姓名、学号、将实验报 告整理装订好,按指导教师规定的时间上交。基本实验方法本实践环节要求学生能够顺利完成数据库原理、数据结构、操作系统、面向对象程序设计几门课程的实践操作实验所用器件、设备的简单介绍所有实验在586以上的微机上进行,运行环境为VFP、C语言、C+语言和 Windows、Linux操作系统。实验一:单处理器系统的进程调度模拟一、实验学时:2学时二、实验目的:通过模拟单处理器系统的进度调度,了解进程的构成、进程的组织及进程的状态及其转换,掌握进程调度策略。三、实验设备:本实验在586以上的微机上进行,运行环境为 TurboC 语言。四、样例:(参看实践性环节培训与考核基本要求P45)五、实验内容:数据结构及说明:(模拟实验采用时间片轮调度)Pcb-list是用于存放进程控制块的一个结构数组,每个元素都是一 个Pcb结构。Clock是自定义时钟 TIMESLTICE是时间片大小NUMBER是系统允许并发执行的最大进程数List/tail是进程就绪队列的头/尾指针算法:定义变量;初始化就绪队列;初始化PCBLISTCPU查询有多少进程输入,查到值赋给N;对每个进程 输入到达进程的名称和运行时间调用函数Pcb一malloc。给进程分配pcb块;将进程加入就绪队列;系统调度;(用schedule。实现)if(运行完毕)输出结束条件:用用户控制结束。(一)、实验目的通过模拟单处理器系统的进度调度,了解进程的构成、进程的组织及进程的状态及其转换,掌握进程调度策略。(二)、程序清单ttinclude stdio.h#def ine running 1/*用running表示进程处于运行态*/#def ine aready 2/*用aready表示进程处于就绪态*/#def ine blocking 3/*用blocking表示进程处于等待态*/#define sometime 5/*用sometime表示时间片大小*/#define n 10/*假定系统允许进程个数为10*/struct(int name;/*进程标识符*/int status;/*进程状态*/int ax,bx,ex,dx;/*进程现场信息,通用寄存器内容*/int pc;/*进程现场信息,程序计数器内容*/int psw;/*进程现场信息,程序状态字寄存器内容*/int next;/*下一个进程控制块的位置*/pcbarean;/*定义模拟进程控制块区域的数组*/int PSW,AX,BX,CX,DX,PC,TIME;/*模拟寄存器*/int run;/*定义指向正在运行进程的进程控制块的指针*/struct(int head;int tail;ready;/*定义指向就绪队歹U的头指针head和尾指针tail*/int block;/*定义指向等待队列的指针*/int pfree;/*定义指向空闲进程控制块队列的指针*/sheduling()/*进程调度函数*/(int i;if(ready.head=-l)/*空闲进程控制块队列为空,退出*/printf(无就绪进程n);return 0;)i=ready.head;/*就绪队列头指针赋给i*/ready.head=pcbareaready,head,next;/*就绪队列头指针后移*/if(ready.head=l)ready.tail=T;/*就绪队列为空,修正尾指针 ready,tail*/pcbareai.status=running;/*修改进程控制块状态*/TIME=sometime;/*设置相对时钟寄存器*/*恢复该进程现场信息:*/AX=pcbarearun.ax;BX=pcbarearun.bx;CX=pcbarearun.ex;DX=pcbarearun.dx;PC=pcbarearun.pc;PSW=pcbarearun.psw;/*修改指向运行进程的指针*/run=i;return 0;/*进程调度函数结束*/create(int x)/*创建进程*/(int i;if(pfree=-l)/*空闲进程控制块队列为空*/(printf(无空闲进程控制块,进程创建失败n);return 0;)i=pfree;/*取空闲进程控制块队列的第一个*/pfree=pcbarea pfree.next;/*pfree 后移*/*填写该进程控制块内容:*/pcbareai.name=x;pcbareai.status=aready;pcbareai.ax=x;pcbareai.bx=x;pcbareai.cx=x;pcbareai.dx=x;pcbareai.pc=x;pcbareai.psw=x;if(ready.head!=-l)(/*就绪队列不空时,挂入就绪队列方式*/pebareaready,tail.next=i;ready.tail=i;pcbareaready,tail.next=l;)else/*就绪队列空时,挂入就绪队列方式:*/ready.head=i;ready.tail=i;pcbareaready.tail.next=-l;)/*进程创建函数结束*/main()(/*系统初始化*/int num,j;run=ready.head=ready.tail=block=-l;pfree=O;for(j=0;j0)(create(num);scanf&num);)sheduling();if(run!=-l)(printf(“进程名 进程状态 寄存器内容:ax bx ex dx pc psw:n);printf(,%4d%10d%14d%3d%3d%3d%3d%3dnz,,pcbarearun.name,pcbarearun.status,pcbarearun.ax,pcbarearun.bx,pcbarearun.ex,pcbarearun,dx,pcbarearun.pc,pcbarearun.psw);)return 0;/*main()结束*/(三)、实验中出现的问题及解决的方法这个实验模拟单处理器系统的进度调度,了解进程的构成、进程的组织及进程的状态及其转换,掌握进程调度策略。实验二:可变分区管理方式的主存分配回收模拟一、实验学时:2学时二、实验目的:通过模拟可变分区管理方式下主存的分配和回收,主要了解内存的管理思想,以及掌握分区的几种策略。三、实验设备:本实验在586以上的微机上进行,运行环境为 TurboC 语言。四、样例:(参看实践性环节培训与考核基本要求P54)五、实验内容:数据结构及说明:(模拟试验采用首次适应策略)空闲区链表FBC,分配区链表ABC;表中纪录块的起始地址和大小,块按照地址大小从小到大排列。功能实现分配时:根据作业的大小,从第一个空闲块查找,将找到的第一个足够大的空闲块分配给该作业,返回给用户该块始地址。回收时:根据用户提供的作业的始地址,在分配区表中查找,若找到,加入空闲区链表,提示用户释放成功。显示:用户可随时选择查看内存分配状态图。主要子函数Void show-block void display-men(void)voiddisplay(void)void add-abcNode void assign()void add-fbcNodevoid release(void)(一)、实验目的通过模拟可变分区管理方式下主存的分配和回收,主要了解内存的管理思 想,以及掌握分区的几种策略。(二)、程序清单动态分区存储管理方式的主存分配回收#include#include#include#include#include#define n 10/假定系统允许的最大作业为,假定模拟实验中n值为10 井def ine m 10 假定系统允许的空闲区表最大为m,假定模拟实验中m值为10#define minisize 100 ofstream out(output.txt);typedef struct(float address;已分分区起始地址float length;已分分区长度,单位为字节int flag;已分配区表登记栏标志,用表示空栏目,实验中只支持一个字符的作业名 used;已分配区表used used_ table n;typedef struct(float address;空闲区起始地址float length;空闲区长度,单位为字节int flag;空闲区表登记栏标志,用0表示空栏目,用 1表示未分配 freed;/空闲区表 freed free_ tablem;采用最优分配算法分配xk大小的空间void allocate(char J,float xk)(int i,k;float ad;k=T;for(i=0;i=xk&free_ tablei.flag=l)if(k=-l|free_ tablei.lengthfree_ tablek.length)k=i;if(k=T)未找到可用空闲区,返回cout”无可用空闲区endl;return;)找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于msize大小,则空闲 区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部 分分配 if(free_ tablek.length-xk=minisize)(free_ tablek.flag=O;ad=free_ tablek.address;xk=free_ tablek.length;)else(free_ tablek.length=free_ tablek.length-xk;ad=free_ tab1ek.address+free_ tablek.length;)修改已分配区表 i=0;/寻找空表目while(used_ tablei.flag!=O&i=n)(cout。已分配区表长度不足,分配失败,出错“endl;修正空闲区表if(free_ tablek.flag=0)free_ tablek.flag=l;前面找到的是某个空闲分区的一部分 else(free_ tablek.length=free_ tablek.length+xk;return;)修改已分配表 else(used_ tablei.address=ad;used_ tablei.length=xk;used_ tablei.flag=J;return;回收作业名为J的作业所占主存空间void reclaim(char J)(int i,k,j,s,t;float S,L;寻找已分配表中对应登记项s=0;while(used_ tables.flag!=j|used_ tables.flag=0)&s=n)(cout”未找到作业,回收失败endl;return;)修改已分配表used_ tables.flag=0;取得归还分区的起始地址S和长度LS=used_ tables.address;L=used_ tables.length;j=-l;k=T;寻找回收分区的空闲上下邻,上邻表目k,下邻表目j i=0;whi1e(im&(j=-11 Ik=-l)(if(free_ tablei.flag=l)if(free_ tablei.address+free_ tablei.lengthS)k=i;找到上邻if(free_ tablei.address=S+L)j=i;/找到下邻 i+;)if(k!=-l)if(j!=-l)上邻空闲区,下邻空闲区,三项合并(free_ tablek.length=free_ tablej.length+free_ tablek.length+L;free_ tableLj.flag=0;)else 上邻空闲区,下邻非空闲区,与上邻合并free_ tablek.length=free_ tablek.length+L;elseif(j!=-l)上邻非空闲区,下邻为空闲区,与下邻合并free_ tablej.address=S;free_ tablej.length=free_ tablej.length+L;)else 上下邻均为非空闲区,回收区域直接填入/在空闲区表中寻找空栏目t=0;while(free_ tablet.flag=l&t=m)空闲区表满,回收空间失败,将已分配表复原cout主存空闲表没有空间,回收空间失败endl;used_ tables.flag=J;return;)free_ tablet.address=S;free_ tablet.length=L;free_ tablet.flag=l;)return;)主函数void main()(int i,j;float xk;char s;ifstream in(input.txt);空闲分区表初始化free_ table0.address=10240;free_ table0.length=102400;free_ table0.flag=l;for(i=l;im;i+)free_ tablei.flag=0;已分配表初始化for(i=0;in;i+)used_ tablei.flag=0;while(1)coutz,请输入演示功能项C OU t=:coutz,0.退出coutz,1.分配主存cout,?2.回收主存,endl;=,/endlendl*endlendl*endlendl,zendlendlcout/,3.显示主存,/endlendl;cout=end1end1;cout,/请输入(0 3):endl;cinj;coutjendl;coutendl;switch(j)(case 0:exit(0);case 1:cout”输入作业名s(注意:只能是一个字符):s;coutsendl;cout“作业所需长度xk:xk;coutxkendl;allocate(s,xk);break;case 2:couts;coutsendl;reclaim(s);break;case 3:cout输出空闲区表:n起始地址分区长度标志n;for(i=0;im;i+)coutsetw(6)free_ tablei.addresssetw(9)free_ tablei.lengthsetw(6)f ree_ tablei.f lagendl;cout,/输出已分配区表:n起始地址分区长度标志n”;for(i=0;in;i+)if(used_ tablei.flag!=0)coutsetw(6)used_ tablei.addresssetw(9)used_ tablei.lengthsetw(6)c har(used_ tablei.flag)endl;elsecoutsetw(6)used_ tablei.addresssetw(9)used_ tablei.lengthsetw(6)u sed_ tablei.flagendl;break;default:cout没有该选项endl;/case/while 主函数结束(三)、实验中出现的问题及解决的方法这个实验通过模拟可变分区管理方式下主存的分配和回收,了解 内存的管理思想,并且掌握分区的几种策略。实验三:文件操作模拟一、实验学时:2学时二、实验目的:通过编程练习文件系统提供的文件操作,了解和掌 握文件管理系统工作原理。主要了解文件的物理结构、目录管理、外存空间的管理以及文件的保护和保密。三、实验设备:本实验在586以上的微机上进行,运行环境为 TurboC 语言。四、样例:(参看实践性环节培训与考核基本要求P96)五、实验内容:实现文件的建立和读写操作。首先建立文件Filel和File2,然后 从键盘输入,并将输入的内容写入Filel中,然后将Filel中的内容以 倒序写入File2中,最后将File2的内容显示。(一)、实验目的过编程练习文件系统提供的文件操作,了解和掌握文件管理系统 工作原理。主要了解文件的物理结构、目录管理、外存空间的管理以 及文件的保护和保密。(二)、程序清单import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.lOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;public class Testpublic static void main(String args)throws lOException(File filel=new Filetxt);File file2=new File(D:/f2.txt);int c;InputStream inputl=System,in;InputStreamReader readerl=new InputStreamReader(inputl);FileWriter writeri=new FileWriter(filel);while(c=readerl.read()!=-1)writeri.write(c);)writeri.close();FileReader reader2=new FileReader(filel);FileWriter writer2=new FileWriter(file2);ArrayList list=new ArrayList();while(c=reader2.read()!=-1)list,add(c);)for(int i=list,size()-1;i=0;-i)writer2.write(list,get(i);)writ er 2.close();)(三)、实验中出现的问题及解决的方法通过这个实验让我更加了解了操作系统中的原理和使用方式。实验四银行家算法的模拟一、实验学时:2学时二、实验目的:通过对银行家算法的模拟,了解死锁的概念、死锁的本质以及掌握解决死锁的方法。三、实验设备:本实验在586以上的微机上进行,运行环境为TurboC 语言。四、样例:(参看实践性环节培训与考核基本要求P101)五、实验内容:数据结构定义:可用资源向量available分配矩阵allocation剩余需求矩阵need系统拥有资源向量max-resource安全状态标志向量finish程序要求对每一种资源进行安全检验,要求该程序在静态的条件下输入系统的 状态,和每个进程拥有资源的状态,来判断系统是否安全。(一)、实验目的通过对银行家算法的模拟,了解死锁的概念、死锁的本质以及掌握解决死锁的方法。(二)、程序清单#include 全局变量定义int Available 100;/可利用资源数组int Max50100;最大需求矩阵int Allocation50 100;分配矩阵int Need50100;需求矩阵int Request50100;/M个进程还需要N类资源的资源量int Finish50;int p50;int m,n;/M个进程,N类资源安全性算法int Safe()(int i,j,l=0;int Work100;/可利用资源数组for(i=0;in;i+)Worki=Availablei;for(i=0;im;i+)Finishi=0;for(i=0;im;i+)(if(Finishi=l)continue;else(for(j=O;jWorkljJ)break;)if(j=n)(Finishi=l;for(int k=0;kn;k+)Workk+=Allocationik;pl+=i;i=-l;)else continue;)if(l=m)cout系统是安全的cout系统安全序列是:n;for(i=0;i;)coutn;return 1;)/银行家算法int main()(intcout输入进程的数目:n;cinm;cout输入资源的种类:n;cinn;cout输入每个进程最多所需的各类资源数,按照矩阵输入n;for(i=0;im;i+)for(j=0;jn;j+)cinMaxij;cout输入每个进程已经分配的各类资源数,按照矩阵输入n;for(i=0;im;i+)(for(j=0;jn;j+)(cin Allocationi j;NeedijJ=MaxijJ-Allocationij;if(Needij0)(cout你输入的第个进程所拥有的第个资源错误,请重新输入:n;j-;continue;)cout”请输入各个资源现有的数目:n;for(i=0;in;i+)cinAvailableiJ;Safe();while(1)(cout”输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依 此类推)n;cinmi;cout”输入进程所请求的各个资源的数量n”;for(i=0;in;i+)cinRequestmii;for(i=0;iNeedmii)(coutAvailableiJ)(cout所请求资源数超过系统所有的资源数!n;return 0;)for(i=0;in;i+)(Availablei-=Requestmii;Allocation mi i+=Requestmi i;Needmi i-=Requestmi i;)if(Safe()cout同意分配请求n;else(coutSORRY()你的请求被拒绝n;for(i=0;in;i+)(Availablei+=Requestmi i;Allocationmii-=Requestmii;NeedmiJiJ+=RequestmiiJ;)for(i=0;im;i+)Finishi=0;char Flag;/标志位cout”是否再次请求分配?是请按Y/y,否请按N/n”;while(1)cinFlag;if(Flag=Y|Flag=y|Flag=N|Flag=n)break;elsecout请按要求重新输入:n;continue;if(Flag=Y|Flag=V)continue;else break;(三)、实验中出现的问题及解决的方法没有什么问题但是银行家算法,有效的防止和避免死锁的发生,值得好好学习。
展开阅读全文