1、进程调度中多级反馈队列调度算法的模拟实现
Following The Source Code:
1 #include <queue>
2 #include <iostream>
3 #include <cstdlib>
4
5
6 /*
7 --------+ |Ready Queue 1| --------+ to CPU
8 __________________|
9 +
10 --------+ |Ready Queue 2| --------+ to CPU
11 __________________|
12 +
13 --------+ |Ready Queue 3| --------+ to CPU
14 __________________|
15 +
16 ---------+ |Ready Queue 4| --------+ to CPU
17 +__________________|
18 以上加号为进程执行流向
19 */
20
21 int time[4]={1,2,3,4}; //各个队列的时间片
22 char *str[4]={"first","second","third","fourth"};
23 queue<int> Rqueue[4]; //各个优先级队列定义
24
25 int execu(int n)
26 //n是指哪一个队列
27 //proc假设为一个进程
28 {
29 int proc; //代表一个进程
30 while(!Rqueue[n-1].empty())
31 {
32 proc=Rqueue[n-1].front(); //取队首进程进行调度
33 proc = proc - time[n-1]; //时间片轮转,执行调度后得到的进程
34 cout<< proc <<" in the "<<str[n-1]<<" queue"<<endl;
35 if( proc >=0 ) //假设进程时间片用完,但还没有执行完
36 {
37 if(n-1<3)Rqueue[n].push(proc); //将其压入下一个低优先级的队列
38 else
39 Rqueue[n-1].push(proc); //如果是最后一个队列,则压入本身
40 }
41 Rqueue[n-1].pop(); //进行下一次队列调度
42 }
43 return 0; //返回,代表该队列的所有进程均已调度过
44 }
45
46 int schedule(int& proc) //最初执行一个程序,创建一个进程,调度算法开始
47 {
48 Rqueue[0].push(proc); //将进程压入第一个队列
49 for(int i=1; i<=4; i++)
50 execu(i);
51 //当execu()返回时,意味着上一优先级队列里的进程均已调度完,进行下一个队列的调度
52 }
53
54
55 int main(int argc, char* argv[])
56 {
57 /*
58 for(int i=0; i<100; i++)
59 {
60 int n=int(rand())%4;
61 Rqueue[n].push(int(rand())%3);
62 }
63 */
64 int proc=15; //新进程
65 schedule(proc);
66 system("PAUSE");
67 return 0;
68 }
69
以上即为我的实验成果,经编译运行后,证明是正确的。
如果中间还有不正确的,请不吝指教。
谢谢!