#includestdio.h
#includetime.h
#includestdlib.h
/*********************以下是全局数据结构和变量***********************/
/*PCB结构*/
structPCB{
intpname;
intpri;
intruntime;
intwaittime;
structPCB*next;
}pcb[7];
/*运行指针*/
structPCB*running;
/*高优先级就绪队列头指针*/
structPCB*Hready;
/*低优先级队列头指针*/
structPCB*Lready;
/*等待队列头指针*/
structPCB*wait;
intsig=0;
/**************************以下是函数说明****************************/
/*利用循环实现延迟*/
voiddelay();
/*模拟进程3-9*/
voidproc(structPCB*running);
/*将node插入到head所指示的队列的尾部*/
voidInsertIntoQueueTail(structPCB**head,structPCB*node);
/*进程调度函数*/
intproc_switch();
/*进程等待函数*/
voidproc_wait();
/*进程唤醒函数*/
intproc_wakeup();
/************************以下是函数定义及注释************************/
/*主函数*/
main()
{
inti;
/*初始化,创建进程3-9,置低优先级,等待时间为0 ,
依次插入低优先级队列*/
for(i=0;i7;i++){
pcb[i].pname=i+3;
pcb[i].pri=0;
pcb[i].waittime=0;
InsertIntoQueueTail(Lready,pcb[i]);
}
/*等待队列和高优先级队列为空*/
wait=NULL;
Hready=NULL;
printf("\nTheprocess_switchbegin:\n");
/*模拟进程调度开始*/
for(;;)
{
switch(sig){
【c语言日程调度函数 c语言日程表小程序】case0:/*无进程等待调度,打印信息并返回*/
if(!proc_switch())
{
printf("NoProcesstorun,pressanykeytoreturn:\n");
getchar();
}
break;
case1:proc_wait();
break;
case3:
case4:
case5:
case6:
case7:
case8:
case9:proc(running);
break;
default:printf("\nerror!");
exit(-1);
}
}
}
/*功能:延迟一个时间片*/
/*入口参数:无*/
/*出口参数:无*/
voiddelay()
{
inti,j;
for(i=0;i20000;i++)
for(j=0;j10000;j++)
{
}
}
/*功能:进程3-9*/
/*入口参数:运行指针*/
/*出口参数:无*/
voidproc(structPCB*running)
{
inti;
srand( (unsigned)time( NULL ) );
/*显示当前运行的进程的id*/
printf("\nNowProcess%disrunning\n",running-pname);
/*当前进程执行running-runtime个时间片*/
for(i=running-runtime;i0;i--){
/*显示剩余的时间片*/
printf("%dtimeslice(s)left\n",i);
/*延迟*/
delay();
proc_wakeup();
/*产生一个1到1000的随机数 , 若该随机数小余100 , 当前进程等待,*/
if((rand()%1000+1)100){
printf("Process%dbeginstowait.\n",running-pname);
sig=1;
return;
}
}
/*显示时间片耗尽,进程转为低优先级就绪状态*/
printf("Timeslicesforprocess%dexhausted.\n",running-pname);
InsertIntoQueueTail(Hready,running);
sig=0;
return;
}
/*功能:将一个节点插入队列尾部*/
/*入口参数:队列头指针地址head , 待插入结点node*/
/*出口参数:无*/
voidInsertIntoQueueTail(structPCB**head,structPCB*node)
{
structPCB*p;
node-next=NULL;
/*被插入队列为空*/
if(*head==NULL){
*head=node;
return;
}
/*被插入队列不为空*/
else{
p=*head;
/*找到队列的最后一个结点*/
while(p-next!=NULL)p=p-next;
p-next=node;
}
}
/*功能:进程调度*/
/*入口参数:无*/
/*出口参数:若调度成功,返回1,否则返回0*/
推荐阅读
- GIS充气量,GIS充气量一般多少
- 如何建立电商粉丝模型,电商粉丝平台
- 网络游戏安全公司起名,网络游戏公司取名字大全
- 网页搜索栏代码java 网页制作搜索框代码
- ERP系统评估使用情况,erp系统建议
- 网络天才一样的游戏,网络天才一样的游戏叫什么
- gis10.5左边的工具栏,gis左侧工具栏
- mysql中怎么查日期 mysql 查询日期
- chatgpt雅思作文和口语,雅思口语小作文