1、进程调度模拟程序设计 一、实验目的 按优先数调度算法或时间片轮转法模拟处理器调度,从而进一步理解处理器调度的原理。 二、实验内容 1.设计思路 (1)数据结构定义 (a)对于不同的调度算法,定义不同的PCB结构体 typedef struct PCB_type1 { char name[10]; //进程名 char state; //进程状态 R——就绪状态 E——结束状态 int need_time; //运行需要的CPU时间(需运行的时间片个数) int priority; }PCB_P
2、 //按优先数调度算法的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定义队列 d
3、eque
4、程已用时间加1。如果此进程要求运行时间¹已运行时间,则尚未 执行结束,继续将此进程入队;如果此进程的要求运行时间=已运行 时间,则已经执行结束,将其状态置为结束状态。重复上述过程直至 队列为空。
output() 输出被调度选中的进程的信息。
2. 源程序
#include
5、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; //
6、运行需要的CPU时间(需运行的时间片个数)
int used_time; //
}PCB_T; //按时间片轮转算法的PCB结构
int choice;
PCB_P pcbP;
PCB_T pcbT;
deque
7、rt_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]);
8、 pcbP.state='R'; printf("%s:\n",pcbP.name); printf("优先数:"); scanf("%d",&pcbP.priority); printf("要求运行时间:"); scanf("%d",&pcbP.need_time); q1.push_back(pcbP); } }
9、 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",
10、pcbT.need_time); q2.push(pcbT); } } if(choice==1) printf("被选中的进程**运行一次后** 优先数\t要求运行时间\t 进程状态\n"); else printf("被选中的进程**运行一次后**要求运行时间\t 已运行时间\t 进程状态\n"); } void output() { if(choi
11、ce==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){
12、 while(!q1.empty()){ sort(q1.begin(),q1.end(),cmp); pcbP=q1.front(); q1.pop_front(); pcbP.priority--; pcbP.need_time--; if(pcbP.need_time
13、) q1.push_back(pcbP); else pcbP.state='E'; output(); } } else{ while(!q2.empty()){ pcbT=q2.front();
14、 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)时间片轮转算法






