计算机操作系统课程设计源代码《通用处理机调度演示程序源代码》

更新时间:2023-10-13 12:11:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《通用处理机调度演示程序源代码》

//短作业优先算法 #define MaxNum 100 #include #include #include struct Process_struct{

int Number; //进程编号 char Name[MaxNum]; //进程名称

int ArrivalTime; //到达时间

int ServiceTime; //开始运行时间 int FinishTime; //运行结束时间 int WholeTime; //运行时间

int run_flag; //调度标志

int order; //运行次序

double WeightWholeTime; //周转时间

double AverageWT_FCFS,AverageWT_SJF; //平均周转时间

double AverageWWT_FCFS,AverageWWT_SJF; //平均带权周转时间 }Process[MaxNum];

int N; //实际进程个数 int SJF(); //短作业优先 int SJF(){ //短作业优先算法

int temp_time=0; //当期那时间 int i=0,j;

int number_schedul,temp_counter; //进程编号,当前已执行进程个数 float run_time;

run_time=Process[i].WholeTime; j=1;

while((j

有两个进程同时到达

{

if(Process[j].WholeTime

e;

}

{ } j++;

run_time=Process[i].WholeTime; i=j;

//查找下一个被调度的进程

//对找到的下一个被调度的进程求相应的参数

number_schedul=i;

Process[number_schedul].ServiceTime=Process[number_schedul].ArrivalTim

Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime

+Process[number_schedul].WholeTime;

Process[number_schedul].run_flag=1;

temp_time=Process[number_schedul].FinishTime;

Process[number_schedul].order=1;

temp_counter=1; while(temp_counter

for(j=0;j

for(j=0;j

if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].run_flag))

if(Process[j].WholeTime

run_time=Process[j].WholeTime;

if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].run_flag)) { }

run_time=Process[j].WholeTime; number_schedul=j; break;

}

}

number_schedul=j;

//查找下一个被调度的进程

//对找到的下一个被调度的进程求相应的参数

Process[number_schedul].ServiceTime=temp_time;

Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime

+Process[number_schedul].WholeTime; }

int Pinput(); //进程参数输入 int Poutput(); //调度结果输出 int Pinput() //进程参数输入 {

int i;

printf(\请输入进程个数:\\n\scanf(\for(i=0;i

printf(\printf(\请输入一个进程:\\n\printf(\请输入进程名称:\\n\scanf(\

Process[number_schedul].run_flag=1;

temp_time=Process[number_schedul].FinishTime; temp_counter++;

Process[number_schedul].order=temp_counter;

}return 0;

printf(\请输入到达时间:\\n\

scanf(\printf(\请输入服务时间:\\n\

scanf(\

}

Process[i].ServiceTime=0; Process[i].FinishTime=0; Process[i].WeightWholeTime=0; Process[i].order=0; Process[i].run_flag=0;

}return 0;

int Poutput() //调度结果输出 {

int i;

float turn_round_time=0,f1,w=0;

printf(\ 进程名称 到达时间 运行时间 开始运行时间 结束时间 执行顺序 周

转时间 带权周转时间\\n\

printf(\ %s %d %d %d %d %d %f Process[i].WeightWholeTime=Process[i].FinishTime-Process[i].ArrivalTime;

f1=Process[i].WeightWholeTime/Process[i].WholeTime; turn_round_time+=Process[i].WeightWholeTime; w+=f1;

printf(\时刻%d :\for(i=0;i

%f\\n\viceTime,Process[i].FinishTime,Process[i].order,Process[i].WeightWholeTime,f1); }

}

printf(\printf(\return 0;

//时间片轮转算法 typedef struct node {

char name[20]; int round; int cputime; int arrivetime; int needtime; char state; int count; struct node *next; }PCB;

PCB *ready=NULL,*run1=NULL,*finish=NULL; int num,i;

void GetFirst(); void Output(); void InsertTime(PCB *in); void InsertFinish(PCB *in); void TimeCreate(); void RoundRun();

void GetFirst() /*取得第一个就绪队列节点*/ {

run1 = ready;

if(ready!=NULL) {

run1 ->state = 'R'; ready = ready ->next; run1 ->next = NULL; }

}

void Output() /*输出队列信息*/ {

PCB *p; p = ready;

printf(\进程名\\tcpu时间\\t需要时间\\t进程状态\\t计数器\\n\ while(p!=NULL) {

printf(\e,p->count); p = p->next; }

p = finish; while(p!=NULL) {

printf(\e,p->count); p = p->next; }

p = run1; while(p!=NULL) {

printf(\e,p->count); p = p->next; } }

void InsertTime(PCB *in) /*将进程插入到就绪队列尾部*/ {

PCB *fst;

fst = ready;

if(ready == NULL) {

in->next = ready; ready = in; } else {

while(fst->next != NULL) {

fst = fst->next; }

in ->next = fst ->next; fst ->next = in; } }

void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/ {

PCB *fst; fst = finish;

if(finish == NULL) {

in->next = finish; finish = in; } else {

while(fst->next != NULL) {

fst = fst->next; }

in ->next = fst ->next;

fst ->next = in; } }

void TimeCreate() /*时间片输入函数*/ {

PCB *tmp; int i;

printf(\输入进程名字 到达时间 进程所需时间 时间片大小:\\n\ for(i = 0;i < num; i++) {

if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL) {

perror(\ exit(1); }

scanf(\%d %d %d\->round)); getchar();

tmp ->cputime = 0; tmp ->state ='W'; // tmp->prio=0; tmp ->count = 0; InsertTime(tmp); } }

void RoundRun() /*时间片轮转调度算法*/ {

int flag = 1;

本文来源:https://www.bwwdw.com/article/ed4f.html

Top