实验一、模拟进程创建、终止、阻塞、唤醒
原语
实验目的:
通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理
解,掌握操作系统模块的设计方法和工作原理。
实验内容:
1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
6
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供
随时查看各队列中进程的变化情况。
实验步骤:
1、进程PCB中应包含以下内容:
进程名 优先级 运行时间 状态 指针 2、系统总体结构:
系统主菜单 1?创建 2?阻塞 3?唤醒 4?终止 5?显示 0?退出 请输入您需要的功能(0-5):
结束 退出 0 1 创建 输入选择=? 5 2 阻塞 3 唤醒 4 终止 显示 开始 其中:
进程名用P1,P2标识。
优先级及运行时间:为实验题目二做准备。 状态为:就绪、运行、阻塞,三种基本状态。 指针:指向下一个PCB。
实验代码:
#include
#include
char name[4]; int priority; int runtime;
7
};
void main() { int x,t;
int a=0;
int k=0,r=1,i=0,j=0;//k为就绪队列总数,r堵塞队列总数 char name[4]; struct PCB pcb[10];
struct PCB pcb1[10];
struct PCB pcb2[10]; printf(\菜单---------------------\\n\\n\\n\ printf(\退出系统\\n\ printf(\创建进程\\n\ printf(\堵塞进程\\n\ printf(\唤醒进程\\n\ printf(\终止进程\\n\
printf(\显示进程\\n\
printf(\ strcpy(pcb1[0].name,\堵塞队列 pcb1[0].priority = 2; pcb1[0].runtime = 3;
//printf(\ %d %d\
while(1) {
printf(\请输入你的选择:\
scanf(\ if(x==0)
break; if(x==1) {
printf(\创建进程---------------\\n\
8
printf(\进程名:\
scanf(\ printf(\优先级:\
scanf(\printf(\运行时间:\scanf(\ }
if(x==2) { printf(\堵塞进程---------------\\n\ printf(\请输入要查找的进程:\
scanf(\for(j=0;j<=k;j++) {
if(strcmp(pcb[j].name,name)==0) { k=k+1;
t=j; strcpy(pcb2[a].name,pcb[t].name); pcb2[a].priority = pcb[t].priority; pcb2[a].runtime = pcb[t].runtime;
strcpy(pcb1[r].name,pcb2[a].name);
pcb1[r].priority = pcb2[a].priority; pcb1[r].runtime = pcb2[a].runtime; r=r+1;
a=a+1;
for(i=t;i<=k;i++) {
strcpy(pcb[i].name,pcb[i+1].name);
pcb[i].priority = pcb[i+1].priority; pcb[i].runtime = pcb[i+1].runtime;
} k=k-1; printf(\将就绪序列调度为运行:\
for(i=0;i
printf(\printf(\堵塞进程:\\n\
for(j=0;j 9 printf(\ break; } else printf(\该进程已是堵塞进程!\\n\ break; } } if(x==3) { printf(\唤醒进程---------------\\n\ printf(\请输入要唤醒的进程:\ scanf(\ for(i=0;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; 10