歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

/*這是實驗課題目,上課時寫的,不是很完整,僅當留著做個紀念,有問題大家一起學習討論。*/
/*廢話不多說,直接上代碼!*/
 
/*****時間片輪轉法進行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