计算机操作系统教程(第三版)
{
disp(pr); pr=pr->link; } }
destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ {
printf(\进程 [%s] 已完成.\\n\ free(p); }
running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ {
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 调用destroy函数*/ else {
(p->super)--; p->state='w';
sort(); /*调用sort函数*/ } }
main() /*主函数*/ {
int len,h=0; char ch; input(); len=space();
while((len!=0)&&(ready!=NULL)) {
ch=getchar(); h++;
printf(\ p=ready;
ready=p->link; p->link=NULL; p->state='R'; check(); running();
printf(\按任一键继续......\ ch=getchar(); }
printf(\进程已经完成.\\n\ ch=getchar(); }
计算机操作系统教程(第三版)
修改之后:
#include \ #include
#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0
struct pcb { /* 定义进程控制块PCB */ char name[10]; char state; /*状态*/ int super; /*优先级*/ int ntime; int rtime;
struct pcb* link; /*结构体pcb的指针类型*/ }*ready=NULL,*p;/*指向当前用行的pcb*/ 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;
//clrscr(); /*清屏*/
printf(\请输入进程个数:\ scanf(\ for(i=0;i
int space() {
int l=0; PCB* pr=ready; while(pr!=NULL) { l++; pr=pr->link; }
return(l); }
disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ {
printf(\ printf(\ printf(\ printf(\
计算机操作系统教程(第三版)
printf(\ printf(\ printf(\ }
check() /* 建立进程查看函数 */ {
PCB* pr;
printf(\当前正在运行的进程是:%s\显示当前运行进程*/ disp(p); pr=ready;
printf(\当前就绪队列状态为:\\n\显示就绪队列状态*/ while(pr!=NULL) { disp(pr); pr=pr->link; } }
destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ {
printf(\进程 [%s] 已完成.\\n\ free(p); }
running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ {
(p->rtime)++;
if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else { (p->super)--; p->state='w'; sort(); /*调用sort函数*/ } }
main() /*主函数*/ {
int len,h=0; char ch; input(); len=space();
while((len!=0)&&(ready!=NULL)) { ch=getchar();
计算机操作系统教程(第三版)
h++; printf(\ p=ready; ready=p->link; p->link=NULL; p->state='R'; check(); running(); printf(\按任一键继续......\ ch=getchar(); }
printf(\进程已经完成.\\n\ ch=getchar(); }
实验二、银行家算法
(一) 目的和要求
银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验要求用高级语言编写一个银行家的模拟算法。通过本实验可以对预防死锁和银行家算法有更深刻的认识。 (二) 实验内容
1、 设置数据结构
包括可利用资源向量(Availiable),最大需求矩阵(Max),分配矩阵(Allocation),需求矩阵(Need) 2、 设计安全性算法
设置工作向量Work 表示系统可提供进程继续运行可利用资源数目,Finish 表示系统是否有足够的资源分配给进程
(三) 实验环境
1、 pc 2、 vc++ (四)、程序源代码:
/*子函数声明*/
int Isprocessallover(); //判断系统中的进程是否全部运行完毕 void Systemstatus(); //显示当前系统中的资源及进程情况 int Banker(int ,int *); //银行家算法
void Allow(int ,int *); //若进程申请不导致死锁,用此函数分配资源 void Forbidenseason(int ); //若发生死锁,则显示原因
/*全局变量*/
int Availiable[3]={3,3,2}; //初始状态,系统可用资源量 int Max[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
//各进程对各资源的最大需求量
int Allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
//初始状态,各进程占有资源量
int Need[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};