首页 > 资讯 > > > 正文
手把手教你用C语言实现程序调度机制
发布时间:2023-05-13 08:06:39   来源:面包芯语  


【资料图】

概念图

实现过程

#include#include#include#include#include#include#defineu8char#defineu32unsignedint#defineMAXLINE1024//工作队列和等待队列长度#defineMAXNUM100#defineWAIT0//进程状态为WAIT#defineRUN1//进程状态为RUN#defineFINISH2//进程状态为FINISH#defineNEWBUF1//此时工作队列为新队列#defineBUF0//此时工作队列为默认队列#defineTHENULL0//表示进程块此时为NULL#defineTHETRUE1//表示进程块此时有进程char*VALUE="abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\0";
structPCB{FILE*open_file;u8*file_name;clock_tarrive_time;//到达时间clock_tlevel_time;//结束时间intprior_number;//优先级u8program_status;//程序状态u8detection_null_or_value;//判断此时进程块是否为空u8occupy_time_slice_times;//已占用的CPU时间intdata_write_number;//记录已经向文件中写入内容的长度};#definePCB_TstructPCB*
structprogram_queue{structPCBpcb_buf[MAXLINE];//默认队列,一开始将进程块存入这里structPCBpcb_new_buf[MAXLINE];//与默认队列交替管理进程块u32queue_line;//工作队列的长度u8buf_state;//判断此时正在使用的是哪一个队列};#defineprogram_queue_tstructprogram_queue*
structcpu_time_slice{clock_tstart_time;//时间片开始执行时间clock_tend_time;//时间片结束执行时间u32time_slice_bulk;//每个时间片的时间,单位ms};#definecpu_time_slice_tstructcpu_time_slice*
voidbzero_queue_new(program_queue_tqueue_t){for(inti=0;ipcb_new_buf[i].detection_null_or_value=THENULL;//detection_null_or_value等于THENULL表示这个结构体为空}}
voidbzero_queue(program_queue_tqueue_t){for(inti=0;ipcb_buf[i].detection_null_or_value=THENULL;}}
voidinit_time_slice(cpu_time_slice_ttime_slice){time_slice->time_slice_bulk=20;//设置一个时间片时间为20ms}
voidinit_program_queue(program_queue_tqueue){bzero_queue(queue);bzero_queue_new(queue);queue->queue_line=0;queue->buf_state=BUF;//设置此时工作队列默认使用的pcb_buf}
voidqueue_sort(program_queue_tqueue_t){intlen=queue_t->queue_line;//获取工作队列长度if(len==0)return;if(queue_t->buf_state==BUF)//判断当前使用哪个数组作为工作队列{bzero_queue_new(queue_t);structPCBtm;tm.program_status=-1;PCB_Ttmp_pcb=&tm;for(inti=0;iqueue_line;i++)//开始排序{for(intj=0;jqueue_line;++j){if(queue_t->pcb_buf[j].detection_null_or_value==THENULL)continue;if(j<=0)tmp_pcb=&(queue_t->pcb_buf[j]);elseif(-1==tmp_pcb->program_status)tmp_pcb=&(queue_t->pcb_buf[j]);else{if(tmp_pcb->prior_number>queue_t->pcb_buf[j].prior_number){tmp_pcb=&(queue_t->pcb_buf[j]);}}}queue_t->pcb_new_buf[i]=*tmp_pcb;tmp_pcb->detection_null_or_value=THENULL;}queue_t->buf_state=NEWBUF;//由另一个数组接收排序结果,排序完全结束后切换列表目前使用的数组}else{bzero_queue(queue_t);structPCBtm;tm.program_status=-1;PCB_Ttmp_pcb=&tm;for(inti=0;iqueue_line;i++){for(intj=0;jqueue_line;++j){if(queue_t->pcb_new_buf[j].detection_null_or_value==THENULL)continue;if(j<=0)tmp_pcb=&(queue_t->pcb_new_buf[j]);elseif(-1==tmp_pcb->program_status)tmp_pcb=&(queue_t->pcb_new_buf[j]);else{if(tmp_pcb->prior_number>queue_t->pcb_new_buf[j].prior_number){tmp_pcb=&(queue_t->pcb_new_buf[j]);}}}queue_t->pcb_buf[i]=*tmp_pcb;tmp_pcb->detection_null_or_value=THENULL;}queue_t->buf_state=BUF;}}
voidinit_pcb_object(PCB_Tpcb_t,char**argv,inti){pcb_t->open_file=NULL;if(NULL==(pcb_t->open_file=fopen(argv[i],"a"))){perror("openfileerror");exit(0);}pcb_t->file_name=argv[i];pcb_t->prior_number=rand()%8;//进程优先级由随机数分配pcb_t->arrive_time=clock();//获取进程进入时间pcb_t->program_status=WAIT;//设置进程状态为等待pcb_t->detection_null_or_value=THETRUE;//设置次进程块非空pcb_t->occupy_time_slice_times=0;//初始化使用CPU时间为0pcb_t->data_write_number=0;//文件写入内容长度初始化为0}
intmain(intargc,char**argv){if(argc<=1){perror("parameter<=1");exit(1);}structprogram_queue_queue;//创建工作队列对象init_program_queue(&_queue);structcpu_time_slicects;//创建CPU时间片对象init_time_slice(&cts);intprogram_numer=argc-1;//设置目前的进程数为argc-1,该变量用于通过下标访问进程需要-1for(inti=1;i=program_numer)break;for(inti=0;i<_queue.queue_line;i++){if(_queue.buf_state==BUF){if(THENULL==_queue.pcb_buf[i].detection_null_or_value)continue;printf("waitqueue:");for(intk=0;k<_queue.queue_line;k++){if(THENULL==_queue.pcb_buf[k].detection_null_or_value)continue;//如果该进程块为空就跳过printf("[%s]",_queue.pcb_buf[k].file_name);}//打印等待执行的进程名称printf("\nprogramstartoperation...\n");printf("operationprogramname:%s\n",(_queue.pcb_buf[i].file_name));//打印将要执行的进程名称_queue.pcb_buf[i].program_status=RUN;//更改进程块状态}else{if(THENULL==_queue.pcb_new_buf[i].detection_null_or_value)continue;printf("waitqueue:");for(intk=0;k<_queue.queue_line;k++){if(THENULL==_queue.pcb_new_buf[k].detection_null_or_value)continue;printf("[%s]",_queue.pcb_new_buf[k].file_name);}printf("\nprogramstartoperation...\n");printf("operationprogramname:%s\n",(_queue.pcb_new_buf[i].file_name));_queue.pcb_new_buf[i].program_status=RUN;}cts.start_time=clock();//获取开始时间while(1)//进程开始执行{cts.end_time=clock();//获取结束时间if(cts.end_time-cts.start_time>=cts.time_slice_bulk)//结束时间-开始时间=预设的时间片长度则进程终止执行{if(_queue.buf_state==BUF){_queue.pcb_buf[i].program_status=WAIT;_queue.pcb_buf[i].prior_number++;//进程使用CPU时间+1_queue.pcb_buf[i].occupy_time_slice_times++;_queue.pcb_new_buf[i]=_queue.pcb_buf[i];//将进程放到另一个队列等待_queue.pcb_buf[i].detection_null_or_value=THENULL;//将当前队列的此进程块设为空}else{_queue.pcb_new_buf[i].program_status=WAIT;_queue.pcb_new_buf[i].prior_number++;_queue.pcb_new_buf[i].occupy_time_slice_times++;_queue.pcb_buf[i]=_queue.pcb_new_buf[i];_queue.pcb_new_buf[i].detection_null_or_value=THENULL;}break;}if(_queue.buf_state==BUF){if(VALUE[_queue.pcb_buf[i].data_write_number]=="\0")//判断进程是否已经完成任务{_queue.pcb_buf[i].level_time=clock();//获取结束时间printf("program[%s]executeend...programruntime:%dms\n",_queue.pcb_buf[i].file_name,_queue.pcb_buf[i].level_time-_queue.pcb_buf[i].arrive_time);//进程的结束时间减去进程的进入时间计算出进程运行耗时_queue.pcb_buf[i].detection_null_or_value=THENULL;fclose(_queue.pcb_buf[i].open_file);//关闭文件program_numer--;//进程数-1break;}if(-1==fputc(VALUE[_queue.pcb_new_buf[i].data_write_number],_queue.pcb_new_buf[i].open_file))//向文件中写入数据{perror("writeerror\n");perror(strerror());for(inti=0;_queue.queue_line;i++){fclose(_queue.pcb_buf[i].open_file);}//exit(1);}else{_queue.pcb_buf[i].data_write_number++;//写入内容的长度+1}}else{if(VALUE[_queue.pcb_new_buf[i].data_write_number]=="\0"){_queue.pcb_new_buf[i].level_time=clock();printf("program[%s]executeend...programruntime:%dms\n",_queue.pcb_new_buf[i].file_name,_queue.pcb_new_buf[i].level_time-_queue.pcb_new_buf[i].arrive_time);_queue.pcb_new_buf[i].detection_null_or_value=THENULL;fclose(_queue.pcb_new_buf[i].open_file);program_numer--;break;}if(-1==fputc(VALUE[_queue.pcb_new_buf[i].data_write_number],_queue.pcb_new_buf[i].open_file)){perror("writeerror\n");perror(strerror());for(inti=0;_queue.queue_line;i++){fclose(_queue.pcb_new_buf[i].open_file);}//exit(1);}else{_queue.pcb_new_buf[i].data_write_number++;}}}}if(_queue.buf_state==BUF)//更换当前队列{_queue.buf_state=NEWBUF;queue_sort(&_queue);//重新按照优先级排序队列}else{_queue.buf_state=BUF;queue_sort(&_queue);}}return0;}

觉得文章不错,点击“分享”、“赞”、“在看” 呗!

关键词:

推荐内容

Copyright@  2015-2022 青年器材装备网版权所有  备案号: 皖ICP备2022009963号-20   联系邮箱:39 60 291 42@qq.com