标签:
一. 目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 1.2. 实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序。 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。 (1). 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 (2). 进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。 (3). 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。 (4). 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 (5). 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。 (6). 每进行一次调度程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。 (7). 重复以上过程,直到所要进程都完成为止。 思考:作业调度与进程调度的不同? 1.2.2实验题A:编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N(N不小于5)个进程进行调度。 “最高优先级优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。 (1). 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 (2). 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定规则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1,并且进程等待的时间超过某一时限(2个时间片时间)时增加其优先数等。
#include<stdio.h> #include<stdlib.h> #include<time.h> struct Pcb{ int id; //识别码 char* pname; //进程名 int priority; //优先级 int arrtime; //到达时间 int reqtime; //运行时间 int usetime; //使用CPU时间 char* statio; //进程的状态 } Pcb[24]; int systime=0; //优先级排序 void sort(int n) { int i,j; struct Pcb temp; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) if(Pcb[i].priority<Pcb[j].priority) //根据优先级排序 { temp=Pcb[i]; Pcb[i]=Pcb[j]; Pcb[j]=temp; } } void putresult(int n){ int i; printf("\nid 进程名 进程优先级 进程到达时间 进程使用CPU时间 进程运行时间 进程状态\n"); for(i=1; i<=n; i++) { printf("%d%5s%10d%12d%12d%15d%17s\n",Pcb[i].id,Pcb[i].pname, Pcb[i].priority,Pcb[i].arrtime, Pcb[i].usetime,Pcb[i].reqtime,Pcb[i].statio); } } //伪随机数的产生数据 int Pseudo_random_number() { int i,n; srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 //输入进程数 n=rand()%5+2; for(i=1; i<=n; i++) { //唯一识别码 Pcb[i].id=i; //进程名 Pcb[i].pname="pcb"; //进程优先级 Pcb[i].priority=rand()%9+1; //进程到达时间 Pcb[i].arrtime=rand()%29+1; //进程运行完成所需时间 Pcb[i].reqtime=rand()%7+1; //进程使用CPU时间 Pcb[i].usetime=0; //进程状态 Pcb[i].statio="ready"; } putresult(n); return n; } //进行CPU调用 void CPURun(int n) { int i; while(n!=0){ for(i=1;i<=n;i++) { Pcb[i].priority-=1; Pcb[i].reqtime-=1; Pcb[i].usetime+=1; Pcb[i].statio="Runing"; if(Pcb[i].reqtime!=0){ sort(n); putresult(n); }else{ Pcb[i].statio="Finish"; putresult(n); break; } } n--; } } main() { printf("\t\t\t\t随机产生进程\n"); int n=Pseudo_random_number(); printf("\t\t\t进程的个数为%d\n",n); sort(n); printf("\t\t\t进行优先级的排序\n"); putresult(n); CPURun(n); return 0; }
标签:
原文地址:http://www.cnblogs.com/zlcan/p/5487734.html