1、操作系统课程设计指导书 2018-9-27操作系统课程设计实验报告姓 名: 李文孝 班 级: 12 计科 2 班 学 号: 201210510205 指导老师: 王燕红、汤可宗 景德镇陶瓷学院操作系统课程设计指导书 2018-9-27目录任务一、进程创建、控制与撤消 .1一、目的: 1二、内容: 1三、程序框图 2四、源代码 3五、运行结果 7任务二、单处理机系统的进程调度 .11一、目的: 11二、程序框图 11三、源代码 12四、实验结果 17任务五、死锁的避免 19一、目的 19二、内容 19三、程序框图 19五、实验结果 25任务六、磁盘空间的分配与回收 26一、目的: 26二、内容
2、26三、进程框图 27四、源代码 28四、实验结果 31操作系统课程设计指导书 2018-9-271任务一、进程创建、控制与撤消一、目的:1、 加深对进程概念的理解,明确进程和程序的区别;2、 进一步认识并发执行的概念,区别顺序执行和并发执行;3、 分析进程争用临界资源的现象,学习解决进程互斥的方法;二、内容:1、编写一程序,来模拟进程的创建和撤消,要求通过终端键盘输入三、四作业的名称、大小、优先级等。系统为它创建进程,并把进程控制块 PCB 的内容送到终端显示器上输出。2、同时模拟内存空间为作业分配内存空间,并把结果用图形形象地表示出来,同样通过终端输出。3、按进程的优先级的顺序撤消进程,同
3、时通过终端显示 PCB 的撤消过程和内存的释放过程。操作系统课程设计指导书 2018-9-272三、程序框图操作系统课程设计指导书 2018-9-273四、源代码#include “conio.h“#include “stdio.h“#include “stdlib.h“struct jincheng_type int pid;int youxianji;int daxiao;int msg;int live;struct jincheng_type neicun20,waicun20;int shumu=0,pid_1;create()if(shumu=20)printf(“n 内存已满,请
4、先结束或换出进程 n“);elseprintf(“n 请输入第%d 个进程 n“,shumu+1); printf(“n 请输入进程的 pidn“);scanf(“%d“, printf(“n 请输入新的进程的优先级n“); scanf(“%d“,printf(“ 请输入新的进程的大小n“);scanf(“%d“,操作系统课程设计指导书 2018-9-274printf(“ 请输入新的进程的消息n“);scanf(“%d“, neicunshumu+1.live=1; shumu+;return neicunshumu-1.live;void viewrun()int vpid;printf(
5、“n 请输入进程的 pidn“);scanf(“%d“,if(vpid0waicun20.youxianji=neicunpid1.youxianji;waicun20.daxiao=neicunpid1.daxiao;waicun20.msg=neicunpid1.msg;neicunpid1.pid=neicunpid2.pid;neicunpid1.youxianji=neicunpid2.youxianji;neicunpid1.daxiao=neicunpid2.daxiao;neicunpid1.msg=neicunpid2.msg;neicunpid2.pid=waicun20.
6、pid; neicunpid2.youxianji=waicun20.youxianji; neicunpid2.daxiao=waicun20.daxiao; neicunpid2.msg=waicun20.msg;printf(“n 替换完成n“);printf(“n 被替换进程的 pid 是:%dn“,waicun20.pid);printf(“n 被替换进程的 youxianji 是:%dn“,waicun20.youxianji);printf(“n 被替换进程的 daxiao 是:%dn“,waicun20.daxiao);printf(“n 被替换进程的 msg 是:%dn“,w
7、aicun20.msg);elseprintf(“n 进程优先级不够大“);操作系统课程设计指导书 2018-9-276elseprintf(“所查看运行进程不存在“); printf(“请按回车退出换出进程n“);c=getch();void kill()int kpid;printf(“n 请输入进程的 pidn“);scanf(“%d“,if(kpid0 char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void sort() /*
8、建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else /* 进程比较优先级,插入适当的位置中*/ 操作系统课程设计指导书 2018-9-2713first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=se
9、cond; 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“, for(i=1;iname); 操作系统课程设计指导书 2018-9-2714printf(“n 输入进程优先数:“); scanf(“%d“, printf(“n 输入进程运行时间
10、:“); scanf(“%d“, 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(“
11、 %ct“,pr-state); printf(“ %dt“,pr-super); 操作系统课程设计指导书 2018-9-2715printf(“ %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*当前就绪队列状态为:“);
12、/* 显示就绪队列状态*/show();while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(“n 进程%s已完成.n“,p-name); free(p); 操作系统课程设计指导书 2018-9-2716void running() /* 建立进程就绪函数 (进程运行时间到,置就绪状态*/ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用 destroy 函数*/ else (p-super)-; p-state=w; sort(
13、); /*调用 sort 函数*/ void main() /*主函数*/ int len,h=0; char ch; input(); len=space(); while(len!=0) h+; printf(“n 当前运行次数为:%d n“,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); 操作系统课程设计指导书 2018-9-2717printf(“n 按任一键继续“); ch=getchar(); printf(“nn 进程已经完成 .n“); ch=getchar(); 四、实验结果操作系统
14、课程设计指导书 2018-9-2718操作系统课程设计指导书 2018-9-2719任务五、死锁的避免一、目的在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险死锁。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace) ,当进程处于这种状态时,若无外力作用,他们都无法在向前推进。我们可以在分配资源时加上限制条件就可以预防死锁,但是,在每一种预防死锁的方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。二、内容利用银行家算法来避免死锁的发
15、生三、程序框图 开始计算剩余资源量显示信息show()初始化Init()主函数main()结束已分配资源Allocation判断是否安全Safe程序所需济源Need操作系统课程设计指导书 2018-9-2720四、源代码#include#include#includeusing namespace std;int Sign100;/标记数组int Progress100;/进程执行顺序标记数组string Number100;/进程号class BankerArithmeticpublic:BankerArithmetic(int a,int b); /构造函数int Safe(int gra
16、c);/判断是否安全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
17、 b):n(a),m(b)Init(n,m);BankerArithmetic:BankerArithmetic()int i;操作系统课程设计指导书 2018-9-2721deleteAvailable;deleteLeft;for(i=0;iAvailablei;coutNumberi;coutAllocationij;coutNeedij;/计算剩余的资源for(i=0;i=Needij)temp*=1;elsetemp*=0;if(temp=1)break;操作系统课程设计指导书 2018-9-2723ID=i;Signi=1;Progressgrac=ID;if(temp)retur
18、n ID;elsereturn -1;void BankerArithmetic:Bank()for(int i=0;iprocess;coutsource;BankerArithmetic banker(process,source);while(ians1;if(ans1=y|ans1=Y)banker.Show();result=banker.Safe(i);if(result=0)Progressi=result;elsesum=0;cout “; cout#include void Initbitmap(int map88)int cylinder,track,sector;char choice=Y;printf(“初始化位视图.n“);while(choice=y|choice=Y)开始J:=归还块号MA0=3?i:=MA0MAi: =jMA0: =MA0+1MAj:=MAMA0: =1MA1: =j结束