⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 23.c

📁 进程调度算法!
💻 C
字号:
#define NULL 0
#include 
#include 
#include 
#include 
//定义一个pcb的结构体

FILE *GroupFile[10];

typedef struct index{ 
char name; //指令
int time; //指令执行时间
}index;

struct pcb {
char filename[10]; //进程名
int id; //作业编号
int exetoIndex; //当前正在执行指令
char status; //当前状态
int wtime; //等待时间
};

struct pcb jobpcb[100]; //pcb表


typedef struct job{
index idx[100]; //指令集
int pcbnum; //pcb编号 对应
}job;

job jobtab[100]; //作业表

char jobp[3][50]; //作业
//队列
struct Qnode
{
int pcbnum[100]; //pcb编号 
int head,tail; 
};

struct Qnode Queue[5]; //5个队列 0E 1R 2I 3O 4W 

void initqueue(struct Qnode *l);

//延迟
void delay( ){

long begin,end;
time(&begin);
do {
time(&end);
} while((end-begin)<=1);
}

//字符转化为数值
int change(char *m){ 
int i,j=0;
int len=strlen(m);
for(i=0;i j=j*10+m[i]-'0';
return j;
}

//申请 pcb

int AllocPCB(){
int i;
for(i=0;i<3;i++)
if(jobpcb[i].id ==-1) break;
if(i<3)
return i;
return -1;
}
//申请job
int AllocJob(){

int i;

for(i=0;i<3;i++)
if(jobtab[i].pcbnum == -1) break;
if(i<3)
return i;
return -1;

}
//显示指令
void displayIndex(){
int i,j;

for(i=0;i<3;i++){
printf(" Job % d \n",i+1);
for(j=0;j<10;j++)
printf(" %d %c % d \n",j+1, jobtab[i].idx[j].name,jobtab[i].idx[j].time);
}

}

//创建进程程序
int creatpcbline(){
char line[10];
inti,ll,jnum, pnum, ln=0, bpos, pos=0;
char buff[50];
char name [20];
char ch;

for(i=0;i<3;i++){
ln=0;
jnum=AllocJob();
if(jnum == -1) return 0;
pnum=AllocPCB();
if(pnum == -1) return 0;
jobtab[jnum].pcbnum=pnum;
strcpy(jobpcb[pnum].filename," "); 
jobpcb[pnum].status='r';
jobpcb[pnum].exetoIndex=0;
jobpcb[pnum].id=jnum;
jobpcb[pnum].wtime=0;
int ln=strlen(jobp[i]);
pos=0;
while(pos while(jobp[i][pos]==' ') pos++;

jobtab[jnum].idx[ln].name=jobp[i][pos++];///

while(jobp[i][pos]==' ') pos++;

bpos=0;

while(jobp[i][pos]!=' ')

buff[bpos++]=jobp[i][pos++];

buff[bpos]='\0';

jobtab[jnum].idx[ln].time=change(buff);/////

if(pos}
}
}
displayIndex();
}
/*初始化队列
void initqueue(struct Qnode *l){ 
l->head=0;
l->tail=0;
}


//插进入队列/
void insertqueue(struct Qnode *l,int pcbnum){
l->pcbnum[l->tail++]=pcbnum;

}

//队列是否为空


int EmptyQueue( struct Qnode l){
if(l.head==l.tail) return 1;
return 0;
}

//删除队列
void outqueue(struct Qnode *l,int *pcbnum)
{
if (l->head>=l->tail ) *pcbnum=-1;
else
*pcbnum=l->pcbnum[l->head++];



}
//显示作业
void display(){
int i,j;

for(i=0;i<5;i++){

printf(" 队列 %d ",i); 
for(j=Queue[i].head;j 

printf("pcb 编号 %d \n\n ",Queue[i].pcbnum[j]); 




}

}






//作业入队列
void JobEnQueueInit( int * total){

int i,num ,Index=0;

char cmd;

for( i=0;i<3;i++){

if(jobpcb[i].id>=0){
cmd=jobtab[ jobpcb[i].id ].idx[ Index ].name;

switch(cmd){
case 'c': insertqueue(&Queue[1],i); jobpcb[i].status='r'; break;
case 'i': insertqueue(& Queue[2],i);jobpcb[i].status='i'; break;

case 'o': insertqueue(& Queue[3],i);jobpcb[i].status='o'; break;
case 'w': insertqueue(& Queue[4],i);jobpcb[i].status='w'; break;
case 'h': jobpcb[i].status='h'; num=jobpcb[i].id;jobtab[num].pcbnum=-1;jobpcb[i].id=-1;
}
if(cmd== 'h') {jobpcb[i].wtime=0; total--;}
jobpcb[i].wtime=jobtab [ jobpcb[i].id ].idx[Index].time;

(*total)++;




}
}


}



void save (){


FILE *fp;

int i;
fp=fopen("pcbtable.txt","a");


fprintf(fp," 文件名 作业编号 执行到指令数 所处状态 等待时间 \n" );

for(i=0;i<3;i++)

fprintf(fp," \t %s \t %d \t %d \t %c \t %d \n" ,
jobpcb[i].filename,jobpcb[i].id,jobpcb[i].exetoIndex,
jobpcb[i].status,jobpcb[i].wtime );

fclose(fp);



}






//作业入队列
void JobEnQueue( int pcbnum,int Index ,int *total){

int num;
char cmd;


if(jobpcb[pcbnum].id>=0){
cmd=jobtab[ jobpcb[pcbnum].id ].idx[ Index ].name;

switch(cmd){
case 'c': insertqueue(&Queue[1],pcbnum); jobpcb[pcbnum].status='r'; break;
case 'i': insertqueue(& Queue[2],pcbnum);jobpcb[pcbnum].status='i'; break;

case 'o': insertqueue(& Queue[3],pcbnum);jobpcb[pcbnum].status='o'; break;
case 'w': insertqueue(& Queue[4],pcbnum);jobpcb[pcbnum].status='w'; break;
case 'h': jobpcb[pcbnum].status='h'; num=jobpcb[pcbnum].id;jobtab[num].pcbnum=-1;jobpcb[pcbnum].id=-1;
}
if(cmd== 'h') {
jobpcb[pcbnum].wtime=0; 
printf(" \n\t\t作业 %d 完成\n", pcbnum+1, jobpcb[ pcbnum].status);
(*total)--;
}
else jobpcb[pcbnum].wtime=jobtab [ jobpcb[pcbnum].id ].idx[Index].time;

printf(" \n\t\t作业 %d \n ", pcbnum+1);
printf("\t\t\t\t所处状态 : %c \n",jobpcb[ pcbnum].status);
printf("\t\t还需要时间 %d 秒\n",jobpcb[ pcbnum].wtime);



}



}

//得到队列的首元素

int GetHead(struct Qnode l){
return l.pcbnum[l.head];
}
//执行
void run (){

int i, flag=0, time=10, pcbnum, Index=0, exenum, num, quenum;
char cmd;
int j,m,n;
int total=0;


JobEnQueueInit( &total );


save();
while( total!=0 ){ 
if(!EmptyQueue( Queue[1]) ){


outqueue(&Queue[1],&pcbnum);
insertqueue(&Queue[0], pcbnum); 



}
else pcbnum=GetHead(Queue[0]);

delay();
jobpcb[ pcbnum].status='e'; 
printf(" \n\t\t作业 %d \n",pcbnum+1);

printf(" \t\t\t所处状态: %c \t执行了 %d 秒\n", jobpcb[ pcbnum].status, time);


for(i=0;i<3;i++){ 

if(jobpcb[i].id>=0){



//所有的作业除在就绪队列获执行结束的外等待时间 都间时间片 
if( jobpcb[i].status!='r'&&jobpcb[i].status!='h') jobpcb[i].wtime=jobpcb[i].wtime-time;


if(jobpcb[i].wtime<=0){ //查找所有的队列 所在位置
for(j=0;j<5;j++){ 
for(m=Queue[j].head;m 

if(Queue[j].pcbnum[m]==i) {flag=1;break;}
}
if(flag==1) break;
}

if(flag==1){//删除该指令

for(n=m;n Queue[j].tail--; 
jobpcb[i].exetoIndex++;
Index=jobpcb[i].exetoIndex;
JobEnQueue( i,Index,&total );

} 



}


}
}


if(!EmptyQueue( Queue[1]) ){


outqueue(&Queue[0],&pcbnum);
if(jobpcb[pcbnum].wtime>0){
insertqueue(&Queue[1], pcbnum); 
jobpcb[pcbnum].status='r';
}

}






printf(" \n\n\t\t 还有\t %d 个作业没有完成 \n",total ); 
save();
} 


}



//初始化
void InitFile(){

int i;


strcpy (jobp[0]," c 20 i 20 o 15 h 0 ");////////////////////////改
strcpy (jobp[1]," i 10 c 20 c 10 h 0 ");
strcpy (jobp[2]," c 30 i 20 c 5 h 0 ");
for(i=0;i<100;i++){
jobpcb[i].exetoIndex=0;
strcpy(jobpcb[i].filename," ");
jobpcb[i].id=-1;
jobpcb[i].status='r';
jobpcb[i].wtime=0;
}

for(i=0;i<100;i++)
jobtab[i].pcbnum=-1;


for(i=0;i<5;i++)

initqueue(&Queue[i]);


//GroupFile[0]=fopen("1.txt","r");


//GroupFile[1]=fopen("2.txt","r");

//GroupFile[2]=fopen("3.txt","r");

}


void main(){

InitFile();
creatpcbline();
run ();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -