首页 > 代码库 > 进程调度模拟

进程调度模拟

操作系统原理进程调度模拟,基本思想:时间片轮转+优先级调度+可抢占,总是运行最高优先级进程(0~sizeof(int))

进程队列采用链表形式进行组织,进程数据结构如下:pro_id-->进程控制号,priority-->进程优先级,time_slice-->进程分配的时间片,*next-->指向下一进程

进程组织形式为单链表,没有采用双链表,在进行进程调度(就绪态提升到运行态)和唤醒进程(阻塞态转为就绪态)时进行了一下特殊处理:1、优先级调度,通过pcb_ready *getHighRdy(int *head_flag)返回最高优先级进程控制块指针,添加了一个head_flag标志位,返回最高优先级进程前一个进程控制块地址,便于操作,head_flag标志位用来标记是否为头结点进行处理;2、通过进程控制号pri_id唤醒进程,同理根据pcb_blocked *findWaitById(int id,int *head_flag)查找所对应id前一个进程控制块的地址

My OS Run a Pace 为运行一个系统时间片,运行一个系统时钟即系统滴答,若此时没有更高优先级的进程添加到就绪队列且当前运行进程的时间片没有运行完,就继续执行当前运行进程,否则从就绪队列中选择最高优先级的进程提升到运行态,支持可抢占式的

运行环境:codeblocks

整体代码如下:

  1 #include <stdio.h>  2 #include <stdlib.h>  3   4 #define PACE 1  //系统滴答时钟  5   6 typedef struct pcb          //处于运行状态的进程  7 {  8     int pro_id;     //进程控制号  9     int priority; 10     int time_slice; //时间片 11     struct pcb *next; 12 }pcb; 13  14 typedef pcb pcb_running; 15 typedef pcb pcb_ready; 16 typedef pcb pcb_blocked; 17  18 pcb_running *pcb_run; 19 pcb_blocked *pcb_wait; 20 pcb_ready   *pcb_rdy; 21  22 int pid_no=1;                       //添加的进程id控制号 23  24 void pcb_init(); 25 void print_menu(); 26 void process_create(); 27 void addProcessToRdy_Blocked(pcb *rdy_new,int flag);//0:添加pcb_rdy 1:添加pcb_wait 28 void runToBlocked();                //将当前运行进程挂起 29 void blockedToRdy();          //根据进程控制块中id号将阻塞进程唤醒 30 void swByPrio();                    //根据优先级进行进程调度 31 pcb_ready *getHighRdy(int *head_flag);               //优先级最高的进程控制块信息 32 pcb_blocked *findWaitById(int id,int *head_flag);         //根据id号找到要唤醒的阻塞进程 33 void printProcessInfo(); 34 void do_exit();                    //释放进程占用内存块 35  36 int main() 37 { 38     char choice; 39     pcb_init(); 40     while(1){ 41         print_menu(); 42         choice=getchar(); 43         if(choice>=0&&choice<=5){ 44             switch(choice){ 45             case 1: process_create(); break; 46             case 2: swByPrio();break; 47             case 3: runToBlocked();break; 48             case 4: blockedToRdy();break; 49             case 5: printProcessInfo();break; 50             case 0: do_exit(); exit(0); 51             default: break; 52             } 53             getchar();      //读入enter键 54         } 55         else 56             printf("\nPlease enter number 0~5:\n"); 57     } 58  59     return 0; 60 } 61 void pcb_init() 62 { 63     pcb_run=NULL; 64     pcb_wait=NULL; 65     pcb_rdy=NULL; 66 } 67 void print_menu() 68 { 69     printf("\n"); 70     printf("1 - Create Process \n"); 71     printf("2 - My OS run a pace \n"); 72     printf("3 - Blocked the running process \n"); 73     printf("4 - Wakeup process by id \n"); 74     printf("5 - Display process info \n"); 75     printf("0 - Exit\n"); 76 } 77 void process_create() 78 { 79     int priority,time_slice; 80     pcb_ready *rdy_new; 81     rdy_new=(pcb_ready*)malloc(sizeof(pcb_ready)); 82     if(rdy_new==NULL) 83         exit(-1); 84  85     printf("Please enter the priority、time_slice of the process\n"); 86     scanf("%d%d",&priority,&time_slice); 87  88     rdy_new->pro_id=pid_no++; 89     rdy_new->priority=priority; 90     rdy_new->time_slice=time_slice; 91     rdy_new->next=NULL; 92  93     addProcessToRdy_Blocked(rdy_new,0); 94 } 95 void addProcessToRdy_Blocked(pcb *rdy_new,int flag) 96 { 97     if(flag){ 98         if(pcb_wait==NULL) //就绪进程队列为空 99             pcb_wait=rdy_new;100         else{             //将添加进来的进程直接添加到队首101             rdy_new->next=pcb_wait->next;102             pcb_wait->next=rdy_new;103         }104     }105     else{106         if(pcb_rdy==NULL) //就绪进程队列为空107             pcb_rdy=rdy_new;108         else{             //将添加进来的进程直接添加到队首109             rdy_new->next=pcb_rdy->next;110             pcb_rdy->next=rdy_new;111         }112     }113 }114 void runToBlocked()115 {116     addProcessToRdy_Blocked(pcb_run,1);117     pcb_run=NULL;118 }119 pcb_blocked *findWaitById(int id,int *head_flag)120 {121     pcb_blocked *wait,*w;122     if(pcb_wait==NULL)123         wait=NULL;124     else if(pcb_wait->pro_id==id){125          wait=pcb_wait;126          *head_flag=1;127     }128     else{129         w=pcb_wait;130         while(w->next){131             if(w->next->pro_id==id){132                 wait=w;133                 *head_flag=0;134                 break;135             }136             w=w->next;137         }138     }139     return wait;140 }141 void blockedToRdy()142 {143     pcb_blocked *blocked;144     int process_id,head_flag=0;145     printf("Please enter the ready process id that you want to wakeup \n");146     scanf("%d",&process_id);147     blocked=findWaitById(process_id,&head_flag);         //返回id的头一个结点148     if(blocked==NULL){              //没有找到对应id的阻塞进程149         printf("The blocked process id is wrong \n");150     }151     else if(head_flag)             //头结点152         pcb_wait=pcb_wait->next;153     else                           //blocked指向唤醒进程前一个进程地址154         blocked->next=blocked->next->next;155 156     addProcessToRdy_Blocked(blocked,0);157 158 }159 pcb_ready *getHighRdy(int *head_flag)160 {161     pcb_ready *rdy,*r;162     if(pcb_rdy==NULL)163         rdy=NULL;164     else{165         r=rdy=pcb_rdy;166         *head_flag=1;167         while(r->next){168             if(rdy->priority>=r->next->priority){169                 rdy=r;              //返回最高优先级控制块前一个进程控制块170                 *head_flag=0;171             }172             r=r->next;173         }174     }175     //printf("%d\n",rdy->pro_id);176     if(pcb_run!=NULL&&rdy!=NULL){177         if(rdy->next->priority>=pcb_run->priority)//就绪队列中最高优先级的进程小于运行进程的优先级178             rdy=NULL;179     }180     return rdy;181 }182 void swByPrio()183 {184     pcb_ready *rdy,*pcb_temp;185     int head_flag=0;186     if(pcb_run!=NULL){187         pcb_run->time_slice-=PACE;188         if(pcb_run->time_slice<=0){189             free(pcb_run);190             pcb_run=NULL;191             printf("The process has already finished \n");192         }193     }194 195     rdy=getHighRdy(&head_flag);196     if(rdy==NULL)197         printf("the running priority is highest or ready queue is null\n");198     else if(head_flag){                 //运行的进程为就绪队列头结点199         pcb_temp=pcb_run;200         pcb_run=rdy;201         pcb_rdy=pcb_rdy->next;202 203         pcb_run->next=NULL;204 205         if(pcb_temp!=NULL)206             addProcessToRdy_Blocked(pcb_temp,0);       //将运行进程添加到就绪队列207     }208     else {                              //运行的进程非头结点209         pcb_temp=pcb_run;210         pcb_run=rdy->next;211         rdy->next=rdy->next->next;      //在就绪队列中删除转为运行的进程212 213         pcb_run->next=NULL;214         if(pcb_temp!=NULL)215             addProcessToRdy_Blocked(pcb_temp,0);       //将运行进程添加到就绪队列216     }217 }218 void printProcessInfo()219 {220     pcb_ready *rdy;221     pcb_blocked *wait;222 223     printf("run process:\n");224     if(pcb_run)225         printf("id:%2d\tpriority:%2d\ttime_slice:%2d\n",pcb_run->pro_id,pcb_run->priority,pcb_run->time_slice);226     else227         printf("the run queue is null\n");228 229     rdy=pcb_rdy;230     printf("Ready process:\n");231     if(rdy){232         while(rdy){233         printf("id:%2d\tpriority:%2d\ttime_slice:%2d\n",rdy->pro_id,rdy->priority,rdy->time_slice);234         rdy=rdy->next;235         }236     }237     else238         printf("the ready queue is null\n");239 240     wait=pcb_wait;241     printf("wait process:\n");242     if(wait!=NULL){243         while(wait){244         printf("id:%2d\tpriority:%2d\ttime_slice:%2d\n",wait->pro_id,wait->priority,wait->time_slice);245         wait=wait->next;246         }247     }248     else249         printf("the wait queue is null\n");250 }251 void do_exit()252 {253     pcb *pcb_next;254     if(pcb_run!=NULL)255         free(pcb_run);256 257     if(pcb_rdy!=NULL){258         while(pcb_rdy){259             pcb_next=pcb_rdy->next;260             free(pcb_rdy);261             pcb_rdy=pcb_next;262         }263     }264 265     if(pcb_wait!=NULL){266         while(pcb_wait){267             pcb_next=pcb_wait->next;268             free(pcb_wait);269             pcb_wait=pcb_next;270         }271     }272 }

 

 

进程调度模拟