手机版

设计一个按优先数调度算法实现处理器调度的程序

时间:2025-05-10   来源:未知    
字号:

实验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字,全部文档内容请下载后查看。喜欢就下载吧 ……
设计一个按优先数调度算法实现处理器调度的程序.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)