操作系统原理
题 目:模拟进程创建终止阻塞唤醒原语
院 (部): 理工程学院
专 业: 信息理信息系统
班 级: 信
姓 名:
学 号:
实验题目:模拟进程创建终止阻塞唤醒原语
题目类型:必做题目
二实验目:通设计调试创建终止阻塞唤醒原语功助操作系统中进程控制功理解掌握操作系统模块设计方法工作原理
三实验环境:
1硬件:pc机兼容机
2软件:Windows OSTurbo CC++VC++VSnetJava等
四实验容:
1设计创建终止阻塞唤醒原语功函数
2设计函数采菜单结构(参见面出流程图)
3设计显示队列函数目绪阻塞队列中进程信息显示屏幕供时查队列中进程变化情况
五算法流程图
开始
系统菜单
1…创建
2…阻塞
3…唤醒
4…终止
5…显示
0…退出
请输入您需功(0-5):
输入选择?
5
4
3
2
1
0
退出
创建
阻塞
唤醒
终止
显示
结束
六程序清单
#include
#include
struct pcb
{
char name[10]
int status
int order
int time
int wtime
int ytime
}pcb[11]该结构体存储已输入进程
struct ghost
{
char name[10]
int status
int order
int time
}ghost[11]该结构体优先级调度时进程优先级排序
char a_name[10]
int i0ya0xzjilu
void insert()
void block()
void rouse()
void stop()
void outPut()
void control()实验二添加函数
void order_control()实验二添加函数
void time_control()实验二添加函数
void insert()
{
jilu0jilu判断变量重复时进行判断跳
if(i>10)
printf(进程已存10法继续添加进程\n)
else
{
printf(请输入插入pcb数\n)
printf(1进程名)
scanf(s&pcb[i]name)
printf(2该进程优先级(110))
scanf(d&pcb[i]order)
printf(3运行时间)
scanf(d&pcb[i]time)
for(y0y
if (strcmp(pcb[i]namepcb[y]name)0)
{
printf(您输入进程名已存请重新输入\n)
jiluy+1
}
}
if(jilu>0)jilu0
else
{
printf(输入已完成\n您输入数\n进程名 s\n优先级 d\n运行时间 d\npcb[i]namepcb[i]orderpcb[i]time)
printf(\n)
strcpy(ghost[i]namepcb[i]name)
ghost[i]orderpcb[i]order
ghost[i]timepcb[i]time
pcb[i]status1
ghost[i]status1
pcb[i]wtimepcb[i]time
pcb[i]ytime0
i++
}
}
}
void block()
{
int m
printf(\n请输入您改变状态进程进程名 )
scanf(s&a_name)
for(y0y
if(strcmp(pcb[y]namea_name)0)
{
a1
if(pcb[y]status0)
{
printf(您修改进程已阻塞状态法更改\n)
}
if(pcb[y]status2)
{
pcb[y]status0
for(m0m
if(strcmp(ghost[m]namea_name)0)
{
ghost[m]status0
}
}
printf(操作已完成进程成功改阻塞状态\n)
}
}
}
if(a0)
{
printf(起您查找进程名存\n)
}
a0
}
void rouse()
{
int m
printf(\n请输入您改变状态进程进程名 )
scanf(s&a_name)
for(y0y
if(strcmp(pcb[y]namea_name)0)
{
a1
if(pcb[y]status1)
{
printf(您修改进程已绪状态法更改\n)
break
}
if(pcb[y]status0)
{
pcb[y]status1
for(m0m
if(strcmp(ghost[m]namea_name)0)
{
ghost[m]status1
}
}
printf(操作已完成进程成功改运行状态\n)
break
}
}
}
if(a0)
{
printf(起您查找进程名存\n)
}
a0
}
void stop()
{
printf(\n请输入您改变状态进程进程名 )
scanf(s&a_name)
for(y0y
if(strcmp(pcb[y]namea_name)0)
{
a1
for(y
pcb[y]pcb[y+1]
}
i
printf(操作已完成进程成功删\n)
break
}
}
if(a0)
{
printf(起您查找进程名存\n)
}
a0
}
void outPut()
{
if(i0)
{
printf(起没进程存法显示\n)
}
else
{
printf(\n\n 已存进程分(状态2表示正运行1表示绪0表示阻塞)\n)
for(y0y
if(pcb[y]status3)printf(进程d 进程名 s 状态 d\ny+1pcb[y]namepcb[y]status)
}
}
}
void control()
{
for(1)
{
printf(进程调度子菜单\n0 返回菜单\n1 优先级调度\n2 时间片轮转调度\n请输入您想进行操作指令 : )
scanf(d&x)
if(x0)
break
switch(x)
{
case 0
break
case 1
order_control()
break
case 2
time_control()
break
default
printf(您输入指令误请重新输入\n)
break
}
}
}
void order_control()
{
int jishiCPU运行时间计时
jishi0
char panduan1panduan2判断否继续调度
struct ghost jiaohuan
int ggbl
for(gg0gg
if(pcb[gg]status2)
{
for(bl0bl
if(strcmp(ghost[bl]namepcb[gg]name)0)
{
ghost[bl]status2
}
}
}
}
for(x0x
for(yx+1y
if(ghost[x]order
jiaohuanghost[x]
ghost[x]ghost[y]
ghost[y]jiaohuan
}
}
}语句根优先级进程排序
printf(\n\n优先级调度进程具体容\n)
for(x0x
if(ghost[x]status1){
printf(正运行进程 s\n优先级 d\n运行时间 d\n\n\nghost[x]nameghost[x]orderghost[x]time)
for(y0y
if(strcmp(pcb[y]nameghost[x]name)0)
{
pcb[y]status2
ghost[x]status2
}
}该语句更改结构体进程状态
printf(否继续运行直进程运行完毕(YN))
scanf(s&panduan1)
if(panduan1'Y'||panduan1'y')
{
if(ghost[x]status2)
{
jishijishi+ghost[x]time
printf(CPU运行时间 d 进程 s 运行完毕正关闭\njishighost[x]name)
for(y0y
if(strcmp(pcb[y]nameghost[x]name)0)
{
pcb[y]status3
ghost[x]status3
}
}该语句更改结构体进程状态
if(x(i1))
{
printf(进程全部运行完毕\n\n)
}
else{
printf(\n否继续调度(yn))
scanf(s&panduan2)
if(panduan2'N'||panduan2'n')break}
}}else break
}
}printf(果输出容请检查绪队列否存进程)
}
void time_control()
{
int zkz1kz2kz3kz4kz5kz6kz1表示时间片运行时间计时kz2表示CPU运行总时间kz3进程时间输出kz4表示已完成进程数kz5表示状态绪进程数kz6更改ghost状态值
z0kz20kz40kz50
for(y0y
if(pcb[y]status1)
{
kz5kz5+1
}
}
printf(\n\n请输入时间片长度 )
scanf(d&x)
printf(\n\n时间片轮转调度进程具体容\n)
if(kz50)
{
for(kz4
for(y0y
if(pcb[y]status1||pcb[y]status2)
{
for(kz10kz1
if(pcb[y]status1||pcb[y]status2){
kz2kz2+1
pcb[y]wtimepcb[y]wtime1
pcb[y]ytimepcb[y]ytime+1
printf(CPU运行时间 d 正运行进程 s\nkz2pcb[y]name)
printf(进程名 已运行时间 未运行时间 求运行时间\n)
for(kz30kz3
if(pcb[kz3]status1||pcb[kz3]status2)
{
printf(s12d12d12d\npcb[kz3]namepcb[kz3]ytimepcb[kz3]wtimepcb[kz3]time)
}
}
if(pcb[y]wtime<0&&pcb[y]status3)
{
printf(进程 s 运行完毕正关闭\n\npcb[y]name)
kz4kz4+1
pcb[y]status3
for(kz60kz6
if(strcmp(ghost[kz6]namepcb[y]name)0)
{
ghost[kz6]status3
}
}
kz1x
break
}
printf(\n)
}}
}
}
}
}
printf(注意:果未输出程请检查绪列表否存进程\n)
}
void main()
{
char c
for(1)
{
printf(系统菜单\n)
printf(1创建\n)
printf(2阻塞\n)
printf(3唤醒\n)
printf(4终止\n )
printf(5显示\n)
printf(6调度\n)
printf(0退出\n)
printf(请输入操作指令 )
if(scanf(d&x))
{
if(x0)
break
switch(x)
{
case 1
insert()
break
case 2
block()
break
case 3
rouse()
break
case 4
stop()
break
case 5
outPut()
break
case 6
control()
break
case 0
break
default
printf(格式非法请重新输入\n)
break
}
}
else if(scanf(c&c))
{
printf(格式非法请重新输入\n)
}
}
}
七程序中数结构符号说明
struct pcb
{
char name[10]
int status
int order
int time
int wtime
int ytime
}pcb[11]该结构体存储已输入进程
struct ghost
{
char name[10]
int status
int order
int time
}ghost[11]该结构体优先级调度时进程优先级排序
void insert()添加进程
void block()阻塞进程
void rouse()唤醒进程
void stop()删进程
void outPut()输出
void control()实验二添加函数
void order_control()实验二添加函数
void time_control()实验二添加函数
八调试程序时出现问题解决方法
问题:
现象:阻塞功输出功法正常显示进程状态
解决:进程结构体中添加控制进程状态变量
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档