intproc_switch()
{
/*若高优先级就绪队列和低优先级就绪队列均为空,则循环执行进程唤醒*/
while(Hready==NULLLready==NULL)
if(!proc_wakeup())return0;
/*若高优先级就绪队列非空,则执行其第一个进程 , 分配2个时间片*/
if(Hready!=NULL){
running=Hready;
Hready=Hready-next;
running-runtime=2;
}
/*若高优先级就绪队列为空 , 则执行低优先级就绪队列的第一个进程 ,
分配5个时间片*/
else{
running=Lready;
Lready=Lready-next;
running-runtime=5;
}
/*别调度进程的id赋给sig*/
sig=running-pname;
return1;
}
/*功能:进程等待 。将当前运行进程置高优先级,等待时间为20,
插入等待队列尾部*/
/*入口参数:无*/
/*出口参数:无*/
voidproc_wait()
{
structPCB*p;
running-pri=1;
running-waittime=20;
InsertIntoQueueTail(wait,running);
sig=0;
return;
}
/*功能:进程唤醒*/
/*入口参数:无*/
/*出口参数:若等待队列为空 , 则返回0,否则返回1*/
intproc_wakeup()
{
structPCB*p,*last,*MoveToReady;
p=wait;
/*等待队列为空,返回0*/
if(p==NULL)return0;
/*延迟*/
delay();
/*等待队列中每个进程的等待时间减1*/
while(p!=NULL){
p-waittime-=1;
p=p-next;
}
p=wait;
/*从等待队列中摘除等待时间为0的进程 , 插入到高优先级就绪队列的尾部*/
while(p!=NULL){
if(p-waittime==0){
MoveToReady=p;
if(p==wait)
wait=p-next;
else
last-next=p-next;
p=p-next;
InsertIntoQueueTail(Hready,MoveToReady);
}
else{
p=p-next;
}
}
sig=0;
return1;
}
用C语言编写一段简单的程序,作业调度和低级调度算法真不容易啊,怕是没人弄了!
优先级调度算法程序:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct node
{
char name[10];/*进程标识符*/
int prio;/*进程优先数*/
int round;/*进程时间轮转时间片*/
int cputime; /*进程占用CPU时间*/
int needtime; /*进程到完成还要的时间*/
int count;/*计数器*/
char state; /*进程的状态*/
struct node *next; /*链指针*/
}PCB;
PCB *finish,*ready,*tail,*run; /*队列指针*/
int N; /*进程数*/
/*将就绪队列中的第一个进程投入运行*/
firstin()
{
run=ready;/*就绪队列头指针赋值给运行头指针*/
run-state='R';/*进程状态变为运行态*/
ready=ready-next;/*就绪对列头指针后移到下一进程*/
}
/*标题输出函数*/
void prt1(char a)
{
if(toupper(a)=='P') /*优先数法*/
printf("namecputimeneedtimeprioritystate\n");
else
printf("namecputimeneedtimecountroundstate\n");
}
/*进程PCB输出*/
void prt2(char a,PCB *q)
{
if(toupper(a)=='P')/*优先数法的输出*/
printf("%-10s%-10d%-10d%-10d %c\n",q-name,
q-cputime,q-needtime,q-prio,q-state);
else/*轮转法的输出*/
printf("%-10s%-10d%-10d%-10d%-10d %-c\n",q-name,
q-cputime,q-needtime,q-count,q-round,q-state);
}
/*输出函数*/
void prt(char algo)
{
PCB *p;
prt1(algo);/*输出标题*/
if(run!=NULL) /*如果运行指针不空*/
prt2(algo,run); /*输出当前正在运行的PCB*/
p=ready;/*输出就绪队列PCB*/
while(p!=NULL)
{
prt2(algo,p);
p=p-next;
}
p=finish;/*输出完成队列的PCB*/
while(p!=NULL)
{
prt2(algo,p);
p=p-next;
推荐阅读
- GIS充气量,GIS充气量一般多少
- 如何建立电商粉丝模型,电商粉丝平台
- 网络游戏安全公司起名,网络游戏公司取名字大全
- 网页搜索栏代码java 网页制作搜索框代码
- ERP系统评估使用情况,erp系统建议
- 网络天才一样的游戏,网络天才一样的游戏叫什么
- gis10.5左边的工具栏,gis左侧工具栏
- mysql中怎么查日期 mysql 查询日期
- chatgpt雅思作文和口语,雅思口语小作文