资源描述
进程调度模拟程序设计
一、实验目的
按优先数调度算法或时间片轮转法模拟处理器调度,从而进一步理解处理器调度的原理。
二、实验内容
1.设计思路
(1)数据结构定义
(a)对于不同的调度算法,定义不同的PCB结构体
typedef struct PCB_type1 {
char name[10]; //进程名
char state; //进程状态 R——就绪状态 E——结束状态
int need_time; //运行需要的CPU时间(需运行的时间片个数)
int priority;
}PCB_P; //按优先数调度算法的PCB结构体
typedef struct PCB_type2 {
char name[10]; //进程名
int state; //进程状态 R——就绪状态 E——结束状态
int need_time; //运行需要的CPU时间(需运行的时间片个数)
int used_time; //
}PCB_T; //按时间片轮转算法的PCB结构体
(b)用全局变量choice来指明当前应用的调度算法
int choice;
(c)为了模拟调度,可以利用STL定义队列
deque<PCB_P> q1;
queue<PCB_T> q2;
(2)程序主要模块
一共有三个自定义函数,分别是:
start_state() 提示用户选择调度算法,初始化进程信息。
dispatch() 模拟调度
(a) 对于优先数调度算法,每次调度前对队列里的进程按优先数从大 到小排序,然后调度选中队首的进程,将其出队列,并将进程优先数 和需要运行时间减1。如果此进程的需要运行时间不为0,则继续将 此进程入队;如果此进程的需要运行时间为0了,则将其状态置为结 束状态。重复上述过程直至队列为空。
(b) 对于时间片轮转算法,调度选中队首的进程,将其出队列,并将 进程已用时间加1。如果此进程要求运行时间¹已运行时间,则尚未 执行结束,继续将此进程入队;如果此进程的要求运行时间=已运行 时间,则已经执行结束,将其状态置为结束状态。重复上述过程直至 队列为空。
output() 输出被调度选中的进程的信息。
2. 源程序
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef struct PCB_type1 {
char name[10]; //进程名
char state; //进程状态 R——就绪状态 E——结束状态
int need_time; //运行需要的CPU时间(需运行的时间片个数)
int priority;
}PCB_P; //按优先数调度算法的PCB结构
typedef struct PCB_type2 {
char name[10]; //进程名
int state; //进程状态 R——就绪状态 E——结束状态
int need_time; //运行需要的CPU时间(需运行的时间片个数)
int used_time; //
}PCB_T; //按时间片轮转算法的PCB结构
int choice;
PCB_P pcbP;
PCB_T pcbT;
deque<PCB_P> q1;
queue<PCB_T> q2;
char pcbName[5][10]={"P1","P2","P3","P4","P5"};
bool cmp(const PCB_P &a,const PCB_P &b)
{
return a.priority>b.priority;
}
void start_state()
{
do{
printf("请选择调度算法:\n\t1--优先数调度算法\n\t2--时间片轮转算法\n");
scanf("%d",&choice);
}while(choice!=1&&choice!=2);
if(choice==1){
for(int i=0;i<5;i++){
strcpy(pcbP.name,pcbName[i]);
pcbP.state='R';
printf("%s:\n",pcbP.name);
printf("优先数:"); scanf("%d",&pcbP.priority);
printf("要求运行时间:"); scanf("%d",&pcbP.need_time);
q1.push_back(pcbP);
}
}
else{
for(int i=0;i<5;i++){
strcpy(pcbT.name,pcbName[i]);
pcbT.state='R';
pcbT.used_time=0;
printf("%s:\n",pcbT.name);
printf("要求运行时间:"); scanf("%d",&pcbT.need_time);
q2.push(pcbT);
}
}
if(choice==1)
printf("被选中的进程**运行一次后** 优先数\t要求运行时间\t 进程状态\n");
else
printf("被选中的进程**运行一次后**要求运行时间\t 已运行时间\t 进程状态\n");
}
void output()
{
if(choice==1)
printf(" %s \t\t\t%d\t\t%d\t\t%c\n",pcbP.name,pcbP.priority,pcbP.need_time,pcbP.state);
else
printf(" %s \t\t\t%d\t\t%d\t\t%c\n",pcbT.name,pcbT.need_time,pcbT.used_time,pcbT.state);
}
void dispatch()
{
if(choice==1){
while(!q1.empty()){
sort(q1.begin(),q1.end(),cmp);
pcbP=q1.front();
q1.pop_front();
pcbP.priority--;
pcbP.need_time--;
if(pcbP.need_time)
q1.push_back(pcbP);
else
pcbP.state='E';
output();
}
}
else{
while(!q2.empty()){
pcbT=q2.front();
q2.pop();
pcbT.used_time++;
if(pcbT.need_time!=pcbT.used_time)
q2.push(pcbT);
else
pcbT.state='E';
output();
}
}
}
int main()
{
start_state();
dispatch();
return 0;
}
3. 运行结果
(1)优先数调度算法
(2)时间片轮转算法
展开阅读全文