国产色频,国产网站精品,成人在线综合网,精品一区二区三区毛片,亚洲无卡视频,黄色av观看,亚洲福利影视

模擬實(shí)現(xiàn)進(jìn)程調(diào)度——采用高優(yōu)先數(shù)優(yōu)先和先來(lái)服務(wù)算法

2018-03-14 14:35:55 csdn  點(diǎn)擊量: 評(píng)論 (0)
進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法?! ∶總€(gè)進(jìn)程有一個(gè)進(jìn)程控制塊

      進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法。

  每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊( PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。

  進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。

  進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。

  就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。

  如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。

 

[cpp] view plain copy
 
  1. #include <stdio.h>  
  2. #include <stdlib.h>   
  3. #include <conio.h>   
  4. #define getpch(type) (type*)malloc(sizeof(type))   
  5.    
  6. struct pcb   /* 定義進(jìn)程控制塊PCB */  
  7. {  
  8.     char name[10];  
  9.     char state;  
  10.     int super;  
  11.     int ntime;  
  12.     int rtime;  
  13.     struct pcb* link;  
  14. }*ready = NULL, *p;  
  15. typedef struct pcb PCB;  
  16. sort() /* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/  
  17. {  
  18.     PCB *first, *second;  
  19.     int insert = 0;  
  20.     if ((ready == NULL) || ((p->super) > (ready->super))) /*優(yōu)先級(jí)最大者,插入隊(duì)首*/  
  21.     {  
  22.         p->link = ready;  
  23.         ready = p;  
  24.     }  
  25.     else /* 進(jìn)程比較優(yōu)先級(jí),插入適當(dāng)?shù)奈恢弥?/  
  26.     {  
  27.         first = ready;  
  28.         second = first->link;  
  29.         while (second != NULL)  
  30.         {  
  31.             if ((p->super) > (second->super)) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/  
  32.             { /*插入到當(dāng)前進(jìn)程前面*/  
  33.                 p->link = second;  
  34.                 first->link = p;  
  35.                 second = NULL;  
  36.                 insert = 1;  
  37.             }  
  38.             else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/  
  39.             {  
  40.                 first = first->link;  
  41.                 second = second->link;  
  42.             }  
  43.         }  
  44.         if (insert == 0) first->link = p;  
  45.     }  
  46. }  
  47. input() /* 建立進(jìn)程控制塊函數(shù)*/  
  48. {  
  49.     int i, num;  
  50.       
  51.     printf("\n 請(qǐng)輸入進(jìn)程數(shù)?");  
  52.     scanf("%d", &num);  
  53.     for (i = 0; i < num; i++)  
  54.     {  
  55.         printf("\n 進(jìn)程號(hào)No.%d:\n", i);  
  56.         p = getpch(PCB);  
  57.         printf("\n 輸入進(jìn)程名:");  
  58.         scanf("%s", p->name);  
  59.         printf("\n 輸入進(jìn)程優(yōu)先數(shù):");  
  60.         scanf("%d", &p->super);  
  61.         printf("\n 輸入進(jìn)程運(yùn)行時(shí)間:");  
  62.         scanf("%d", &p->ntime);  
  63.         printf("\n");  
  64.         p->rtime = 0; p->state = 'w';  
  65.         p->link = NULL;  
  66.         sort(); /* 調(diào)用sort函數(shù)*/  
  67.     }  
  68. }  
  69. int space()  
  70. {  
  71.     int l = 0; PCB* pr = ready;  
  72.     while (pr != NULL)  
  73.     {  
  74.         l++;  
  75.         pr = pr->link;  
  76.     }  
  77.     return(l);  
  78. }  
  79. disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/  
  80. {  
  81.     printf("\n qname \t state \t super \t ndtime \t runtime \n");  
  82.     printf("|%s\t", pr->name);  
  83.     printf("|%c\t", pr->state);  
  84.     printf("|%d\t", pr->super);  
  85.     printf("|%d\t", pr->ntime);  
  86.     printf("|%d\t", pr->rtime);  
  87.     printf("\n");  
  88. }  
  89. check() /* 建立進(jìn)程查看函數(shù) */  
  90. {  
  91.     PCB* pr;  
  92.     printf("\n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:%s", p->name); /*顯示當(dāng)前運(yùn)行進(jìn)程*/  
  93.     disp(p);  
  94.     pr = ready;  
  95.     printf("\n ****當(dāng)前就緒隊(duì)列狀態(tài)為:\n"); /*顯示就緒隊(duì)列狀態(tài)*/  
  96.     while (pr != NULL)  
  97.     {  
  98.         disp(pr);  
  99.         pr = pr->link;  
  100.     }  
  101. }  
  102. destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/  
  103. {  
  104.     printf("\n 進(jìn)程 [%s] 已完成.\n", p->name);  
  105.     free(p);  
  106. }  
  107. running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/  
  108. {  
  109.     (p->rtime)++;  
  110.     if (p->rtime == p->ntime)  
  111.         destroy(); /* 調(diào)用destroy函數(shù)*/  
  112.     else  
  113.     {  
  114.         (p->super)--;  
  115.         p->state = 'w';  
  116.         sort(); /*調(diào)用sort函數(shù)*/  
  117.     }  
  118. }  
  119. main() /*主函數(shù)*/  
  120. {  
  121.     int len, h = 0;  
  122.     char ch;  
  123.     input();  
  124.     len = space();  
  125.     while ((len != 0) && (ready != NULL))  
  126.     {  
  127.         ch = getchar();  
  128.         h++;  
  129.         printf("\n The execute number:%d \n", h);  
  130.         p = ready;  
  131.         ready = p->link;  
  132.         p->link = NULL;  
  133.         p->state = 'R';  
  134.         check();  
  135.         running();  
  136.         printf("\n 按任一鍵繼續(xù)......");  
  137.         ch = getchar();  
  138.     }  
  139.     printf("\n\n 進(jìn)程已經(jīng)完成.\n");  
  140.     ch = getchar();  
  141. }  

 

大云網(wǎng)官方微信售電那點(diǎn)事兒

責(zé)任編輯:售電衡衡

免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
我要收藏
個(gè)贊
?