处理机-优先数

处理机-优先数

#include  
#include 
#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  
#include 
#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 
#include 
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=N){
      count++ ;
      status = 1 ;//可以分配 
      int p = 0 ;
      printf("按如下次序分配安全\n");
      for(p=0;pwork 
         for(j=0;jwork[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;jneed[i][j])
     {
        printf("超过事先声明的最大需求量 ,该申请不能被分配 \n");
        return ;
                        
     }
  }
  for(j=0;javaiable[j])
     {  
        printf("无足够资源分配  ,该申请不能被分配 \n");
        return ;
  }
  }
  for(j=0;j

你可能感兴趣的:(处理机-优先数)