实验1 处理器调度
1、实验目的:
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
2、实验内容:
用高级语言(要求C语言实验环境)编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.
按进程调度算法实现处理机调度。通过设计相应的数据结构建立进程控制块(PCB)和进程队列,采用先来先服务、优先数优先、轮转法,以及多级反馈轮转法等进程调度算法分别实现处理机调度策略。
3,实验题目:
处理器调度 4.流程图:
(1)主程序流程图:
(2)子程序init()流程图:
(3) 子程序max_pri_process()流程图:
(4)子程序show()流程图:
(5)子程序run()流程图:
开始
定义 i,j,t
j=0
j<num
t+=pcblist[j].runtime
j=j+1
输出提示
show()
getchar()
j=0
j<t
max_pri_process()!=-1
pcblist[max_pri_process()].state='r'
i=0
i<num
pcblist[i].state=='r ' pcblist[i].pri-=1 pcblist[i].runtime--
pcblist[i].runtime==0
pcblist[i].state='F '
pcblist[i].state='R '
show()
getchar()
i=i+1
j=j+1
结
束
5.源程序
//按优先数调度算法实现处理器调度的程序 #include "stdio.h" #include "string.h"
#define num 5//假定系统中进程个数为5
struct PCB {
char ID;//进程名
int runtime;//要求运行时间 int pri;//优先数
char state; //状态,R-就绪,F-结束 };
struct PCB pcblist[num];//定义进程控制块数组
void init()//PCB初始化子程序 {
int i;
for(i=0;i<num;i++) {
printf("PCB[%d]:ID pri runtime \n",i+1);//为每个进程任意指定pri和runtime scanf("%s%d%d",&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime); pcblist[i].state='R';//进程初始状态均为就绪 getchar();//接收回车符 } }
int max_pri_process()//确定最大优先级进程子程序 {
int max=-100;//max为最大优先数,初始化为-100 int i; int key;
for(i=0;i<num;i++)
{if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行 return -1;//返回-1 else if(max<pcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程 {
max=pcblist[i].pri;//max存放每次循环中的最大优先数 key=i;//将进程号赋给key }
}
if(pcblist[key].state=='F')//具有最大优先数的进程若已运行完毕 return -1;//则返回-1 else//否则 return key;//将key作为返回值返回 }
void show()//显示子程序 {int i;
printf("\n ID pri runtime state\n");
printf("-------------------------------------------------\n");
for(i=0;i<num;i++)//依次显示每个进程的名、优先数、要求运行时间和状态 {
printf("%s%6d%8d %s\n",&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state); }
printf(" press any key to continue...\n"); }
void run()//进程运行子程序 {int i,j;
int t=0;//t为运行次数 for(j=0;j<num;j++)
{t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和 printf("\nbefore run,the conditon is:\n");
show(); //调用show()子程序显示运行前PCB的情况 getchar();//等待输入回车符
for(j=0;j<t;j++)
{while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行 { pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行 }
for(i=0;i<num;i++) {if(pcblist[i].state=='r')
{ pcblist[i].pri-=1;//将当前运行进程的优先数减1 pcblist[i].runtime--;//要求运行时间减1 {
if(pcblist[i].runtime==0)
pcblist[i].state='F';//运行完则将该进程状态置为结束 else
pcblist[i].state='R';//未运行完将其状态置为就绪 } show();//显示每次运行后各PCB的情况
getchar();//等待回车进入下一次运行 } } } }
void main()//按动态优先数调度主程序 {
init();//初始化各个进程PCB run();//进程调度模拟 }
6,运行的初值和运行结果:
初值界面:
运行界面1:
运行界面2:
运行界面3:
7.总结和心得:
本实验严格按照试验要求,根据要求所涉及的知识点进行了针对性的知识点掌握和复习。通过编程软件对程序进行编写,了解了程序编写的基本流程,巩固了程序编写的知识,而且对于进程掉调度的知识有了更加深刻的理解和掌握。
…… 此处隐藏:665字,全部文档内容请下载后查看。喜欢就下载吧 ……