操作系统实验报告一
实验一 进程状态转换及其PCB的变化
一、实验目的:
自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。
二、实验内容及要求:
(1)、 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。
(2)、 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。
(3)、 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。
(4)、 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。
(5)、 代码书写要规范,要适当地加入注释。
(6)、 鼓励在实验中加入新的观点或想法,并加以实现。
(7)、 认真进行预习,完成预习报告。
(8)、 实验完成后,要认真总结,完成实验报告。
五状态模型:
三、主要数据结构:
struct Run_type //运行态进程
{
char name;
int state;
int needtime;
int priority;
};
struct Ready_type //就绪态进程
{
1
char name;
int needtime;
int priority;
};
struct Blocked_type //阻塞态进程
{
char name;
int needtime;
int priority;
};
四、程序源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i=0; int j=0;
struct Run_type{
char name;
int state;
int needtime;
int priority;
};
struct Ready_type{
char name;
int needtime;
int priority;
};
struct Blocked_type{
char name;
int needtime;
int priority;
};
struct Run_type Cpu;
struct Ready_type Ready[10];
struct Blocked_type Blocked[10];
void Creat(){ //创建一个新的进程
int k=0;
label1:
printf(" input new process name(input a letter): \n");
scanf("%s",&(Ready[i].name));getchar();
for(k=0;k<i;k++)
if(Ready[i].name==Ready[k].name||Ready[i].name==Ready[k].name+32||Ready[i].name==Ready[k].name-32)
2
{
printf("the process is already exist!");
goto label1;
}
printf("input needtime (input a int number):\n");
label3:
scanf("%d",&(Ready[i].needtime));getchar();
if(Ready[i].needtime<1||Ready[i].needtime>100)
{
printf("please input the true needtime(1--100)\n");
goto label3;
}
printf(" input the priority(1--10): \n");
label2:
scanf("%d",&(Ready[i].priority));getchar();
if(Ready[i].priority<1||Ready[i].priority>10)
{
printf("please 1--10!\n");
goto label2;
}
i++;
}
void Dispath() //P135
{
int t;char v;int k;int j;
if(Cpu.state==0)
if(Ready[i-1].needtime==0)
{
printf("* there is no process ready!\n");
exit(0);
}
else
{
for(k=0;k<i-1;k++)
for(j=0;j<i-k-1;j++)
if(Ready[j].priority>Ready[j+1].priority)
{t=Ready[j].priority;
Ready[j].priority=Ready[j+1].priority;Ready[j+1].priority=t; t=Ready[j].needtime;
Ready[j].needtime=Ready[j+1].needtime;Ready[j+1].needtime=t; v=Ready[j].name;
Ready[j].name=Ready[j+1].name;Ready[j+1].name=v;
}
--i;
3
Cpu.name=Ready[i].name;Cpu.needtime=Ready[i].needtime;Cpu.priority=Ready[i].priority;Cpu.state=1;
printf("*%5c is send to cpu! \n",Cpu.name);
Cpu.needtime--;
if(Cpu.needtime==0)
{printf("*%5c is finished \n",Cpu.name);
Cpu.state=0;}
}
else
{
Ready[i].name=Cpu.name;
Ready[i].needtime=Cpu.needtime;
Ready[i].priority=Cpu.priority;
for(k=0;k<i;k++)
for(j=0;j<i-k;j++)
if(Ready[j].priority>Ready[j+1].priority)
{t=Ready[j].priority;
Ready[j].priority=Ready[j+1].priority;Ready[j+1].priority=t; t=Ready[j].needtime;
Ready[j].needtime=Ready[j+1].needtime;Ready[j+1].needtime=t; v=Ready[j].name;
Ready[j].name=Ready[j+1].name;Ready[j+1].name=v;
}
Cpu.name=Ready[i].name;Cpu.needtime=Ready[i].needtime;Cpu.priority=Ready[i].priority;Cpu.state=1;
printf("*%5c is send to cpu! \n",Cpu.name);
Cpu.needtime--;
if(Cpu.needtime==0)
{printf("*%5c is finished \n",Cpu.name);
Cpu.state=0;}
}
}
void Timeout()
{
if(Cpu.state==0)
{
printf("* there is no process in cpu(please select Dispath!\n"); exit(0);
}
else
{
Ready[i].name=Cpu.name;
Ready[i].needtime=Cpu.needtime;
Ready[i].priority=Cpu.priority;
4
printf("%c is timeout \n",Cpu.name); Cpu.name=0;
Cpu.needtime=0;
Cpu.priority=0;
Cpu.state=0;
i++;
}
}
void Eventwait(){
if(Cpu.state!=0)
{
Blocked[j].name=Cpu.name;
Blocked[j].needtime=Cpu.needtime;
Blocked[j].priority=Cpu.priority;
printf("* %c is Blocked !\n",Cpu.name); j++;
Cpu.name=Blocked[j].name;
Cpu.needtime=Blocked[j].needtime;
Cpu.priority=Blocked[j].priority;
Cpu.state=0;
}
else
printf("* There is no process in cpu!"); }
void Eventoccurs(char a){
int k=0;int m=0;int n=0;int p=0;
if(Blocked[0].needtime==0)
{
printf("* there is no process blocked!\n"); exit(0);
}
else
{
for(k;k<j;k++)
if(Blocked[k].name==a)
{
Ready[i].name=Blocked[k].name;
Ready[i].needtime=Blocked[k].needtime; Ready[i].priority=Blocked[k].priority; p=1;
m=j-k;
for(n;n<m;n++)
{
Blocked[k].name=Blocked[k+1].name;
5
Blocked[k].needtime=Blocked[k+1].needtime;
Blocked[k].priority=Blocked[k+1].priority;
k++;
}
j--;i++;
}
if(p==1)
printf("* %c is ready!\n",a);
else
printf("* %c is not found! \n",a);
}
}
void main(){
Cpu.state=0;
int Cputime=0;
int x=6;
while(x!=0)
{
printf("\n1:input new process 2:Dispath\n");
printf("3:Timeout
4:Eventwait\n");
printf("5:Eventoccurs(select whose eventoccur ) 0:exit\n");
label4:
scanf("%d",&x);getchar();
printf("\n==================================================================
============\n");
if(x==0||x==1||x==2||x==3||x==4||x==5)
{
switch(x)
{
case 1:Creat();break;
case 2:Dispath();break;
case 3:Timeout();break;
case 4:Eventwait();break;
case 5:char a;scanf("%c",&a);getchar(); Eventoccurs(a);break;
default:printf("please select from 0 to 5\n");
}
printf("----------------------------- Cputime:%3d
----------------------------------\n",Cputime);
printf("| ProceNsname NeedTime Priority |\n");
if(Cpu.state!=0)//显示Cpu中的程序
6
{
printf("| Cpu:%16c",Cpu.name);printf("%20d",Cpu.needtime);printf("%18d |\n",Cpu.priority);
}
else
printf("| * Cpu is free |\n");
int y=0;
if(i==0)//显示Ready队列中的数据
{
printf("| *There is no process ready. |\n");
}
else
{
for(y;y<i;y++)//显示Ready中的程序
{
printf("| Ready%d:",y);
printf("%15c",Ready[y].name);printf("%20d",Ready[y].needtime);printf("%18d
|\n",Ready[y].priority);
}
}
int z=0;
if(j==0) //显示Blocked队列中的程序
{
printf("| *There is no process blocked. |\n");
}
else
{
for(z;z<j;z++)
{
printf("| Blocked%d:",z);
printf("%13c",Blocked[z].name);printf("%20d",Blocked[z].needtime);printf("%1
8d |\n",Blocked[z].priority);
}
}
Cputime++;
if(Cpu.state!=0)
Cpu.needtime=Cpu.needtime-1;
printf("--------------------------------------------------------------------
7
---------\n");
}
else
{
printf("please input 0--5\n");
goto label4;
}
}
}
五、运行结果:
1.创建a,b两个进程
2、调度进程(由于b优先级高,所以b先进入运行态)
3、当b时间片到了,b变为就绪态
8
4、再次调度(由于b优先级高,故还是b变成运行态)
5、正在运行的b阻塞
6、当b等待的事件发生,b重新进入就绪态
六、程序使用说明:
编译程序后若无错就执行程序,初始如下:
9
其中:1表示创建新进程,随后输入进程名,所需时间,优先级 2表示系统调度进程,首先调度最高优先级
3表示时间片已到,运行中的进程将编程就绪态 4表示进程所需的事件尚未发生,进程将被阻塞
5表示进程等待的事件已发生,进程从阻塞态变为就绪态 0退出程序
10