📄 单处理器系统的进程调度.c
字号:
#include <stdio.h>
struct pcb
{
int name; /*进程标识符*/
int status; /*进程状态*/
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
int pc; /*进程现场信息,程序计数器内容*/
int psw; /*进程现场信息,程序状态字寄存器内容*/
int next; /*下一个进程控制块的位置*/
};
int run; /*定义指向正在运行进程的进程控制块的指针*/
struct
{
int head;
int tail;
} ready; /*定义指向就绪队列的头指针head和尾指针tail*/
int pfree;
struct pcb pcbarea[10];
int life[10];
void Init();
void Print();
void SelectRun();
int IsNotIn(int v,int *array);
int IsUniqe(int v,struct pcb *array);
void Run();
int main(void)
{
Init();
printf("现在系统中有10个等待的进程:\n");
while(1)
{
Print();
SelectRun();
Run();
}
return 0;
}
void Init()
{
int count;
int i;
int max=0;
int tmp;
ready.head = -1;
ready.tail = -1;
pfree = 0;
run = -1;
for (i=0;i<10;i++)
life[i] = 0;
printf("请输入您将输入的进程数目(2~10):\n");
scanf("%d",&count);
while (count<2 || count>10)
{
printf("输入数据不符,请重新输入:\n");
scanf("%d",&count);
}
for(i=0;i<10;i++)
pcbarea[i].name = 0;
for( i=0;i<count;i++)
{
printf("请输入第%d个进程ID\n",i+1);
scanf("%d",&tmp);
while(tmp <1 || !IsUniqe(tmp,pcbarea))
{
printf("输入不符。请重新输入:\n");
scanf("%d",&tmp);
}
pcbarea[i].name=tmp;
if(pcbarea[i].name>max)
max = pcbarea[i].name;
pcbarea[i].next=i+1;
pcbarea[i].pc=0;
pcbarea[i].status=0; /*等待*/
}
if (count <10)
{
printf("此时系统中还有 %d个其他等待的进程.\n",10-count);
for(;i<10;i++)
{
pcbarea[i].name=i+max;
pcbarea[i].next=i+1;
}
}
pcbarea[9].next=-1;
}
void Print()
{
int i ;
for(i=pfree;i!=-1;i=pcbarea[i].next)
printf("%d.进程ID %d\n",i,pcbarea[i].name);
}
void SelectRun()
{
int selected[10],lifetmp[10];
int select[10];
int m=1,n;
char c;
int i=0;
int tmp;
for(;i<10;i++)
{
selected[i]=0;
lifetmp[i]=0;
select[i]=-1;
}
printf("输入想要调度的进程ID和生命周期(\"n,12\"):\n");
scanf("%d,%d",&selected[0],&lifetmp[0]);
while (IsUniqe(selected[0],pcbarea))
{
printf("没有该进程存在!!");
printf("输入想要调度的进程ID和生命周期(\"n,12\"):\n");
scanf("%d,%d",&selected[0],&lifetmp[0]);
}
while(1)
{
if (m==10)
break;
getchar();
printf("还要继续激活其他进程吗?(Y/N):");
scanf("%c",&c);
if (c=='N' || c=='n')
break;
printf("输入想要调度的进程ID和生命周期(\"n,12\"):\n");
scanf("%d,%d",&tmp,&lifetmp[m]);
if (!IsNotIn(tmp,selected))
{
printf("该进程不需再激活,本次操作失败!\n");
selected[m] = 0;
lifetmp[m] = 0;
continue;
}
selected[m] = tmp;
if (IsUniqe(selected[m],pcbarea))
{
printf("没有该进程存在!!\n");
selected[m] = 0;
lifetmp[m]=0;
continue;
}
m++;
}
for (i=0,n=0;i<10 && selected[i] != 0;i++,n++)
{
for (m=0;m !=-1;m=pcbarea[m].next)
{
if(pcbarea[m].name == selected[i])
{
select[n]=m;
life[n] = lifetmp[i];
break;
}
}
if(m==-1)
{
n--;
printf("进程 %d 已经结束了。\n",pcbarea[selected[i]].name);
}
}
ready.head = select[0];
ready.tail = select[0];
if (select[0]==pfree)
{
pfree = pcbarea[pfree].next;
pcbarea[select[0]].next = -1;
}
else{
for(m=pfree;m!=-1 && pcbarea[m].next !=select[0];m=pcbarea[m].next)
;
pcbarea[m].next = pcbarea[select[0]].next;
pcbarea[select[0]].next = -1;
}
for(i=1;i<10 && select[i]!=-1;i++)
{
pcbarea[ready.tail].next = select[i];
if (select[i]==pfree)
{
pfree = pcbarea[pfree].next;
pcbarea[select[i]].next = -1;
}
else{
for(m=pfree;m!=-1 && pcbarea[m].next !=select[i];m=pcbarea[m].next)
;
pcbarea[m].next = pcbarea[select[i]].next;
pcbarea[select[i]].next = -1;
}
ready.tail = select[i];
}
}
void Run()
{
int point = 0;
int total=0;
int i = ready.head;
for (;i!=-1;total++,i=pcbarea[i].next)
;
while(ready.head!=-1)
{
printf("进程 %d 被调度. PC = %d\n",pcbarea[ready.head].name,pcbarea[ready.head].pc);
pcbarea[ready.head].pc++;
if (pcbarea[ready.head].pc == life[point])
{
int tmp;
printf("进程 %d 结束运行\n",pcbarea[ready.head].name);
tmp = ready.head;
ready.head = pcbarea[ready.head].next;
if (ready.head==-1)
continue;
pcbarea[tmp].next=-1;
total--;
for (i=point;i<total;i++)
life[i]=life[i+1];
life[total] = 0;
}else
{
point++;
point %= total;
pcbarea[ready.tail].next = ready.head;
ready.tail = ready.head;
ready.head = pcbarea[ready.head].next;
pcbarea[ready.tail].next = -1;
}
}
}
int IsNotIn(int v,int *array)
{
int i=0;
for (;i<10;i++)
{
if(array[i] == v)
return 0;
}
return 1;
}
int IsUniqe(int v,struct pcb *array)
{
int i=0;
for (;i<10;i++)
{
if(array[i].name == v)
return 0;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -