这是我们操作系统实验课的一个实验程序,模拟简单的若干个进程在执行态和就绪态之间的变动。
我根据实验指导书上给出的程序进行了一点修改。
#include<cstdio> #include<cstdlib> struct PCB { char name[10]; char state; //状态 int super; //优先级 int ntime; //预计运行时间 int rtime; //实际运行时间 PCB *link; }*ready=NULL, *p; void disp(PCB *pr) /*建立进程显示函数,用于显示当前进程 */ { printf("\n qname \t state \t super \t ntime \t rtime \n"); printf("|%s \t ",pr->name); printf("|%c \t ",pr->state); printf("|%d \t ",pr->super); printf("|%d \t ",pr->ntime); printf("|%d \t ",pr->rtime); printf("\n"); } void check() /* 建立进程查看函数 */ { printf("\n ******** 当前正在运行的进程是:%s",p->name); /* 显示当前运行进程 */ disp(p); printf("\n ******** 当前就绪队列状态为:\n"); /* 显示就绪队列状态 */ PCB *pr=ready; while(pr!=NULL) disp(pr), pr=pr->link; } void sort() /* 建立对进程进行优先级排列函数 */ { if(ready==NULL || (p->super)>(ready->super)) /* 优先级最大者,插入队首 */ { p->link=ready; ready=p; } else /* 进程比较优先级,插入适当的位置中 */ { PCB *first=ready, *second=first->link; while(second!=NULL) { if((p->super)>(second->super)) /* 若插入进程比当前进程优先数大,插入到当前进程前面 */ { first->link=p; p->link=second; return; } first=first->link; second=second->link; } first->link=p; } } void input() /* 建立进程控制块函数 */ { system("cls"); printf("\n 请输入进程数目?"); int num; scanf("%d",&num); for(int i=0;i<num;i++) { printf("\n 进程号 No.%d:\n",i); p=(PCB *)malloc(sizeof(PCB)); printf("\n 输入进程名:"); scanf("%s",p->name); 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 函数 */ } system("cls"); printf("\n ******** 进程创建如下:\n"); PCB *pr=ready; while(pr!=NULL) disp(pr), pr=pr->link; } inline void destroy() /*建立进程撤消函数(进程运行结束,撤消进程) */ { printf("\n 进程 [%s] 已完成.\n",p->name), free(p); } inline void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态) */ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 调用 destroy 函数 */ else --(p->super), p->state=‘w‘, sort(); } int main() /*主函数*/ { input(); int h=0; while(ready!=NULL) { getchar(); printf("\n The execute number:%d \n",++h); p=ready; ready=p->link; p->link=NULL; p->state=‘r‘; check(); running(); printf("\n 按任意键继续......"), getchar(); } printf("\n\n 进程已经全部完成.\n"); getchar(); return 0; } /* 3 A 3 5 B 2 3 C 1 4 */
原文地址:https://www.cnblogs.com/dilthey/p/10804896.html
时间: 2024-10-10 18:09:42