printf("%s%d%d\n",pcb2[i].name,pcb2[i].priority,pcb2[i].runtime);
printf("堵塞进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime);
break;
}
else
printf("该进程已是堵塞进程!
\n");
break;
}
if(x==3)
{
printf("-----------------唤醒进程---------------\n");
printf("请输入要唤醒的进程:
");
scanf("%s",name);
for(i=0;i{
if(strcmp(pcb1[i].name,name)==0)
{
t=i;
strcpy(pcb[k].name,pcb1[t].name);
pcb[k].priority=pcb1[t].priority;
pcb[k].runtime=pcb1[t].runtime;
k=k+1;
for(j=t;j{
strcpy(pcb1[j].name,pcb1[j+1].name);
pcb1[j].priority=pcb1[j+1].priority;
pcb1[j].runtime=pcb1[j+1].runtime;
}
r=r-1;
printf("就绪进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime);
printf("堵塞进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime);
break;
}
else
printf("该堵塞进程为空,不能唤醒进程!
\n");
break;
}
}
//for(j=0;j//printf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime);
if(x==4)
{
printf("-----------------终止进程---------------\n");
printf("请输入你要终止的进程:
");
scanf("%s",name);
for(i=0;i{
if(strcmp(pcb[i].name,name)==0)
{
t=i;
for(j=t;j{
strcpy(pcb[j].name,pcb[j+1].name);
pcb[j].priority=pcb[j+1].priority;
pcb[j].runtime=pcb[j+1].runtime;
}
k=k-1;
}
if(strcmp(pcb1[i].name,name)==0)
{
t=i;
for(j=t;j{
strcpy(pcb1[j].name,pcb1[j+1].name);
pcb1[j].priority=pcb1[j+1].priority;
pcb1[j].runtime=pcb1[j+1].runtime;
}
r=r-1;
}
}
printf("就绪进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime);
printf("堵塞进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime);
}
if(x==5)
{
printf("-----------------显示进程---------------\n");
printf("就绪进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime);
printf("堵塞进程:
\n");
for(j=0;jprintf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime);
}
}
}
程序运行结果及分析
1)运行结果
实验二、模拟进程调度功能
实验目的:
通过本实验,进一步掌握进程调度的功能和实现原理。
实验内容:
1、设计进程调度功能,至少模拟两种以上调度算法。
如:
优先级调度算法、时间片调度算法等。
2、进程调度功能作为一个函数scheduler,加入到实验题目一中。
3、进程调度程序从就绪队列中挑选进程,若队列为空,应显示“无就绪进程无法调度”的提示信息。
4、若选上一个进程,以显示:
进程名、状态、时间片、优先级等信息表示一个进程被执行。
若运行完,应删除相应PCB。
实验步骤:
1、在实验题目一中的主菜单中加入一个菜单项:
6调度,选择该菜单项后,系统进入进程调度。
2、
进程调度的结构:
进程调度子菜单
0---------返回主菜单
1---------优先级调度
2---------时间片调度
请选择您需要的功能选项:
=0=2
=1
实验代码:
#include
#include
voidpriority();
voidtime();
structPCB
{
charname[4];
intpriority;
intruntime;
};
structPCBpcb[5];
intq=5;
voidmain()
{
intp,i;
strcpy(pcb[0].name,"p1");//序列队列,优先级由高到低为1,2,3.....
pcb[0].priority=2;
pcb[0].runtime=3;
strcpy(pcb[1].name,"p2");//序列队列
pcb[1].priority=3;
pcb[1].runtime=2;
strcpy(pcb[2].name,"p3");//序列队列
pcb[2].priority=1;
pcb[2].runtime=4;
strcpy(pcb[3].name,"p4");//序列队列
pcb[3].priority=5;
pcb[3].runtime=6;
strcpy(pcb[4].name,"p5");//序列队列
pcb[4].priority=4;
pcb[4].runtime=5;
printf("------------------------------进程调度子菜单------------------------------\n");
printf("0---------退出系统\n");
printf("1---------优先级调度\n");
printf("2---------时间片调度\n");
printf("\n\n显示所有进程\n");
for(i=0;i<5;i++)
printf("%s%d%d\n",pcb[i].name,pcb[i].priority,pcb[i].runtime);
printf("请选择您需要的功能选项:
");
scanf("%d",&p);
printf("***********************\n");
while
(1)
{
if(p==0)
break;
switch(p)
{
//case0:
//break;
case1:
printf("优先级调度算法\n");
priority();
break;
case2:
printf("时间片调度算法\n");
time();
break;
}
printf("请选择您需要的功能选项:
");
scanf("%d",&p);
printf("***********************\n");
}
}
voidpriority()
{
inti,j;
intt=0,r=0;
//intq=5;
charname[2]="";
for(i=0;ifor(j=i;j{
if(pcb[i].priority>pcb[j].priority)
{
strcpy(name,pcb[i].name);
strcpy(pcb[i].name,pcb[j].name);
strcpy(pcb[j].name,name);
t=pcb[i].priority;
pcb[i].priority=pcb[j].priority;
pcb[j].priority=t;
r=pcb[i].runtime;
pcb[i].runtime=pcb[j].runtime;
pcb[j].runtime=r;
}
}
printf("按优先级高低进行排序\n");
for(i=0;iprintf("%s%d%d\n",pcb[i].name,pcb[i].priority,pcb[i].runtime);
printf("***********************\n");
printf("显示优先级最高的进程\n");
printf("%s%d%d\n",pcb[0].name,pcb[0].priority,pcb[0].runtime);
for(i=0;i{
strcpy(pcb[i].name,pcb[i+1].name);
pcb[i].priority=pcb[i+1].priority;
pcb[i].runtime=pcb[i+1].runtime;
}
printf("***********************\n");
printf("使最高优先级进程处于执行状态(撤销该进程)\n");
for(i=0;iprintf("%s%d%d\n",pcb[i].name,pcb[i].priority,pcb[i].runtime);
q=q-1;
}
voidtime()
{
inti,j,t;
//intq=5;
for(i=0;iprintf("%s%d%d\n",pcb[i].name,pcb[i].priority,pcb[i].runtime);
for(i=0;i{
pcb[i].runtime=pcb[i].runtime-1;
}
printf("***********************\n");
printf("将每个执行进程的执行时间减去一个时间片。
\n");
for(i=0;iprintf("%s%d%d\n",pcb[i].name,pcb[i].priority,pcb[i].runtime);
for(i=0;i{
if(pcb[i].runtime<=0)
{t=i;
for(j=t;j{
strcpy(pcb[j].name,pcb[j+1].name);
pcb[j].priority=pcb[j+1].priority;
pcb[j].runtime=pcb[j+1].runtime;
}
q=q-1;
}
}
printf("***********************\n");
printf("将进行结束的进程撤销。
\n");
for(i=0;i{
printf("%s%d%d\n",pcb[i].name,pcb[i].priority,pcb[i].runtime);
}
}
程序运行结果及分析
实验三:
模拟动态分区首次适应分配和回收算法
实验目的:
通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合并的理解。
实验内容:
1、设计动态分区首次适应分配、回收算法。
2、设计“未分配区说明表”,格式为:
序号
始址
长度
状态
1
60k
200
1
0
3、设计“已分配区说明表”,格式为:
作业名
始址
长度
状态
0
0
4、设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。
初始分配从一个空闲区分配起,回收时要合并空区。
实验步骤:
1、系统要求分配一个分区时,应输入:
作业名、作业长度。
2、回收一个分区时,应输入:
回收的作业名。
回收的分区请注意是否需要进行合并。
实验代码:
#include
#include
intMAX_SEGMENT=10;//最大碎片值
structPartition//分区表目
{
intPar_Size;//分区大小
intPar_No;//分区序号或者名字
intAddr;//分区地址
intIsUse;//分区使用情况,0表示空闲,1表示使用
Partition*pri;//前向指针
Partition*next;//后向指针
};
Partition*Int()//函数,返回Partition类型指针
{//初始化空闲分区表
Partition*list,*H,*H1;
list=(structPartition*)malloc(sizeof(structPartition));//malloc申请动态分配空间
list->next=NULL;
H=list;
if(!
list)
{
printf("\n错误,内存初始化分配失败!
程序结束");
exit
(1);
}
H1=(structPartition*)malloc(sizeof(structPartition));
printf("请预先输入分区总大小(以KB为单位):
");
scanf("%d",&H1->Par_Size);
H1->Addr=0;
H1->Par_No=0;
H1->IsUse=0;
H1->pri=H;
H1->next=NULL;
H->next=H1;////list--->H1
returnlist;
}
Partition*InitFP()
{//初始化已分配分区表
Partition*FP,*F