一、实验题目: 模拟进程创建、终止、阻塞、唤醒原语
二、实验目的: 通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。
三、实验环境:
1、硬件:PC机及其兼容机。
2、软件:Windows OS,MS—DOS OS,Turbo C 或 C++、VC++等。
四、实验内容:
1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息 显示在屏幕上,以供随时查看各队列中进程的变化情况。
五、算法流程图:

六、程序清单:
#include<stdio.h>
#include<string.h>
#include<windows.h>
int count=0;
typedef struct PCB{
char pname[10];
int ppri;
int pruntime;
int pstatus;
struct PCB *next;
}PCB;
void menu(){
printf("---------OS实验一:模拟进程创建、阻塞、唤醒、终止原语---------\n");
printf("----------------------------0.退出----------------------------\n");
printf("----------------------------1.创建----------------------------\n");
printf("----------------------------2.阻塞----------------------------\n");
printf("----------------------------3.唤醒----------------------------\n");
printf("----------------------------4.终止----------------------------\n");
printf("----------------------------5.显示----------------------------\n");
printf("---------------------请输入您需要的功能(0-5)------------------\n");
printf("--------------------------------------------------------------\n");
printf("各功能简要说明:\n");
printf("创建:在本实验中,该功能仅实现建立 PCB,初始化 PCB,并将该 PCB放入就绪队列中。\n");
printf("阻塞:在本实验中,实现的功能为,根据用户输入的进程名称查看该进程是否处在运行状态,若处在运行状态,修改该进程PCB的状态,并将该进程转入阻塞队列;若该进程处在其它状态,则给出相应的提示信息;若该进程不存在,也需要给出相应的提示信息。\n");
printf("唤醒:功能类似阻塞功能,注意:若阻塞队列为空,则不能执行唤醒功能。\n");
printf("终止:根据用户输入要结束的进程名称,从就绪队列、阻塞队列和正在运行的进程中找到相应的进程 PCB,并将该 PCB 从相应队列中删除。若该进程不存在,需要给出提示。\n");
printf("显示:将就绪队列、阻塞队列中的进程列表和正在运行的进程显示出来。\n");
}
void run(PCB *head2,PCB *head3){
PCB *p=head3->next;
if(p){
head2->next=p;
p->pstatus=2;
head3->next=p->next;
free(p);
}
}
void insert(PCB *head3,PCB *temp){
PCB *p;
p=head3;
while(p->next!=NULL)
p=p->next;
p->next=temp;
temp->next=NULL;
}
int check(PCB *head,PCB *temp){
PCB *p=head;
while(p->next){
p=p->next;
if(strcmp(p->pname,temp->pname)==0)
return 0;
}
return 1;
}
void Delete(PCB *head,PCB *temp){
PCB *p=head,*q=temp->next;
while(p)
if(p->next==temp){
p->next=q;
free(temp);
return;
}
else
p=p->next;
}
void create(PCB *head1,PCB *head2