快捷搜索:

您的位置:澳门新葡4473网站 > 热门贴子 > 模拟操作系统中进程的三种基础状态与内存的分

模拟操作系统中进程的三种基础状态与内存的分

发布时间:2019-12-23 04:18编辑:热门贴子浏览(51)

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

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

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

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

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

    图片 1图片 2

      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

     

    本文由澳门新葡4473网站发布于热门贴子,转载请注明出处:模拟操作系统中进程的三种基础状态与内存的分

    关键词:

上一篇:新葡亰平台娱乐CentOS用户账号管理

下一篇:没有了