歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言實現時間片輪轉法的cpu調度模擬

C語言實現時間片輪轉法的cpu調度模擬

日期:2017/3/1 9:37:41   编辑:Linux編程

/*這是實驗課題目,上課時寫的,不是很完整,僅當留著做個紀念,有問題大家一起學習討論。*/
/*廢話不多說,直接上代碼!*/

/*****時間片輪轉法進行CPU調度算法********/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define N 10 //定義最大進程數
#define TIME 2//定義時間片大小
typedef struct pcb{
char id[10];//進程標識數
int arrivetime;//到達時間
int runtime;//進程已經占用的cpu時間
int needtime;//進程還需要的時間
char state[12];//進程運行狀態:wait or runing
struct pcb *next;
}pcb,*PCB;
PCB head;//設置全局變量用來修改就緒隊列
PCB tail;
int count=0;//記錄就緒隊列中進程數
void CreatProcess(){
//創建進程
PCB p,q;//進程的頭尾指針都有
int num;//記錄要創建的進程數
int i,j;
int arrive[N];
head=tail=(PCB)malloc(sizeof(pcb));
head->next=NULL;
p=head;
printf("輸入你要創建的進程數:");
scanf("%d",&num);
count=num;
printf("********按照進程到達時間從小到大創建就緒隊列******\n");
//初始對其排序來創建就緒隊列
for(i=1;i<=num;i++){
p->next=(PCB)malloc(sizeof(pcb));
p=p->next;
tail=p;
printf("輸入進程%d的標示符:",i);
scanf("%s",p->id);
printf("輸入進程%d的到達時間:",i);
scanf("%d",&p->arrivetime);
printf("輸入進程%d已占用的cpu時間:",i);
scanf("%d",&p->runtime);
printf("輸入進程%d還需要的cpu時間:",i);
scanf("%d",&p->needtime);
printf("輸入進程%d當前狀態:(run 或者wait):",i);
scanf("%s",p->state);
}
tail->next=p->next=NULL;
}
void RR_RunProcess(){
//運行進程,簡單輪轉法Round Robin
PCB p,q,temp;
p=head->next;
while(1){
if(head->next==NULL)
{
printf("此時就緒隊列中已無進程!\n");
return ;
}
else
{
while(p){
if((p->needtime>0)&&!(strcmp(p->state,"wait"))){
printf("進程%s開始,\n",p->id );
strcpy(p->state,"run");
p->runtime+=TIME;
p->needtime-=TIME;
if(p->needtime<0)
p->needtime=0;
}
temp=p;//把該時間片內運行完的進程存到臨時temp中
//把temp接到鏈表尾部,銷毀P;
if(temp->needtime>0){//把該時間片內運行完的進程接到就緒隊列的尾部
if(count>1){
head->next=temp->next;
tail->next=temp;
tail=tail->next;
strcpy(tail->state,"wait");
tail->next=NULL;
}
else if(count==1){//當只有一個進程等待時,分開討論
head->next=temp;
tail=temp;
strcpy(tail->state,"wait");
tail->next=NULL;

}

}
if(temp->needtime==0){//銷毀就緒隊列中已經結束的進程
count--;//此時就緒隊列中進程數減1
printf("進程%s結束.\n",p->id);
head->next=temp->next;
free(temp);//撤銷就緒隊列中已經結束的進程

}

p=head->next;

}

}
}
}
void main(){
printf("**************進程的初始狀態!**************\n");
CreatProcess();
printf("*******************************************\n\t\t程序運行結果如下:\n\n");
printf("*******************************************\n");
RR_RunProcess();//簡單輪轉法Round Robin

}

運行結果如下附件:

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

Copyright © Linux教程網 All Rights Reserved