操作系统进程相关:时间片轮转调度算法。
问题描述
- 假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为:
- 进程名(如Q1~Q5)
- 指针(按优先数大小把进程连成队列,用指针指出下一个进程PCB的首地址)
- 要求运行时间(假设进程需要运行的单位时间数)
- 已运行时间(进程已运行的时间单位数,初始值为0)
- 状态(假设两种状态:就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态)
- 运行之前,为每个进程确定它的“要求运行时间”。通过键盘输入这些参数。
- 把5个进程按顺序排成循环队列,用指针指出队列连接情况。用一个标志单元记录轮到运行的进程。处理器调度总是选择标志单元指示的进程运行,对所指的进程,将其“已运行时间”加1。
- 进程运行一次后,若“要求运行时间”等于“已运行时间”,则将状态改为“结束”,退出队列,否则继续。
- 若就绪队列为空,结束,否则转到 3 重复。
要求
能接受键盘输入的进程优先数及要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪,就绪进程的排列情况。
代码实现
1 |
|
2 | using namespace std; |
3 | |
4 | // 进程控制块PCB |
5 | typedef struct PNode { |
6 | char name[10]; // 进程名 |
7 | struct PNode *next; // 指向下一节点的指针 |
8 | int All_time; // 总运行时间 |
9 | int Run_Time; // 已运行时间(初始都为0) |
10 | char state; // 进程状态(R:就绪,E:结束) |
11 | } *Proc; // 指向该PCB的指针 |
12 | |
13 | // 初始化就绪队列 |
14 | void Init_pcb(Proc &P, int n) { |
15 | int Num = n; |
16 | P = (Proc)malloc(sizeof(PNode)); // 进程队列头结点 |
17 | P->next = NULL; |
18 | Proc p = P; |
19 | cout << "请依次输入进程信息:"<<endl; |
20 | while(Num--) { |
21 | p = p->next = (Proc)malloc(sizeof(PNode)); |
22 | cout << "进程名,总运行时间:"; |
23 | cin >> p->name >> p->All_time; |
24 | p->Run_Time = 0; |
25 | p->state = 'R'; |
26 | p->next = NULL; |
27 | } |
28 | p->next = P->next; |
29 | } |
30 | |
31 | // 输出运行中的进程信息 |
32 | void show_info(Proc P) { |
33 | Proc p = P->next; |
34 | cout << endl; |
35 | do{ |
36 | if(p->state != 'E') { |
37 | cout << "进程名:" << p->name << "\t总运行时间:" << p->All_time; |
38 | cout << "\t已运行时间" << p->Run_Time << "\t状态:" << p->state << endl; |
39 | p = p->next; |
40 | } |
41 | else p = p->next; |
42 | }while(p != P->next); |
43 | } |
44 | |
45 | // 时间片轮转法 |
46 | void Round_Robin(Proc &P, int n, int timeslice) { |
47 | int round = 0; // 轮转数 |
48 | Proc p = P->next; |
49 | while (p->All_time > p->Run_Time) { |
50 | round++; |
51 | cout << endl << "Round" << round << "--正在运行" << "进程" << p->name; |
52 | if(p->All_time - p->Run_Time <= timeslice) // 还需要的时间小于时间片大小时 |
53 | p->Run_Time = p->All_time; |
54 | else p->Run_Time += timeslice; // 更新已运行的时间 |
55 | show_info(P); // 展示此时就绪队列的进程信息 |
56 | if(p->All_time == p->Run_Time) { // 该进程结束 |
57 | p->state = 'E'; |
58 | n--; |
59 | cout << p->name << "进程运行结束,删除!\n"; |
60 | } |
61 | p = p->next; |
62 | while(n && p->All_time == p->Run_Time) |
63 | p = p->next; // 跳过已结束的进程 |
64 | } |
65 | cout << endl; |
66 | } |
67 | |
68 | int main() { |
69 | int n, timeslice; // 总进程数,时间片大小 |
70 | cout << "**时间片轮转调度算法**" << endl; |
71 | cout << "请输入总进程个数:"; |
72 | cin >> n; |
73 | cout << "请输入时间片大小:"; |
74 | cin >> timeslice; |
75 | |
76 | Proc P; |
77 | Init_pcb(P, n); // PCB初始化 |
78 | cout << "进程初始状态为:"; |
79 | show_info(P); // 输出此刻的进程状态 |
80 | Round_Robin(P, n, timeslice); // 时间片轮转法 |
81 | |
82 | return 0; |
83 | } |