标签:
一. 目的和要求 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