进程调度实验

实验目的

进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。

一、实验内容

实验内容优先数和时间片轮转调度算法)

①设计进程控制块PCB表结构,分别适用于优先数调度算法和时间轮转调度算法。

②建立进程就绪队列。对两种不同算法编制入链子程序。

③编制两种进程调度算法:1)优先数调度;2)循环轮转调度


二、程序流程图

主程序的流程图:


主要函数模块的流程图:





三、代码实现:

#include<stdio.h> #include<stdlib.h> #define N 5 typedef struct pcb { int pid; int pyouxian; int pdaxiao; int CPUtime; int needtime; int pyouxian_max; }PCB; void Creat_process(PCB *); void Youxian_diaodu(PCB *); void Shijianpian_diaodu(PCB *); void Output_process(PCB *); main() { PCB process[N]; Creat_process(process); Youxian_diaodu(process); getchar();//一定要加这句才能运行Shijianpian_diaodu(),因为要考虑输入结束符非't'字符后还有个回车,它就是用来接受回车符!否则回车符会被Shijianpian_diaodu()接受,与预期不符! Shijianpian_diaodu(process); } void Creat_process(PCB *process) { int i; for(i=0;i<N;i++) { process[i].pid=i+1; //printf("\nPlease input this process[%d].pid:\n",i); //scanf("%d",&process[i].pid); //printf("\nPlease input this process[%d].pyouxian:\n",i); //scanf("%d",&process[i].pyouxian); process[i].pyouxian=40+rand()%30; //printf("\nPlease input this process[%d].pdaxiao:\n",i); //scanf("%d",&process[i].pdaxiao); process[i].pdaxiao=rand()%300; process[i].CPUtime=0; process[i].needtime=10+rand()%20; process[i].pyouxian_max=0; } for(i=0;i<N;i++) { printf("\npid\tpyouxian\tpdaxiao\t\tCPUtime\t\tneedtime\tyxmax\n"); printf("\n%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",process[i].pid,process[i].pyouxian,process[i].pdaxiao,process[i].CPUtime,process[i].needtime,process[i].pyouxian_max); } } void Youxian_diaodu(PCB *process) { int i,k; char temp; printf("\nThis is Youxian_diaodu!\nWhen you input is not:'t',then this fuction stop!\n"); printf("\nWhen you input 't',then run once:"); temp=getchar(); while(/*temp!='z'&&*/temp=='t') { for(i=0;i<N;i++) { if(process[i].pyouxian<=0||process[i].needtime<=0) { printf("\nThe %dth process is over!\n",process[i].pid); temp='z';//只要是非't'字符即可! break; } } if(temp=='z')//要与前一个非't'字符一致!,因为这里只控制由于process[i].needtime<=0的情况下的处理方式! { break; } k=process[0].pid; for(i=1;i<N;i++) { if(process[i].pyouxian>process[k-1].pyouxian) { k=process[i].pid; } if(process[i].pyouxian==process[k-1].pyouxian) { k=process[k-1].pid; } } process[k-1].pyouxian_max=1; for(i=0;i<N;i++) { if(process[i].pyouxian_max==1) { process[i].pyouxian-=3; process[i].CPUtime+=1; process[i].needtime-=1; } } Output_process(process); process[k-1].pyouxian_max=0; getchar(); temp=getchar(); } } void Shijianpian_diaodu(PCB *process) { int i,j=0;//,k; char temp; printf("\nThis is Shijianpian_diaodu!\nWhen you input is not:'t',then this fuction stop!\n"); printf("\nWhen you input 't',then run once:"); temp=getchar(); while(/*temp!='z'&&*/temp=='t') { for(i=0;i<N;i++) { //if(process[i].pyouxian<=0||process[i].needtime<=0) if(process[i].needtime<=0) { printf("\nThe %dth process is over!\n",process[i].pid); temp='z';//只要是非't'字符即可! break; } } if(temp=='z')//要与前一个非't'字符一致!,因为这里只控制由于process[i].needtime<=0的情况下的处理方式! { break; } /*k=process[0].pid; for(i=1;i<N;i++) { if(process[i].pyouxian>process[k-1].pyouxian) { k=process[i].pid; } if(process[i].pyouxian==process[k-1].pyouxian) { k=process[k-1].pid; } } process[k-1].pyouxian_max=1;*/ //for(i=0;i<N;i++) //{ //if(process[i].pyouxian_max==1) //{ //process[i].pyouxian-=3; for(i=0;i<N;i++) { process[i].pyouxian_max=0;//为了把Youxian_diaodu()中的pyouxian_max属性都清零,否则影响此Shijianpian_diaodu()中的pyouxian_max属性! } process[j].CPUtime+=2;//注意这里的两个数组元素的下标不能同为j++,否则相当于j+=2; process[j].needtime-=2; process[j].pyouxian_max=1; //} //} Output_process(process); process[j].pyouxian_max=0; if(j==N-1) { j=-1;//这里j应为-1,因为下面有j++;语句! } j++;//别忘了让数组下标指向下一个数组。 getchar(); temp=getchar(); } } void Output_process(PCB *process) { int i; for(i=0;i<N;i++) { printf("\npid\tpyouxian\tpdaxiao\t\tCPUtime\t\tneedtime\tyxmax\n"); printf("\n%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",process[i].pid,process[i].pyouxian,process[i].pdaxiao,process[i].CPUtime,process[i].needtime,process[i].pyouxian_max); } }

本文是原创,转载请注明出处!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值