计算机操作系统课程设计.doc_第1页
计算机操作系统课程设计.doc_第2页
计算机操作系统课程设计.doc_第3页
计算机操作系统课程设计.doc_第4页
计算机操作系统课程设计.doc_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档景德镇陶瓷学院计算机操作系统课程设计学院:信息工程学院专业:计算机科学与技术班级:13级二班学号:201310510112姓名:张旸任务一、进程创建、控制与撤消一、实验目的:通过进程的创建和控制的设计来达到如下目的:1、加深对进程概念的理解,明确进程和程序的区别2、进一步认识并发执行的概念,区别顺序执行和并发执行3、分析进程争用临界资源的现象,学习解决进程互斥的方法二、实验内容:在WINDOWS环境下模拟实验:1、编写一程序,来模拟进程的创建和撤消,要求通过终端键盘输入三、四作业的名称、大小、优先级等。系统为它创建进程,并把进程控制块PCB的内容送到终端显示器上输出2、同时模拟内存空间为作业分配内存空间,并把结果用图形形象地表示出来,同样通过终端输出3、按进程的优先级的顺序撤消进程,同时通过终端显示PCB的撤消过程和内存的释放过程三、结构框图:开始主函数main ()查看进程viewrun()撤销进程kill()创建进程create()替换进程huanchu()结束退出exit(0)四、实验代码:#include #include #include struct jincheng int pid;int youxian;int daxiao;int msg;int live;struct jincheng neicun20,waicun;int shumu=1;create()if(shumu=20)printf(n 内存已满,请先结束或换出进程n);elseprintf(n 请创建第%d个进程,shumu);printf(n 请输入新进程的 pidn); scanf(%d,&neicunshumu.pid);printf(n 请输入新的进程的优先级n); scanf(%d,&neicunshumu.youxian);printf(n 请输入新的进程的大小n); scanf(%d,&neicunshumu.daxiao);printf(n 请输入新的进程的消息n);scanf(%d,&neicunshumu.msg); neicunshumu.live=1; shumu+;return neicunshumu-1.live;void viewrun()int vpid;printf(n 请输入想显示第几个创建的进程n); scanf(%d,&vpid);if(vpid0&vpid0&pid1neicunpid2.youxian) waicun.pid=neicunpid1.pid;waicun.youxian=neicunpid1.youxian;waicun.daxiao=neicunpid1.daxiao;waicun.msg=neicunpid1.msg;neicunpid1.pid=neicunpid2.pid;neicunpid1.youxian=neicunpid2.youxian;neicunpid1.daxiao=neicunpid2.daxiao;neicunpid1.msg=neicunpid2.msg;neicunpid2.pid=waicun.pid; neicunpid2.youxian=waicun.youxian; neicunpid2.daxiao=waicun.daxiao; neicunpid2.msg=waicun.msg;printf(n 替换完成n);printf(n 被替换进程的pid是:%dn,waicun.pid);printf(n 被替换进程的youxian是:%dn,waicun.youxian);printf(n 被替换进程的daxiao是:%dn,waicun.daxiao);printf(n 被替换进程的msg是:%dn,waicun.msg);elseprintf(n进程优先级不够大);elseprintf(所查看运行进程不存在); printf(请按回车退出换出进程n);c=getche();void kill()int kpid; printf(n 请输入要撤销第几个创建的进程n); scanf(%d,&kpid);if(kpid0&kpid20&neicunkpid.live=1)neicunkpid.live=0;printf(n 已撤销第%d个创建的进程,kpid);else printf(n 所查看运行进程不存在n);printf(请按回车退出查看n);kpid=getch();void main ()int n,m,i;char a;n=1;while(n=1)system(cls);printf(n*); printf(n* 进程演示系统 *);printf(n*);printf(n 1.创建新的进程 2.查看运行进程 );printf(n 3.换出某个进程 4.杀死运行进程 ); printf(n 5.退出 ); printf(n*);printf(n请选择(15)); a=getch();switch(a) case1:create();break;case2:viewrun();break;case3:huanchu();break;case4:kill();break;case5:exit(0);default:n=0; 五:实验结果:任务二、单处理机系统的进程调度一、实验目的:1、加深对进程概念的理解,明确进程和程序的区别2、深入了解系统如何组织进程,创建进程3、进一步认识如何实现处理机调度二、实验内容:从下面四个调度算法中,选择一个调度算法来实现进程调度:1、先来先服务调度算法2、优先数调度算法3、时间片轮法调度算法4、多级反馈队列轮转调度算法三、结构框图:四、实验代码:#include stdio.h #include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else /* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /* 插入进程优先数最低,则插入到队尾*/ first=first-link; second=second-link; if(insert=0) first-link=p; void input() /* 建立进程控制块函数*/ int i,num; printf(n请输入进程数量:); scanf(%d,&num); for(i=1;iname); printf(n 输入进程优先数:); scanf(%d,&p-super); printf(n 输入进程运行时间:); scanf(%d,&p-ntime); printf(n); p-rtime=0;p-state=w; p-link=NULL; sort(); /* 调用sort函数*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); void show()printf(nqnametstatetsupertndtimetruntimen); void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf( %st,pr-name); printf( %ct,pr-state); printf( %dt,pr-super); printf( %dt,pr-ntime); printf( %dt,pr-rtime); printf(n); void check() /* 建立进程查看函数 */ PCB* pr; printf(n*当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ show();disp(p); pr=ready; if(pr=NULL)printf(n*当前就绪队列为空!);else printf(n*当前就绪队列状态为:); /*显示就绪队列状态*/show();while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程%s已完成.n,p-name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else (p-super)-; p-state=w; sort(); /*调用sort函数*/ void main() /*主函数*/ int len,h=0; char ch; input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n 当前运行次数为:%d n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(n 按任一键继续.); ch=getchar(); printf(nn 进程已经完成.n); ch=getchar(); 五:实验结果:任务三、基本存储器管理一、实验目的:一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下怎样实现主存的分配和回收二、实验内容:从下两种存储管理方式的主存分配和回收中,选择一种管理方式来实现本次实验任务:1、在可变(动态)分区管理方式下,采用最先适应算法2、在分页式管理方式下,采用位示图来表示主存的分配情况和回收情况三、结构框图:四、实验代码:#include#includestruct linkkint size;int addr;struct linkk *next;struct jobtabint jno;int size;int addr;int flag;struct linkk *PL,*p,*q,*p1;struct jobtab tab20;int l,m,n,t,addr,length;void printlink()if (PL!=NULL)printf(n 进程内存大小 剩余内存n);printf(-n);q=PL;while(q!=NULL)printf( %d %dn,q-addr,q-size);q=q-next; printf(-n);return;void printtab()int i; int flag=0;for (i=0;i20&flag=0;i+)if (tabi.flag=1)flag=1;if (flag=0)printf(n 无进程!);return;printf(n 进程编号 进程起始地址 进程内存大小n);printf(-n);for (i=0;isize=l)tabn.addr=q-addr;p1=q;if (p1=PL) PL=q-next;else p-next=q-next;free(p1);return;if (q-sizel)tabn.addr=q-addr;q-size=q-size-l; q-addr=q-addr+l;return;p=q; q=q-next;tabn.flag=0;printf(n 没有内存剩余!n);return;void freem()printf(n 输入进程编号:); scanf(%d,&n); if(tabn.flag=0)printf(n 不是该进程!); return; addr=tabn.addr; length=tabn.size; tabn.flag=0; q=PL;if (q=NULL)|(addr+lengthaddr)p1=(struct linkk *)malloc(sizeof(struct linkk); p1-size=length; p1-addr=addr; p1-next=q; PL=p1;return;if(addr+length=q-addr)q-addr=addr; q-size=q-size+length; return;p=q; q=q-next;while (q!=NULL)if(p-addr+p-size=addr)p-size=p-size+length;if (addr+length=q-addr)p-size=p-size+q-size;p1=q; p-next=q-next;free(p1);return;if(addr+length=q-addr)q-addr=addr; q-size=q-size+length; return; if(addr+lengthaddr)p1=(struct linkk *)malloc(sizeof(struct linkk); p1-size=length; p1-addr=addr; p1-next=q; p-next=p1; return;p=q; q=q-next; if(p-addr+p-size=addr)p-size=p-size+length; return; p1=(struct linkk *)malloc(sizeof(struct linkk); p1-addr=addr; p1-size=length; p1-next=NULL; p1-next=p1; return; main()PL=(struct linkk *)malloc(sizeof(struct linkk); PL-addr=0; PL-next=NULL; printf(n输入内存大小:); scanf(%d,&n); PL-size=n; for(int i=0;i20;i+)tabi.jno=i; tabi.flag=0; t=0; doprintf(n-n); printf( 1-分配内存 2-释放内存n); printf( 3-链接进程号 4-输出_TAB n); printf( 5-Quitn); printf(n-n); printf( Select bb); scanf(%d,&m); switch(m)case 1: allocm();break;case 2: freem();break;case 3: printlink();break;case 4: printtab();break;case 5: t=1;while (!t);五:实验结果:任务四、请求分页存储管理(虚拟存储)一、实验目的:通过请求分页存储管理的设计,让学生了解虚拟存储器的概念和实现方法。进行运行时不需要将所有的页面都调入内存,只需将部分调入内存,即可运行,在运行的过程中若要访问的页面不在内存时,则需求有请求调入的功能将其调入。假如此时若内存没有空白物理块,则通过页面置换的功能将一个老的不用的页面淘汰出来,其中淘汰的算法有多种二、实验内容:模拟仿真请求分页调度算法,其中淘汰的算法可选下列其一1、先进先出算法2、最近最久算法3、CLOCK算法三、结构框图:四、实验代码:#include#includeusing namespace std;const int MaxNum=320;const int M=5;int PageOrderMaxNum;int SimulateMaxNumM;int PageCountM,LackNum;float PageRate;int PageCount132;bool IsExit(int i)bool f=false;for(int j=0;jM;j+)if(Simulatei-1j=PageOrderi)f=true;return f;int IsExitLRU(int i)int f=-1;for(int j=0;jM;j+)if(Simulatei-1j=PageOrderi)f=j;return f;int Compare() int p,q;p=PageCount0;q=0;for(int i=1;iM;i+)if(pPageCounti)p=PageCounti;q=i;return q;void Init() for(int k=0;kMaxNum;k+)int n=rand()%320;PageOrderk=n/10;for(int i=0;iMaxNum;i+)for(int j=0;jM;j+)Simulateij=-1;for(int q=0;qM;q+)PageCountq=0;void OutPut()int i,j;cout页面访问序列:endl;for(j=0;jMaxNum;j+)coutPageOrderj ;coutendl;cout页面访问过程(只显示前10个):endl;for(i=0;i10;i+)for(j=0;jM;j+)if(Simulateij=-1)cout ;elsecoutSimulateij ;coutendl;cout缺页数= LackNumendl;cout命中率= PageRateendl;cout-endl; void FIFO()int j,x=0,y=0;LackNum=0,Init();for(j=0;jM;j+)for(int k=0;k=j;k+)if(j=k)Simulatejk=PageOrderj;elseSimulatejk=Simulatej-1k; ;for(x=M;xMaxNum;x+)for(int t=0;tM;t+)Simulatext=Simulatex-1t;if(!IsExit(x)LackNum+;Simulatexy%M=PageOrderx;y+;PageRate=1-(float)LackNum/(float)MaxNum);OutPut();void LRU()int j,x=0,y=0;LackNum=0,Init();for(j=0;jM;j+)for(int k=0;k=j;k+)PageCountk+;if(j=k)Simulatejk=PageOrderj;elseSimulatejk=Simulatej-1k; LackNum+;for(x=M;xMaxNum;x+)for(int t=0;tM;t+)Simulatext=Simulatex-1t;int p=IsExitLRU(x);if(p=-1)int k;k=Compare();for(int w=0;wM;w+)if(w!=k)PageCountw+;elsePageCountk=1;Simulatexk=PageOrderx;LackNum+;elsefor(int w=0;wM;w+)if(w!=p)PageCountw+;elsePageCountp=1;PageRate=1-(float)LackNum/(float)MaxNum);OutPut();void YourChoice(int choice)switch(choice)case 1:cout-endl; coutFIFO算法结果如下:endl;FIFO();break;case 2:cout-endl; coutLRU算法结果如下:endl;LRU();break;case 5:break;default:cout重新选择算法:1-FIFO 2-LRU 5-退出 choice;YourChoice(choice);void main()int choice,i=1;while(i)cout请选择算法:1-FIFO 2-LRU 5-退出 choice;if(choice=5)i=0;elseYourChoice(choice);五:实验结果:任务五、死锁的避免一、实验目的:在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险死锁。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进我们可以在分配资源时加上限制条件就可以预防死锁,但是,在每一种预防死锁的方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能二、实验内容:利用银行家算法来避免死锁的发生三、结构框图:四、实验代码:#include#include#includeusing namespace std;int Sign100;/标记数组int Progress100;/进程执行顺序标记数组string Number100;/进程号class BankerArithmeticpublic:BankerArithmetic(int a,int b); /构造函数int Safe(int grac);/判断是否安全void Show();/显示相关信息void Bank();/计算剩余资源量BankerArithmetic();/析构函数private:BankerArithmetic();void Init(int a,int b);/初始化int ID;/记录成功申请资源的进程号int n; /包含的进程数int m; /资源种类数int *Available;/可提供的资源总数int * Allocation;/以分配的资源int * Need;/仍需要的资源int *Left;/剩余的资源;BankerArithmetic:BankerArithmetic(int a,int b):n(a),m(b)Init(n,m);BankerArithmetic:BankerArithmetic()int i;deleteAvailable;deleteLeft;for(i=0;in;i+)deleteAllocationi;deleteAllocation;for(i=0;in;i+)deleteNeedi;deleteNeed;void BankerArithmetic:Init(int a,int b)int i,j;for(i=0;i100;i+)Signi=-1;Available=new intb;/Availablede的申请Left=new intb;/Left的申请Allocation=new int*a;/Allocation的申请for(i=0;ia;i+)Allocationi=new intb;Need=new int*a;/Need的申请for(i=0;ia;i+)Needi=new intb;cout请输入可用资源Available:endl;for(i=0;iAvailablei;cout请输入进程号:endl;for(i=0;iNumberi;cout请输入分配资源矩阵Allocation:(a,b)endl; for(i=0;ia;i+)for(j=0;jAllocationij;cout请输入仍需要资源矩阵Need:(a,b)endl; for(i=0;ia;i+)for(j=0;jNeedij;/计算剩余的资源for(i=0;im;i+)Lefti=Availablei;j=0;while(jm)for(i=0;in;i+)Leftj-=Allocationij;j+;int BankerArithmetic:Safe(int grac) int i,j,temp;for(i=0;in;i+)if(Signi!=1)temp=1;for(j=0;j=Needij)temp*=1;elsetemp*=0;if(temp=1)break;ID=i;Signi=1;Progressgrac=ID;if(temp)return ID;elsereturn -1;void BankerArithmetic:Bank()for(int i=0;im;i+)Lefti=Lefti+AllocationIDi; void BankerArithmetic:Show()int i,j;cout进程 Allocation Need n;for(i=0;in;i+)if(Signi!=1)coutNumberi ;for(j=0;jm;j+)cout Allocationij;cout ;for(j=0;jm;j+)cout Needij;coutendl;coutendl;for(i=0;im;i+)coutLefti ;coutendl;int main()int process,source,result,i=0,sum=1;char ans1,ans2;coutprocess;coutsource;BankerArithmetic banker(process,source);while(iprocess)coutans1;if(ans1=y|ans1=Y)banker.Show();result=banker.Safe(i);if(result=0)Progressi=result;elsesum=0;cout处于不安全状态!程序将退出!n; exit(1);cout按空格键程序执行一次endl; while(cin.get(ans2)&ans2=n)banker.Bank();i+;if(sum=1)cout进程执行的顺序如下:;for(i=0;iprocess-1;i+)coutNumberProgressi ; coutNumberProgressprocess-1;return 0;五:实验结果:任务六、磁盘空间的分配与回收一、实验目的:磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和收回算法二、实验内容:模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。从下题目中选择一题来实现设备的管理:1、连续的磁盘存储空间的分配和回收2、用位示图管理磁盘存储空间3、模拟UNIX系统的空闲块组链接法,实现磁盘存储空间的管理三、结构框图:分配框图 否 是 是 否 否 是回收框图 四、实验代码:#include #include void Initbitmap(int map88)int cylinder,track,sector;char choice=Y;printf(初始化位视图.n);while(choice=y|choice=Y)printf(柱面号:);scanf(%d,&cylinder);printf(磁道号:);scanf(%d,&track);printf(物理记录号:);scanf(%d,§or);mapcylinder4*track+sector=1;printf(contiune?);getchar();scanf(%c,&choice);void allocate(int map88)int i,j;int flag=0;int cylinder,track,sector;for(i=0;i8;i+) for(j=0;j8;j+)if(mapij=0) mapij=1;flag=1;break;if(flag=1) break;if(flag=1)cylinder=i;track=j/4;sector=j%4;printf(分配到的柱面号、磁道号、物理记录数);printf(%dt%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论