模拟操作系统中进程的三种基础状态与内存的分配和回收(最佳适配算法)

80652319 2017-04-02

利用键盘模拟进程的三种操作状态,并且使用C++中的list模板模拟内存的分配和回收。

 能够模拟进程的创建与撤销过程

l可对进程的状态进行全面的控制

按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状

用PCB代表进程,用全局变量表示进程的个数。

1 #include <iostream>
  2 #include <list>
  3 #include <numeric>
  4 #include <algorithm>
  5 #include<stdlib.h>
  6 using namespace std;
  7 
  8 
  9 struct PCB                    //PCB结构体
 10 {
 11     char name[10];            //外部标记
 12     int PID;                //内部标记
 13     int    begin;                //起始地址
 14     int length;                //长度
 15     struct PCB* next;
 16 };
 17 
 18 
 19 struct Memory
 20 {
 21     int start;    //起始地址
 22     int len;    //长度
 23     bool operator < (const struct Memory  p) const
 24     {
 25         return len < p.len;
 26     }
 27 
 28 };
 29 typedef list <Memory> Memy;//用模板定义Memory的列表
 30 
 31 int SIZE;            //用来存储内存的大小
 32 Memy   LM;            //用来存储内存分配的链表
 33 Memy::iterator K;
 34 Memory L;            //第一块完整的内存
 35 static int number = 0;
 36 //number用来标记进程的数量。
 37 
 38 //创建三个链表,分别代表,就绪,执行,阻塞
 39 struct PCB* Ready = new struct PCB;
 40 struct PCB* Blocked = new struct PCB;
 41 struct PCB* Running = new struct PCB;
 42 
 43 
 44 bool px(struct Memory m, struct Memory n)
 45 {
 46     return m.start < n.start;
 47 }
 48 
 49 
 50 void CreateProcess(struct PCB* &Ready, Memy &LM)//创建进程
 51 {
 52     LM.sort();
 53     struct PCB* P = new struct PCB;
 54     struct PCB* X = new struct PCB;//利用X来做到插入队尾
 55 
 56     X = Ready;
 57 
 58     //cout << "请输入此进程的名称:" << endl;
 59     cin >> P->name;
 60 
 61     
 62     //cout << "请输入此进程大小:" << endl;
 63     cin >> P->length;
 64 
 65     for (K = LM.begin(); K != LM.end(); K++)//分配内存,
 66     {
 67         Memy::iterator x;
 68         if (K->len <= 0)
 69         {
 70             cout << "已经没有足够的内存空间!" << endl;
 71             return;
 72         }
 73         if (K->len < P->length)
 74         {
 75             x = K;
 76             K++;
 77             if (K == LM.end())
 78             {
 79                 cout << "已经没有足够的内存空间!" << endl;
 80                 return;
 81             }
 82             else
 83             {
 84                 K = x;
 85                 continue;
 86             }            
 87         }
 88         else if (K->len >= P->length)
 89         {
 90             if (K->len - P->length <= 2)
 91             {
 92                 P->begin = K->start;
 93                 P->length = K->len;
 94                 LM.erase(K);
 95                 number++;
 96                 break;
 97             }
 98             else
 99             {
100                 P->begin = K->start;
101                 K->start += P->length;//修改起始地址
102                 K->len -= P->length;
103                 number++;
104                 break;
105             }
106         }
107         else
108         {
109             continue;
110         }
111     }
112 
113     P->PID = number;            //利用number来进行唯一系统内部进程标示
114     while (X->next != NULL)        //新建节点连接到链表尾部
115     {
116         X = X->next;
117     }
118     X->next = P;
119     P->next = NULL;
120 }
121 
122 
123 void sort1(Memy &LM)                //按照长度进行排序
124 {
125     LM.sort();
126 }
127 
128 
129 void EndProcess(struct PCB* &Running, Memy &LM)                //结束进程
130 {
131     if (Running->next == NULL)
132     {
133         cout << "没有进程处于执行态!" << endl;
134         system("pause");
135         return;
136     }
137     LM.sort(px);
138     Memory O;
139     O.start = Running->next->begin;
140     O.len = Running->next->length;
141     if (LM.size() == 0)                            //系统剩余空间为0,直接插入。
142     {
143         Memory M;
144         M.len = O.len;
145         M.start = O.start;
146         LM.push_back(M);
147     }
148     else
149     {
150         for (K = LM.begin(); K != LM.end(); K++)
151         {
152             if (K->start>(O.start + O.len))                        //上下都被占用            直接插入前面
153             {
154                 Memory m;
155                 m.len = O.len;
156                 m.start = O.start;
157                 LM.push_front(m);
158                 break;
159             }
160             else if ((O.start + O.len) == K->start)                //上占下空   改下区基址,改长度
161             {
162                 K->start = O.start;
163                 K->len += O.len;
164                 break;
165             }
166             else if ((K->start + K->len) == O.start)                //上空==============================================
167             {
168                 int l = K->len;
169                 Memy::iterator X;
170                 X = K;
171                 ++K;
172                 if (K != LM.end())
173                 {
174                     if (K->start == (O.start + O.len))            //上空下空
175                     {
176                         X->len = K->len + l + O.len;                //长度三合一//删除++K
177                         LM.erase(K);
178                         break;
179                     }
180                     else                                             //上空 下占 改上区长度
181                     {
182                         X->len += O.len;
183                         break;
184                     }
185                 }
186                 else                                                //上空 下占 改上区长度
187                 {
188                     X->len += O.len;
189                     break;
190                 }
191             }
192             else if ((K->start + K->len)<O.start)                            //提前进入下一次循环                    
193             {
194                 continue;
195             }
196         }
197     }
198 
199 
200     while (Running->next != NULL)
201     {
202         struct PCB* P = Running->next;
203         P->next = NULL;
204         delete P;
205         Running->next = NULL;
206         number--;
207     }
208 }
209 
210 
211 void show(struct PCB* Ready, struct PCB* Running, struct PCB* Blocked)//显示三种状态的进程情况
212 {
213     cout << "就绪态:";
214     while (Ready->next != NULL)
215     {
216         cout << " name: " << Ready->next->name << "  begin: " << Ready->next->begin << "  length: " << Ready->next->length;
217         Ready = Ready->next;
218     }
219     cout << endl;
220     cout << "执行态:";
221     if (Running->next != NULL)
222     {
223         cout << "name: " << Running->next->name << " begin: " << Running->next->begin << " len: " << Running->next->length;
224     }
225     cout << endl;
226     cout << "阻塞态:";
227     while (Blocked->next != NULL)
228     {
229         cout << "name: " << Blocked->next->name << " begin: " << Blocked->next->begin << " len: " << Blocked->next->length;
230         Blocked = Blocked->next;
231     }
232     cout << endl;
233     int sum = 0;
234     for (K = LM.begin(); K != LM.end(); K++)
235     {
236         cout << "内存起始地址: " << K->start << "内存长度:" << K->len << endl;
237         sum += K->len;
238     }
239     cout << "进程所占空间: " << (SIZE - sum) << endl;
240     cout << "系统空闲空间: " << sum << endl;
241     sum = 0;
242 }
243 
244 
245 void Run(struct PCB* &Ready, struct PCB* &Running)       //执行函数,查询就绪态中的PCB
246 {
247     while ((Ready->next != NULL) && (Running->next == NULL))
248     {
249         struct PCB* Z = Ready->next;
250         Running->next = Z;
251         Ready->next = Ready->next->next;
252         Z->next = NULL;
253     }
254 }
255 
256 
257 void Block(struct PCB* &Running, struct PCB* &Blocked)     //执行到阻塞的转换
258 {
259     struct PCB* Head = Blocked;
260     while (Running->next != NULL)
261     {
262         while (Head->next != NULL)
263         {
264             Head = Head->next;
265         }
266         Head->next = Running->next;
267         Running->next = NULL;
268     }
269 }
270 
271 
272 void TimeUp(struct PCB* &Running, struct PCB* &Ready)                    //时间片到
273 {
274     struct PCB* Head = Ready;
275     struct PCB* P = Running->next;
276     P->next = NULL;
277     while (Running->next != NULL)
278     {
279         while (Head->next != NULL)
280         {
281             Head = Head->next;
282         }
283         Head->next = P;
284         Running->next = NULL;
285     }
286 }
287 
288 
289 void Wake(struct PCB* &Blocked, struct PCB* &Ready)//唤醒进程
290 {
291     if (Blocked->next == NULL)
292     {
293         cout << "没有进程处于阻塞态!" << endl;
294         system("pause");
295         return;
296     }
297     struct PCB* P = Ready;
298     while (P->next != NULL)
299     {
300         P = P->next;
301     }
302     if (Blocked->next != NULL)
303     {
304         P->next = Blocked->next;
305         Blocked->next = Blocked->next->next;
306         P->next->next = NULL;
307     }
308     else
309     {
310         cout << "没有处于阻塞状态的进程!" << endl;
311     }
312 
313 }
314 
315 
316 void interface()
317 {
318     cout << "========帮助========" << endl;
319     cout << "C----------创建进程" << endl;
320     cout << "T----------时间片到" << endl;
321     cout << "S----------进程阻塞" << endl;
322     cout << "W----------唤醒进程" << endl;
323     cout << "E----------结束进程" << endl;
324     cout << "H----------查看帮助" << endl;
325 
326 }
327 
328 
329 void start()
330 {
331     cout << "请输入内存的起始地址:" << endl;
332     cin >> L.start;
333     cout << "请输入内存的大小:" << endl;
334     cin >> L.len;
335     SIZE = L.len;
336     LM.push_front(L);
337 }
338 
339 
340 void process()                    // 中间过程
341 {
342     interface(); 
343     system("pause");
344     char choice;
345     do
346     {
347         system("cls");        
348         cin >> choice;
349         switch (choice)
350         {
351         case 'C':LM.sort(px); CreateProcess(Ready, LM); Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
352         case 'T':TimeUp(Running, Ready);  Run(Ready, Running); show(Ready, Running, Blocked); system("pause");  break;
353         case 'S':Block(Running, Blocked);  Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
354         case 'W':Wake(Blocked, Ready); Run(Ready, Running); show(Ready, Running, Blocked); system("pause"); break;
355         case 'E':EndProcess(Running, LM); Run(Ready, Running); show(Ready, Running, Blocked); sort1(LM); system("pause"); break;
356         case 'H':interface();break;
357         default:cout << "输入错误,请重新输入!" << endl;  system("pause"); break;
358         }
359 
360     } while (number != 0);
361 }
362 
363 
364 void main()
365 {
366     Ready->next = NULL;
367     Blocked->next = NULL;
368     Running->next = NULL;
369     start();
370     process();
371     cout << "所有进程已结束" << endl;
372     system("pause");
373 
374 }
View Code

相关推荐