设RQ分为RQ1和RQ2,RQ1采用轮转法,时间片q=7.
RQ1>RQ2,RQ2采用短进程优先调度算法。
测试数据如下:RQ1: P1-P5, RQ2: P6-P10
进程 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10
运行时间 16 11 14 13 15 21 18 10 7 14
已等待时间 6 5 4 3 2 1 2 3 4 5
实现描述:
typedef struct tag_pcb
{ char name[8];
int need;//须运行的时间
int turn;//周转时间
struct tag_pcb *next;
} PCB;
PCB * RQ1,*RQ2,*Finish;
int clock=0; //时钟
main ( )
{ 输入RQ1;
输入RQ2;(最好从文件读入)
while(RQ1!=NULL)
{ 从RQ1中选取一进程Pi准备运行;
计算其运行的时间t;
clock+=t; //表示Pi运行t;
if (Pi完成) 计算其turn;
否则 Pi加入到队尾;
}
while(RQ2!=NULL)
{ 从RQ2中选取一进程Pi准备运行;
clock+=Pi.need;
计算Pi的turn;
}
输出进程的周转时间;
}
实现多级队列调度算法,进程一实现轮转法,时间片为7,进程二采用最短进程优先算法。输出需要运行的时间和周转时间,利用clock标记记录单进程运行的时间。掌握轮转调度算法和短进程优先掉调度算法,并对两种算法进行简单分析。
(1)功能:
1、 实现轮转调度算法和短进程优先算法。
2、 输出进程的开始时间、结束时间、运行周期、等待时间等。
(2)设计思路
1、 利用list建立两个就绪队列RQ1,RQ2,并建立一个进程信息结构体包含进程名字、运行时间、周期等信息。
2、 设计两个创建队列函数createRQ1、createRQ2, 进行进程信息的初始化,利用push_back函数将信息压占栈。
3、 设计轮转法和短进程优先算法,并将相关进程信息输出。
#include<iostream> #include<list> #define capacity 7 using namespace std; struct PCB { string name; int needtime;//进程运行所需时间 int starttime;//进程开始运行的时间 int endtime;//进程结束运行的时间 int first_starttime;//第一次开始运行的时间 int runtime;//已经运行的时间 int waittime;//已等待时间 int count;//运行次数 }; list<PCB> RQ1, RQ2; int clock=0;//系统时间 string _name[10]={ "P1","P2","P3","P4","P5","P6","P7","P8","P9","P10" }; int _needtime[10] = { 16,11,14,13,15,21,18,10,7,14 }; int _waittime[10] = { 6,5,4,3,2,1,2,3,4,5 }; void creatRQ1() { for (int i = 0; i < 5; i++) { PCB p1; p1.name = _name[i]; p1.needtime = _needtime[i]; p1.waittime = _waittime[i]; p1.runtime = 0; p1.endtime = 0; p1.first_starttime = 0;//为了计算周转时间,turn=结束时间减去第一次执行时间 p1.starttime = 0; p1.count = 0; RQ1.push_back(p1); } cout << "创建进程:\t" << "执行所需时间:\n"; list<PCB>::iterator it; for (it = RQ1.begin(); it != RQ1.end(); it++) { cout << it->name << "\t\t" << it->needtime << endl; } } void creatRQ2() { for (int i = 5; i < 10; i++){ PCB p2; p2.name = _name[i]; p2.needtime = _needtime[i]; p2.waittime = _waittime[i]; p2.runtime = 0; p2.count = 0; p2.first_starttime = 0; p2.starttime = 0; p2.endtime = 0; RQ2.push_back(p2); } cout << "创建进程:\t" << "进程执行所需时间:\n"; for (list<PCB>::iterator it = RQ2.begin(); it != RQ2.end(); it++) { cout << it->name << "\t\t" << it->needtime << endl; } } void RR() { cout << "--------------------轮转法--------------------" << endl; creatRQ1(); clock = 0; cout << "进程:\t" << "执行还需时间\t" << "开始执行时间\t" << "执行次数\t" << "已执行时间\t"\ << "结束时间:\t" << "周转时间:\n"; while (!RQ1.empty()) { PCB* p = &RQ1.front();//返回第一个元素变量的引用 p->starttime = clock; cout << p->name << "\t\t" << p->needtime << "\t\t" << p->starttime << "\t\t"; if (p->needtime > capacity) { clock += capacity; (p->count)++; p->runtime += capacity; p->needtime -= capacity; if (p->count == 1) p->first_starttime = p->starttime; cout << p->count << "\t\t" << p->runtime << "\t\t\t\t" << endl; RQ1.push_back(*p); RQ1.pop_front(); } else { clock += p->needtime; (p->count)++; p->runtime += p->needtime; p->needtime = 0; p->endtime = clock; if (p->count == 1) p->first_starttime = p->starttime; cout << p->count << "\t\t" << p->runtime << "\t\t" << p->endtime << "\t\t" << p->endtime - p->first_starttime << "\t\t"\ << "执行完毕"; RQ1.pop_front(); } } cout << endl; } /*bool cmp(PCB a,PCB b){ return a.needtime < b.needtime ; }*/ void SPPSM() { cout << "--------------------短进程优先调度法--------------------\n"; creatRQ2(); clock = 0; cout << "进程:\t" << "执行所需时间:\t" << "开始执行时间:\t" << "结束时间:\t" << "周转时间\n"; while (!RQ2.empty()) { list<PCB>::iterator p = RQ2.begin(); for (list<PCB>::iterator it = RQ2.begin(); it != RQ2.end(); it++) { //找到最短预计执行的时间 if (it->needtime < p->needtime) p = it; } p->starttime = clock; p->endtime = p->starttime + p->needtime; clock = p->endtime; cout << p->name << "\t\t" << p->needtime << "\t\t" <<p->starttime<<"\t\t"<< p->endtime << "\t\t" << p->endtime - p->starttime << "\t执行完毕\n"; RQ2.erase(p); } } int main() { RR(); SPPSM(); }