操作系统——进程调度算法模拟


测试用,可以随便听听。


        

Geam Start!


问题描述

设计一个按优先数调度算法实现处理器调度的程序。
[提示]:
(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
操作系统
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪8080”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。本实验由于为了检查的方便,优先数和运行时间采用下表中的数值。
(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:
操作系统


实现代码

确实是太菜,只能想到最笨的方法,但是在我看来代码很好理解,一步步都能看懂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <bits/stdc++.h>
using namespace std;
typedef char PROC_STATE;

typedef struct _proc
{
char name[32];//进程名
int req_time;//需要的运行时间,随机数产生
int pri;//优先级,随机数产生
PROC_STATE state;//进程状态
struct _proc *next;
} PROC;

//创建结构体,并为结构体中的属性赋值
void PCB(PROC *P)
{
PROC *p1,*p2,*p3;
p2 = P;
//设置一个标志位,防止重复添加优先级相同的进程
int flag[5] = {0};

for(int i = 1; i < 6; i++)
{
p1 = new PROC;

//进程的名字
stringstream ss;
ss << i;
string temp = ss.str();
string str = "P" + temp;
//cout << str << endl;

//给进程命名,并得到进程名字的长度
int len = str.copy(p1->name,31);
//在末尾加上结束符
p1->name[len] = '\0';

p1->req_time = rand() % 8 + 1;
p1->pri = rand() % 5 + 1;
p1->state = 'R';

//尾插
switch(p1->pri)
{
case 5:
if(flag[4] == 0)//判断是否出现相同优先级
{
p1->next = P->next;
P->next = p1;
P = p1;
flag[4] = 1;
}
else//出现相同的优先级,并且已经插入过了,i减1重新生成
{
i--;
}
break;
case 4:
if(flag[3] == 0)
{
p1->next = p2->next;
p2->next = p1;
p2 = p1;
flag[3] = 1;
}
else
{
i--;
}
break;
case 3:
if(flag[2] == 0)
{
p1->next = p2->next;
p2->next = p1;
p2 = p1;
flag[2] = 1;
}
else
{
i--;
}
break;
case 2:
if(flag[1] == 0)
{
p1->next = p2->next;
p2->next = p1;
p2 = p1;
flag[1] = 1;
}
else
{
i--;
}
break;
case 1:
if(flag[0] == 0)
{
p1->next = p2->next;
p2->next = p1;
p2 = p1;
flag[0] = 1;
}
else
{
i--;
}
break;
}
}
//将链按照P1,P2,P3,P4,P5的顺序排序连接
for(int i = 0; i < 4; i++)
{
p2 = P;
p3 = P;
while(p2->next != NULL)
{
//p3是p2的前驱
p2=p2->next;
if(p2->pri == (4 - i))
{
p3->next = p2->next;
p2->next = P->next;
P->next = p2;
P = p2;
break;
}
p3 = p3->next;
}
}
}

void myPrint(PROC *P)
{
//初始化头结点
P = new PROC;
P->next = NULL;
PCB(P);
PROC *p1;
int a = 1;
for(int i = 1; i < 7; i++)
{
cout << "第" << i << "次运行:" << endl;
cout << endl;
//每次都要重头遍历输出
p1 = P;

while(p1->next != NULL)
{
p1 = p1->next;
string s = p1->name;
stringstream ss;
ss << a;
string temp = ss.str();
string name = "P" + temp;
if(s == name)//按P1,P2,P3,P4,P5的顺序输出
{
a++;
if(p1->pri > (6 - i))
{
p1->state = 'E';
}
cout << "进程名:" << p1->name << endl;
cout << "指针:";
if(p1->next == NULL)
{
cout << "0" << endl;
}
else
{
cout << p1->next->name << endl;
}
cout << "要求运行时间:" << p1->req_time << endl;
cout << "优先数:" << p1->pri << endl;
cout << "状态:" << p1->state << endl;
cout << endl;
if(a == 6)//直到输出P5跳出while循环
{
a = 1;
break;
}
else
{
p1 = P;
}
}
}
cout << "************************" << endl;
}
}

int main()
{
PROC *P;
myPrint(P);
}

运行结果

操作系统3
操作系统4
操作系统5
操作系统6
操作系统7
操作系统8


Game Clearance!!!

请给我充电吧!
-------------    本文结束  感谢您的阅读    -------------
0%