进程调度实验报告
2)详细设计
优先权调度算法: 1、设定系统中有五个进程,每一个进程用一个进程控制块( PCB) 表示,进程队列采 用链表数据结构。 2、 进程控制块包含如下信息:进程名、优先数、需要运行时 间、已用CPU时间、进程状态等等。 3、 在每次运行设计的处理调度程序之前,由终端输入五个进程 的“优先数”和“要求运行时间”。 4、 进程的优先数及需要的运行时间人为地指定.进程的运行时 间以时间片为单位进行计算。 5、 采用优先权调度算法,将五个进程按给定的优先数从大到小 连成就绪队列。用头指针指出队列首进程,队列采用链表结 构。 6、 处理机调度总是选队列首进程运行。采用动态优先数办法, 进程每运行一次优先数减“1”,同时将已运行时间 加“1”。 7、 进程运行一次后,若要求运行时间不等于已运行时间,则再 将它加入就绪队列;否则将其状态置为“结束”,且退出就
} void check() /* 建立进程查看函数 */ { PCB* pr; printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前 运行进程*/ disp(p); pr=ready; printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/ 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 youxian() { // 高优先级优先算法的程序入口
for(i=0;i<5;i++) { printf("\n 进程号No.%d:\n",i); p=getpch(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函数*/ } } int space() //计算进程控制块的个数 { int l=0; PCB* pr=ready; while(pr!=NULL) { l++; pr=pr->link; } return(l); } void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ { printf("\n qname \t state \t super \t ndtime \t runtime \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");
//轮转法演示进程的程序入口
五)调试结果
1.一运行程序,则显示一个友好的界面,上面有实验者的实验题目,班 级,姓名,学号,及完成实验的日期
2.按任意键进入程序,里面有几个可以选择的操作:
3. 选择1.进入最高优先数优先算法的演示,此时输入5个进程的 名,优先级以及运行时间
4.此后,每按一次回车键,相当于队列首进程运行了一个cpu 的时间,运行完毕后,如果要求运行时间不等于已运行时 间,则再将它加入就绪队列;否则将其状态置为“结束”, 且退出就绪队列。第一次运行程序时的正在运行的进程以 及等待队列中的进程的各信息如下:
实验一 进程调度
一.实验题目:
编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算 法对五个进程进行调度。
二:实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及 进程调度算法的理解.
三.实验内容: <一>最高优先级优先调度算法 1)优先级简介
动态优先数是指在进程创建时先确定一个初始优先数, 以后在进 程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先 数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为 最高而得到CPU运行。 例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待 的时间超过某一时限时增加其优先数的值,等等。
绪队列。 8、 “就绪”状态的进程队列不为空,则重复上面6,7步骤,直 到所有进程都成为“结束”状态。 9、 在设计的程序中有输入语句,输入5个进程的“优先 数”和“要求运行时间”,也有显示或打印语句,能显示或 打印每次被选中进程的进程名、运行一次后队列的变化,以 及结束进程的进程名。 10、最后,为五个进程任意确定一组“优先数”和“要求运行时间”, 运行并调试所设计的程序,显示或打印出逐次被选中进程的进程名 及其进程控制块的动态变化过程。
int len,h=0; char ch; system("cls"); input(); len=space(); while((len!=0)&&(ready!=NULL)) { ch=getchar(); h++; printf("\n The execute number:%d \n",h); p=ready; ready=p->link; p->link=NULL; p->state='R'; check(); running(); printf("\n 按任一键继续......"); } printf("\n\n 进程已经完成.\n"); ch=getchar(); } void menu() //菜单 {int m; system("cls"); printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t进程调度演示\n"); printf("\t\t*********************************************\t\t\n"); printf("\n\n\n\t\t\t1.演示最高优先数优先算法."); printf("\n\t\t\t2.演示轮转法算法."); printf("\n\t\t\t0.退出程序."); printf("\n\n\t\t\t\t选择进程调度方法:"); scanf("%d",&m); switch(m) {case 1: youxian(); //高优先级优先算法的程序入口 system("cls");
3)流程图:
图一.最高优先级优先调度算法流程图
பைடு நூலகம்
4)源程序:
#include "stdio.h" #include <stdlib.h> #include <conio.h> #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; }*ready=NULL,*p; typedef struct pcb PCB; void inunization() { //初始化界面
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; system("cls"); /*清屏*/ printf("\n 请输入五个进程信息:\n");