一、实验目的
(1)了解进程实体PCB结构;
(2)理解进程不同状态和状态之间的转换过程;
(3)掌握优先数的调度算法和先来先服务算法;
二、实验内容与要求
设计一个有 N个进程共行的进程调度程序
四、实验步骤
(1)实验设计
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
#includeusing namespace std; #define getpch(type) (type *)malloc(sizeof(type)) int t = 0; struct pcb { char name[10]; //进程名 char state; //W/R/F int super; //优先数 int ntime; //总运行时间 int rtime; //已耗时 int arrive_time; //到达时间 struct pcb* link; } *ready = NULL, * p; typedef struct pcb PCB; int suanfa; void sort() { //优先集排序 p->link = NULL; if (ready == NULL) ready = p; else {//分saunfa =1和saunfa =2两种情况 既分算法为 //采用最高优先数优先的调度算法和先来先服务算法。 if (p->super > ready->super&&suanfa==1) { p->link = ready; ready = p; } else { PCB* f = ready; while (1) { if (f->link == NULL) { f->link = p; return; } else if (p->super > f->link->super && suanfa == 1) { PCB* s = f->link; f->link = p; p->link = s; return; } else if (p->arrive_time < f->link->arrive_time&&suanfa == 2) { PCB* s = f->link; f->link = p; p->link = s; return; } f = f->link; } } } } void input() { //输入 srand((unsigned)time(NULL)); int n; cout << "请输入进程数目:"; cin >> n; int time = 1; for (int i = 0; i < n; i++) { p = getpch(PCB); cout << "请分别输入进程名、进程优先数、运行时间:"; cin >> p->name >> p->super >> p->ntime; p->state = 'W'; p->rtime = 0; p->arrive_time = time; time++; sort(); } } void disp(PCB* pr) { //输出模板 cout << "进程名:" << pr->name << " "; cout << "进程状态:" << pr->state << " "; cout << "进程优先数:" << pr->super << " "; cout << "进程总运行时间:" << pr->ntime << " "; cout << "进程到达时间:" << pr->arrive_time << " "; cout << "进程已经耗时:" << pr->rtime << endl; } void check() { //输出 cout << "-------------------" << " 正在运行中的进程 " << "------------------------------" << endl; disp(p); cout << "-------------------" << " 就绪队列中的进程 " << "------------------------------" << endl; PCB* pr = ready; while (pr != NULL) { disp(pr); pr = pr->link; } } void destroy() { /*建立进程撤消函数*/ cout << "进程" << p->name << "运行完成,耗时" << p->ntime << "个CPU时间片" << endl; free(p); p = NULL; } void PSAandFCFS() { //主要运行函数 p = ready; ready = ready->link; t++; cout << endl << "这是第" << t << "个CPU时间片" << endl; p->state = 'R'; check(); p->rtime++; if (p->ntime == p->rtime) destroy(); else { p->super -= 1; p->state = 'W'; sort(); } if (p == NULL && ready == NULL) cout << "全部完成,共耗时" << t << "个CPU时间片" << endl; } int main() { /*主函数*/ cout << "请输入你想使用的算法 输入 1 表示最高优先级优先算法 输入 2 表示先来先服务算法"< > suanfa; input(); while (p != NULL || ready != NULL) PSAandFCFS(); return 0; }
五、实验结果与分析
1.测试数据及结果
第一组数据 选择算法2 既先来先运行算法 4组数据
第二组数据 采用算法1 既优先级优先算法 4组数据
1 4
a 1 1
b 3 2
c 2 3
d 10 1
第三组数据 采用算法1 既优先级优先算法 3组数据
1 3
a 3 2
b 8 1
c 1 3