处理机-优先数

处理机-优先数

#include <stdlib.h> 
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type)) 
//定义一个方法,malloc(sizeof(type)分配一个块大小为sizeof(type)的内存,并返回首地址赋值
//(type*)把这个地址强制转化为type*的指针
#define NULL 0 //定义一个字符NULL的值为0



/* 定义进程控制块PCB */ 
struct pcb { 
    char name[3]; //进程名
    char state;   //状态  /*进程的状态:'R':运行,'W':等待,'F':结束*/ 
    int super;    //优先数
    int ntime;    //要求运行时间
    struct pcb *link; //定义一个link指针,其类型是pcb,表示下一个进程的指针
}*ready=NULL,*p;  //ready和p是pcb的指针

// ready 和p 指针主要还是对进程pcb里的 就绪队列的队首指针,

typedef struct pcb PCB; //使pcb数据类型像int,char等数据类型,可以直接使用,同时也起了一个别名

void sort() /* 建立对进程进行优先级排列函数*/ 
{ 
    PCB *first, *second; 
    int insert=0; 
    if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/ 
    { 
        p->link=ready; 
        ready=p; 
    }  
    else /* 进程比较优先级,插入适当的位置中*/ 
    { 
        first=ready; 
        second=first->link; 
        while(second!=NULL) 
        { 
            if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ 
            { /*插入到当前进程前面*/ 
                p->link=second; 
                first->link=p; 
                second=NULL; 
                insert=1; 
            } 
            else /* 插入进程优先数最低,则插入到队尾*/ 
            { 
                first=first->link; 
                second=second->link; 
            } 
        } 
        if(insert==0) first->link=p; 
    } 
} 

void input() /* 建立进程控制块函数*/ 
{ 
    int i,num; 
    system("cls"); /*清屏*/ 
    printf("\n 请输入进程数: "); 
    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 输入进程优先数:"); 
        scanf("%d",&p->super); 
        printf("\n 输入进程运行时间:"); 
        scanf("%d",&p->ntime); 
        printf("\n"); 
        p->state='W';    //指针变量p所指的对象的成员state赋值为'w',表示进程等待
        p->link=NULL;    //指针变量p所指的对象的成员link赋值为
        sort(); /* 调用sort函数*/ 
    } 
} 

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




void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ 
{ 
    printf("\n 进程名\t 状态\t 优先数\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() /* 建立进程查看函数 */ 
{ 
    PCB* pr; 
    printf("\n **** 当前正在运行的进程是:\n"); /*显示当前运行进程*/ 
    disp(p); 
    pr=ready; 
    printf("\n **** 当前就绪队列状态为:\n"); /*显示就绪队列状态*/ 
    while(pr!=NULL) 
    { 
        disp(pr); 
        pr=pr->link; 
    } 
} 

void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ 
{ 
    printf("\n 进程 [%s] 已完成.\n",p->name); 
    free(p); 
} 

void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ 
{ 
    (p->ntime)--; 
    if(p->ntime==0) 
    destroy(); /* 调用destroy函数*/ 
    else 
    { 
        (p->super)--;    //优先数自减一
        p->state='W';    //状态变成等待 
        sort(); /*调用sort函数*/ 
    } 
} 

void main() /*主函数*/
{ 
    int len,h=0; 
    char ch;
    input(); 
    len=space(); 
    while((len!=0)&&(ready!=NULL)) 
    { 
        ch=getchar();     //从控制台读取数据
        h++;              //h自加一
        printf("-----------------------------------------------------");
        printf("\n 现在是第%d次运行: \n",h); 
        p=ready;          //
        ready=p->link;    //
        p->link=NULL;     //把
        p->state='R';     //把进程改变为运行状态
        check(); 
        running();
        printf("\n 按任意键继续......\n"); 
    } 
    printf("\n\n 进程已经完成.\n"); 
}

参考代码

#include <stdlib.h> 
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type)) 
//定义一个方法,malloc(sizeof(type)分配一个块大小为sizeof(type)的内存,并返回首地址赋值
//(type*)把这个地址强制转化为type*的指针
#define NULL 0 //定义一个字符NULL的值为0



/* 定义进程控制块PCB */ 
struct pcb { 
    char name[3]; //进程名
    char state;   //状态  /*进程的状态:'R':运行,'W':等待,'F':结束*/ 
    int super;    //优先数
    int ntime;    //要求运行时间
    int rtime;    //已经运行时间
    struct pcb *link; //定义一个link指针,其类型是pcb,表示下一个进程的指针
}*ready=NULL,*p;  //ready和p是pcb的指针

// ready 和p 指针主要还是对进程pcb里的 就绪队列的队首指针,

typedef struct pcb PCB; //使pcb数据类型像int,char等数据类型,可以直接使用,同时也起了一个别名

void sort() /* 建立对进程进行优先级排列函数*/ 
{ 
    PCB *first, *second; 
    int insert=0; 
    if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/ 
    { 
        p->link=ready; 
        ready=p; 
    }  
    else /* 进程比较优先级,插入适当的位置中*/ 
    { 
        first=ready; 
        second=first->link; 
        while(second!=NULL) 
        { 
            if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ 
            { /*插入到当前进程前面*/ 
                p->link=second; 
                first->link=p; 
                second=NULL; 
                insert=1; 
            } 
            else /* 插入进程优先数最低,则插入到队尾*/ 
            { 
                first=first->link; 
                second=second->link; 
            } 
        } 
        if(insert==0) first->link=p; 
    } 
} 

void input() /* 建立进程控制块函数*/ 
{ 
    int i,num; 
    system("cls"); /*清屏*/ 
    printf("\n 请输入进程数: "); 
    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 输入进程优先数:"); 
        scanf("%d",&p->super); 
        printf("\n 输入进程运行时间:"); 
        scanf("%d",&p->ntime); 
        printf("\n"); 
        p->rtime=0;      //指针变量p所指的对象的成员rtime赋值为0,表示已经运行时间为0
        p->state='W';    //指针变量p所指的对象的成员state赋值为'w',表示进程等待
        p->link=NULL;    //指针变量p所指的对象的成员link赋值为
        sort(); /* 调用sort函数*/ 
    } 
} 

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




void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ 
{ 
    printf("\n 进程名\t 状态\t 优先数\t 需要运行时间\t 已经运行时间\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() /* 建立进程查看函数 */ 
{ 
    PCB* pr; 
    printf("\n **** 当前正在运行的进程是:\n"); /*显示当前运行进程*/ 
    disp(p); 
    pr=ready; 
    printf("\n **** 当前就绪队列状态为:\n"); /*显示就绪队列状态*/ 
    while(pr!=NULL) 
    { 
        disp(pr); 
        pr=pr->link; 
    } 
} 

void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ 
{ 
    printf("\n 进程 [%s] 已完成.\n",p->name); 
    free(p); 
} 

void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ 
{ 
    (p->rtime)++; 
    if(p->rtime==p->ntime) 
    destroy(); /* 调用destroy函数*/ 
    else 
    { 
        (p->super)--;    //优先数自减一
        p->state='W';    //状态变成等待 
        sort(); /*调用sort函数*/ 
    } 
} 

void main() /*主函数*/
{ 
    int len,h=0; 
    char ch;
    input(); 
    len=space(); 
    while((len!=0)&&(ready!=NULL)) 
    { 
        ch=getchar();     //从控制台读取数据
        h++;              //h自加一
        printf("-----------------------------------------------------");
        printf("\n 现在是第%d次运行: \n",h); 
        p=ready;          //
        ready=p->link;    //
        p->link=NULL;     //把
        p->state='R';     //把进程改变为运行状态
        check(); 
        running();
        printf("\n 按任意键继续......\n"); 
    } 
    printf("\n\n 进程已经完成.\n"); 
}

#include <stdio.h>
#include <stdlib.h>
void banker();
int main(int argc, char *argv[])
{  
   banker();
   system("PAUSE");    
   return 0;
}/*银行家算法 用于死锁的避免 */
#define N 5 //进程数目 
#define M 3 //资源数目
int max[N][M];//max[i][j] 表示进程 i 对进程 j 的资源需求量
int allocation[N][M]; // allocation[i][j] 表示进程 i 已经获得的 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]; // 系统中当前所有的资源数目 
int finish[N];//进程的完成情况  
int count = 0 ;//安全序列的个数  
void initialize()
{
     int j =0 ;//资源  
     int i= 0 ;//进程 
     for(j=0;j<M;j++){
        printf("%d资源的avaiable数目:\t",j);
        scanf("%d",&avaiable[j]);
} //输入avaiable 数目 
     for(i=0;i<N;i++){
       for(j=0;j<M;j++){
           printf("进程 %d 所需 %d 资源的最大数目:\t",i,j);
           scanf("%d",&max[i][j]); 
       }
     }//输入 max 数目 
     for(i=0;i<N;i++){
       for(j=0;j<M;j++){
           printf("进程%d占有%d资源的数目:\t",i,j);
           scanf("%d",&allocation[i][j]); 
       }
     }// 输入 allocation 数目 
      for(i=0;i<N;i++){
       for(j=0;j<M;j++){
         need[i][j] = max[i][j]-allocation[i][j];
       }
           }//计算 need 数目  
     for(j=0;j<M;j++){
        finish[j] = 0 ;
     }//赋值 finish 为零 表示 均未完成      
      for(j=0;j<M;j++){      
          work[j] = avaiable[j]; //赋值 初始 为系统可用的资源数    
     }
     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];//当前执行进程 
           printf("进程 %d 执行 : ",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 ;//正常结束 
           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 ;
           //恢复数据 
         }//够分  
     }
} //安全性检测 
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 资源数目:\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("无法进入安全序列,系统处于不安全状态\n");
 }
}
void banker(){
 initialize(); 
 int choice = 0 ;
 int j ;
 while(1){
 printf("请选择要进行的操作 : 1 判断当前的状态   2 请求  3 exit \n");
scanf("%d",&choice);
 if(choice==1){
           trace(0);
           if(!status){ 
               printf("无法进入安全序列,系统处于不安全状态\n");
           }
             for(j=0;j<M;j++){
        finish[j] = 0 ;
     }//赋值 finish 为零 表示 均未完成      
          for(j=0;j<M;j++){      
          work[j] = avaiable[j]; //赋值 初始 为系统可用的资源数  
          }}
     
 if(choice==2){
    request();
    for(j=0;j<M;j++){
        finish[j] = 0 ;
     }//赋值 finish 为零 表示 均未完成      
         for(j=0;j<M;j++){      
          work[j] = avaiable[j]; //赋值 初始 为系统可用的资源数  
       }
 }
 if(choice==3){
    return ;
 }
}
}//银行家算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342