處理機-優(yōu)先數(shù)

處理機-優(yōu)先數(shù)

#include <stdlib.h> 
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type)) 
//定義一個方法,malloc(sizeof(type)分配一個塊大小為sizeof(type)的內(nèi)存,并返回首地址賦值
//(type*)把這個地址強制轉(zhuǎn)化為type*的指針
#define NULL 0 //定義一個字符NULL的值為0



/* 定義進程控制塊PCB */ 
struct pcb { 
    char name[3]; //進程名
    char state;   //狀態(tài)  /*進程的狀態(tài):'R':運行,'W':等待,'F':結(jié)束*/ 
    int super;    //優(yōu)先數(shù)
    int ntime;    //要求運行時間
    struct pcb *link; //定義一個link指針,其類型是pcb,表示下一個進程的指針
}*ready=NULL,*p;  //ready和p是pcb的指針

// ready 和p 指針主要還是對進程pcb里的 就緒隊列的隊首指針,

typedef struct pcb PCB; //使pcb數(shù)據(jù)類型像int,char等數(shù)據(jù)類型,可以直接使用,同時也起了一個別名

void sort() /* 建立對進程進行優(yōu)先級排列函數(shù)*/ 
{ 
    PCB *first, *second; 
    int insert=0; 
    if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級最大者,插入隊首*/ 
    { 
        p->link=ready; 
        ready=p; 
    }  
    else /* 進程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/ 
    { 
        first=ready; 
        second=first->link; 
        while(second!=NULL) 
        { 
            if((p->super)>(second->super)) /*若插入進程比當(dāng)前進程優(yōu)先數(shù)大,*/ 
            { /*插入到當(dāng)前進程前面*/ 
                p->link=second; 
                first->link=p; 
                second=NULL; 
                insert=1; 
            } 
            else /* 插入進程優(yōu)先數(shù)最低,則插入到隊尾*/ 
            { 
                first=first->link; 
                second=second->link; 
            } 
        } 
        if(insert==0) first->link=p; 
    } 
} 

void input() /* 建立進程控制塊函數(shù)*/ 
{ 
    int i,num; 
    system("cls"); /*清屏*/ 
    printf("\n 請輸入進程數(shù): "); 
    scanf("%d",&num); 
    for(i=1;i<=num;i++) 
    { 
        printf("\n 進程號No.%d:\n",i);
        p=getpch(PCB); 
        printf("\n 輸入進程名:"); 
        scanf("%s",p->name); 
        printf("\n 輸入進程優(yōu)先數(shù):"); 
        scanf("%d",&p->super); 
        printf("\n 輸入進程運行時間:"); 
        scanf("%d",&p->ntime); 
        printf("\n"); 
        p->state='W';    //指針變量p所指的對象的成員state賦值為'w',表示進程等待
        p->link=NULL;    //指針變量p所指的對象的成員link賦值為
        sort(); /* 調(diào)用sort函數(shù)*/ 
    } 
} 

int space() 
{ 
    int l=0; 
    PCB* pr=ready; 
    while(pr!=NULL) 
    { 
        l++; 
        pr=pr->link; 
    } 
    return(l); 
} 




void disp(PCB * pr) /*建立進程顯示函數(shù),用于顯示當(dāng)前進程*/ 
{ 
    printf("\n 進程名\t 狀態(tài)\t 優(yōu)先數(shù)\t 需要運行時間\n"); 
    printf("|%s\t",pr->name); 
    printf("|%c\t",pr->state); 
    printf("|%d\t",pr->super); 
    printf("|%d\t\t",pr->ntime); 
    printf("\n"); 
} 

void check() /* 建立進程查看函數(shù) */ 
{ 
    PCB* pr; 
    printf("\n **** 當(dāng)前正在運行的進程是:\n"); /*顯示當(dāng)前運行進程*/ 
    disp(p); 
    pr=ready; 
    printf("\n **** 當(dāng)前就緒隊列狀態(tài)為:\n"); /*顯示就緒隊列狀態(tài)*/ 
    while(pr!=NULL) 
    { 
        disp(pr); 
        pr=pr->link; 
    } 
} 

void destroy() /*建立進程撤消函數(shù)(進程運行結(jié)束,撤消進程)*/ 
{ 
    printf("\n 進程 [%s] 已完成.\n",p->name); 
    free(p); 
} 

void running() /* 建立進程就緒函數(shù)(進程運行時間到,置就緒狀態(tài)*/ 
{ 
    (p->ntime)--; 
    if(p->ntime==0) 
    destroy(); /* 調(diào)用destroy函數(shù)*/ 
    else 
    { 
        (p->super)--;    //優(yōu)先數(shù)自減一
        p->state='W';    //狀態(tài)變成等待 
        sort(); /*調(diào)用sort函數(shù)*/ 
    } 
} 

void main() /*主函數(shù)*/
{ 
    int len,h=0; 
    char ch;
    input(); 
    len=space(); 
    while((len!=0)&&(ready!=NULL)) 
    { 
        ch=getchar();     //從控制臺讀取數(shù)據(jù)
        h++;              //h自加一
        printf("-----------------------------------------------------");
        printf("\n 現(xiàn)在是第%d次運行: \n",h); 
        p=ready;          //
        ready=p->link;    //
        p->link=NULL;     //把
        p->state='R';     //把進程改變?yōu)檫\行狀態(tài)
        check(); 
        running();
        printf("\n 按任意鍵繼續(xù)......\n"); 
    } 
    printf("\n\n 進程已經(jīng)完成.\n"); 
}

參考代碼

#include <stdlib.h> 
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type)) 
//定義一個方法,malloc(sizeof(type)分配一個塊大小為sizeof(type)的內(nèi)存,并返回首地址賦值
//(type*)把這個地址強制轉(zhuǎn)化為type*的指針
#define NULL 0 //定義一個字符NULL的值為0



/* 定義進程控制塊PCB */ 
struct pcb { 
    char name[3]; //進程名
    char state;   //狀態(tài)  /*進程的狀態(tài):'R':運行,'W':等待,'F':結(jié)束*/ 
    int super;    //優(yōu)先數(shù)
    int ntime;    //要求運行時間
    int rtime;    //已經(jīng)運行時間
    struct pcb *link; //定義一個link指針,其類型是pcb,表示下一個進程的指針
}*ready=NULL,*p;  //ready和p是pcb的指針

// ready 和p 指針主要還是對進程pcb里的 就緒隊列的隊首指針,

typedef struct pcb PCB; //使pcb數(shù)據(jù)類型像int,char等數(shù)據(jù)類型,可以直接使用,同時也起了一個別名

void sort() /* 建立對進程進行優(yōu)先級排列函數(shù)*/ 
{ 
    PCB *first, *second; 
    int insert=0; 
    if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級最大者,插入隊首*/ 
    { 
        p->link=ready; 
        ready=p; 
    }  
    else /* 進程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/ 
    { 
        first=ready; 
        second=first->link; 
        while(second!=NULL) 
        { 
            if((p->super)>(second->super)) /*若插入進程比當(dāng)前進程優(yōu)先數(shù)大,*/ 
            { /*插入到當(dāng)前進程前面*/ 
                p->link=second; 
                first->link=p; 
                second=NULL; 
                insert=1; 
            } 
            else /* 插入進程優(yōu)先數(shù)最低,則插入到隊尾*/ 
            { 
                first=first->link; 
                second=second->link; 
            } 
        } 
        if(insert==0) first->link=p; 
    } 
} 

void input() /* 建立進程控制塊函數(shù)*/ 
{ 
    int i,num; 
    system("cls"); /*清屏*/ 
    printf("\n 請輸入進程數(shù): "); 
    scanf("%d",&num); 
    for(i=1;i<=num;i++) 
    { 
        printf("\n 進程號No.%d:\n",i);
        p=getpch(PCB); 
        printf("\n 輸入進程名:"); 
        scanf("%s",p->name); 
        printf("\n 輸入進程優(yōu)先數(shù):"); 
        scanf("%d",&p->super); 
        printf("\n 輸入進程運行時間:"); 
        scanf("%d",&p->ntime); 
        printf("\n"); 
        p->rtime=0;      //指針變量p所指的對象的成員rtime賦值為0,表示已經(jīng)運行時間為0
        p->state='W';    //指針變量p所指的對象的成員state賦值為'w',表示進程等待
        p->link=NULL;    //指針變量p所指的對象的成員link賦值為
        sort(); /* 調(diào)用sort函數(shù)*/ 
    } 
} 

int space() 
{ 
    int l=0; 
    PCB* pr=ready; 
    while(pr!=NULL) 
    { 
        l++; 
        pr=pr->link; 
    } 
    return(l); 
} 




void disp(PCB * pr) /*建立進程顯示函數(shù),用于顯示當(dāng)前進程*/ 
{ 
    printf("\n 進程名\t 狀態(tài)\t 優(yōu)先數(shù)\t 需要運行時間\t 已經(jīng)運行時間\n"); 
    printf("|%s\t",pr->name); 
    printf("|%c\t",pr->state); 
    printf("|%d\t",pr->super); 
    printf("|%d\t\t",pr->ntime); 
    printf("|%d\t",pr->rtime); 
    printf("\n"); 
} 

void check() /* 建立進程查看函數(shù) */ 
{ 
    PCB* pr; 
    printf("\n **** 當(dāng)前正在運行的進程是:\n"); /*顯示當(dāng)前運行進程*/ 
    disp(p); 
    pr=ready; 
    printf("\n **** 當(dāng)前就緒隊列狀態(tài)為:\n"); /*顯示就緒隊列狀態(tài)*/ 
    while(pr!=NULL) 
    { 
        disp(pr); 
        pr=pr->link; 
    } 
} 

void destroy() /*建立進程撤消函數(shù)(進程運行結(jié)束,撤消進程)*/ 
{ 
    printf("\n 進程 [%s] 已完成.\n",p->name); 
    free(p); 
} 

void running() /* 建立進程就緒函數(shù)(進程運行時間到,置就緒狀態(tài)*/ 
{ 
    (p->rtime)++; 
    if(p->rtime==p->ntime) 
    destroy(); /* 調(diào)用destroy函數(shù)*/ 
    else 
    { 
        (p->super)--;    //優(yōu)先數(shù)自減一
        p->state='W';    //狀態(tài)變成等待 
        sort(); /*調(diào)用sort函數(shù)*/ 
    } 
} 

void main() /*主函數(shù)*/
{ 
    int len,h=0; 
    char ch;
    input(); 
    len=space(); 
    while((len!=0)&&(ready!=NULL)) 
    { 
        ch=getchar();     //從控制臺讀取數(shù)據(jù)
        h++;              //h自加一
        printf("-----------------------------------------------------");
        printf("\n 現(xiàn)在是第%d次運行: \n",h); 
        p=ready;          //
        ready=p->link;    //
        p->link=NULL;     //把
        p->state='R';     //把進程改變?yōu)檫\行狀態(tài)
        check(); 
        running();
        printf("\n 按任意鍵繼續(xù)......\n"); 
    } 
    printf("\n\n 進程已經(jīng)完成.\n"); 
}

#include <stdio.h>
#include <stdlib.h>
void banker();
int main(int argc, char *argv[])
{  
   banker();
   system("PAUSE");    
   return 0;
}/*銀行家算法 用于死鎖的避免 */
#define N 5 //進程數(shù)目 
#define M 3 //資源數(shù)目
int max[N][M];//max[i][j] 表示進程 i 對進程 j 的資源需求量
int allocation[N][M]; // allocation[i][j] 表示進程 i 已經(jīng)獲得的 j 資源的量 
int need[N][M]; //need[i][j] 表示進程 i 尚需要 資源 j 的量 
int avaiable[M];//avaiable[j] 表示進程 j 還有的資源量 
int process[N] ;//進程的記錄 
int status = 0  ;//能否分配   0  不能  1 能 
int work[M]; // 系統(tǒng)中當(dāng)前所有的資源數(shù)目 
int finish[N];//進程的完成情況  
int count = 0 ;//安全序列的個數(shù)  
void initialize()
{
     int j =0 ;//資源  
     int i= 0 ;//進程 
     for(j=0;j<M;j++){
        printf("%d資源的avaiable數(shù)目:\t",j);
        scanf("%d",&avaiable[j]);
} //輸入avaiable 數(shù)目 
     for(i=0;i<N;i++){
       for(j=0;j<M;j++){
           printf("進程 %d 所需 %d 資源的最大數(shù)目:\t",i,j);
           scanf("%d",&max[i][j]); 
       }
     }//輸入 max 數(shù)目 
     for(i=0;i<N;i++){
       for(j=0;j<M;j++){
           printf("進程%d占有%d資源的數(shù)目:\t",i,j);
           scanf("%d",&allocation[i][j]); 
       }
     }// 輸入 allocation 數(shù)目 
      for(i=0;i<N;i++){
       for(j=0;j<M;j++){
         need[i][j] = max[i][j]-allocation[i][j];
       }
           }//計算 need 數(shù)目  
     for(j=0;j<M;j++){
        finish[j] = 0 ;
     }//賦值 finish 為零 表示 均未完成      
      for(j=0;j<M;j++){      
          work[j] = avaiable[j]; //賦值 初始 為系統(tǒng)可用的資源數(shù)    
     }
     for(i=0;i<N;i++){
         process[i] = i ;
     }//對進程的編號進行 賦值   
} //對 上述各個變量賦值
void trace(int i){
     if(i>=N){
      count++ ;
      status = 1 ;//可以分配 
      int p = 0 ;
      printf("按如下次序分配安全\n");
      for(p=0;p<N;p++){
        printf("%d\t",process[p]);
      }     
      printf("\n");
      return ;
     }//邊界的處理
     int k= i ;//進程的記錄 k 表示 第 k 個進程         
     for(k=i;k<N;k++){
         int j=0 ;//資源  j 表示第 j 個資源 
         int smaller = 1 ;// 1 need<=work  0 need>work 
         for(j=0;j<M;j++){
           if(need[process[k]][j]>work[j]){
               smaller = 0 ;//不夠分  
               break ;        
           }
         }     
         //篩選條件          
        if(smaller){        
           int  temp = process[i];
           process[i] = process[k];
           process[k] = temp ;
           int tempProcess = process[i];//當(dāng)前執(zhí)行進程 
           printf("進程 %d 執(zhí)行 : ",tempProcess);
           for(j=0;j<M;j++){                            
             printf("%d ",work[j]);
                         }
           printf("\t");
           for(j=0;j<M;j++){                            
             printf("%d ",need[tempProcess][j]);  
           }
           printf("\t");
           for(j=0;j<M;j++){                            
             printf("%d ",allocation[tempProcess][j]);
           }
           printf("\t");
           for(j=0;j<M;j++){                            
              work[j] += allocation[tempProcess][j]; //釋放其所占有的資源 
              printf("%d ",work[j]);
           }
           printf("\n");
           finish[tempProcess] = 1 ;//正常結(jié)束 
           trace(i+1);
           temp = process[i];
           process[i] = process[k];
           process[k] = temp ;
            for(j=0;j<M;j++){                            
             work[j] -= allocation[tempProcess][j]; 
           }
           finish[tempProcess] = 0 ;
           //恢復(fù)數(shù)據(jù) 
         }//夠分  
     }
} //安全性檢測 
void  request(){
  int i =0 ;//申請進程  i 
  printf("請輸入申請進程的編號:\t");
  scanf("%d",&i);
  int j = 0 ;
  int request[M];//  request[j] 進程 i 對 資源  j 的 請求量  
  for(j=0;j<M;j++){
     printf("進程 %d 申請%d 資源數(shù)目:\t",i,j);
     scanf("%d",&request[j]);
  } 
  for(j=0;j<M;j++){
     if(request[j]>need[i][j])
     {
        printf("超過事先聲明的最大需求量 ,該申請不能被分配 \n");
        return ;
                        
     }
  }
  for(j=0;j<M;j++){
     if(request[j]>avaiable[j])
     {  
        printf("無足夠資源分配  ,該申請不能被分配 \n");
        return ;
  }
  }
  for(j=0;j<M;j++){
     allocation[i][j]+=request[j];
     avaiable[j] -= request[j];
     need[i][j] -= request[j];
  }
//需要改變work向量的值。
  trace(0);
  if(!status){ 
    printf("無法進入安全序列,系統(tǒng)處于不安全狀態(tài)\n");
 }
}
void banker(){
 initialize(); 
 int choice = 0 ;
 int j ;
 while(1){
 printf("請選擇要進行的操作 : 1 判斷當(dāng)前的狀態(tài)   2 請求  3 exit \n");
scanf("%d",&choice);
 if(choice==1){
           trace(0);
           if(!status){ 
               printf("無法進入安全序列,系統(tǒng)處于不安全狀態(tài)\n");
           }
             for(j=0;j<M;j++){
        finish[j] = 0 ;
     }//賦值 finish 為零 表示 均未完成      
          for(j=0;j<M;j++){      
          work[j] = avaiable[j]; //賦值 初始 為系統(tǒng)可用的資源數(shù)  
          }}
     
 if(choice==2){
    request();
    for(j=0;j<M;j++){
        finish[j] = 0 ;
     }//賦值 finish 為零 表示 均未完成      
         for(j=0;j<M;j++){      
          work[j] = avaiable[j]; //賦值 初始 為系統(tǒng)可用的資源數(shù)  
       }
 }
 if(choice==3){
    return ;
 }
}
}//銀行家算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。