实验二进程管理.docx
《实验二进程管理.docx》由会员分享,可在线阅读,更多相关《实验二进程管理.docx(11页珍藏版)》请在冰豆网上搜索。
实验二进程管理
操作系统实验
实验二进程管理
学号1315251003
姓名陈鑫
班级集成电路
华侨大学电子工程系
实验二进程管理
实验目的
1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、掌握进程的创建、睡眠、撤销等进程控制方法。
实验内容与基本要求
用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
实验报告内容
1、进程、进程控制块等的基本原理。
2、程序流程图。
3、程序及注释。
4、运行结果以及结论。
原理:
C语言是顺序执行语言,没有多线程编程.所以在此,只是利用链表的操作模拟了一个进程管理.
通过创建3条单向链表:
run运行态进程链表ready就绪态进程链表wait等待态进程链表通过链表节点的插入,退出,删除,增加.可以实现进程管理的模拟.
源码:
#include
#include
#pragmawarning(disable:
4996)
typedefstructPCB
{
intUID;
intPrio;
charname[10];
structPCB*next;
}PCB;
PCB*ready,*run,*wait;
intinsert(PCB*head,PCB*node)
{
PCB*p;
p=head;
if(p->next==NULL)
{
head->next=node;
return1;
}
while(p)
{
if(p->next==NULL)
{
p->next=node;
return1;
}
else
{
p=p->next;
}
}
}
PCB*dequeue(PCB*head)
{
PCB*p;
p=head;
if(p->next==NULL)
{
returnNULL;
}
else
{
p=p->next;
head->next=p->next;
p->next=NULL;
returnp;
}
}
intinit()
{
system("cls");
PCB*p;
ready=(PCB*)malloc(sizeof(PCB));
ready->next=NULL;
run=(PCB*)malloc(sizeof(PCB));
run->next=NULL;
wait=(PCB*)malloc(sizeof(PCB));
wait->next=NULL;
printf("输入进程UID和进程名,优先级来创建一个新的进程:
\n");
while
(1)
{
p=(PCB*)malloc(sizeof(PCB));
p->next=NULL;
scanf("%d%s%d",&p->UID,&p->name,&p->Prio);
if(p->UID==0)
{
printf("初始进程已经被创建\n");
break;
}
else
{
insert(ready,p);
printf("\t%d\t%s\t%d\n",p->UID,p->name,p->Prio);
}
}
return1;
}
intcreate()
{
PCB*p;
p=(PCB*)malloc(sizeof(PCB));
p->next=NULL;
printf("输入进程UID和进程名,优先级来创建一个新的进程\n");
scanf("%d%s%d",&p->UID,&p->name,&p->Prio);
if(insert(ready,p))
{
printf("创建了一个新进程:
UID=%dNAME=%sPrio=%d\n",p->UID,p->name,p->Prio);
}
else
{
printf("创建失败\n");
}
return1;
}
intrunqueue()
{
PCB*p=dequeue(ready);
if(p==NULL)
{
printf("就绪队列中没有进程!
\n");
return0;
}
else
{
insert(run,p);
printf("运行进程队列中插入了一个进程:
UID=%dNAME=%sPrio=%d\n",p->UID,p->name,p->Prio);
return1;
}
}
intwaitqueue()
{
PCB*p=dequeue(run);
if(p==NULL)
{
printf("等待进程队列中没有进程");
return0;
}
else
{
insert(wait,p);
printf("等待进程队列中插入一个进程:
UID=%dNAME=%sPrio=%d\n",p->UID,p->name,p->Prio);
return1;
}
}
intreadyqueue()
{
PCB*p=dequeue(wait);
if(p==NULL)
{
printf("等待进程队列中没有进程\n");
return0;
}
else
{
insert(ready,p);
printf("就绪进程队列中插入一个进程:
UID=%dNAME=%sPrio=%d\n",p->UID,p->name,p->Prio);
return1;
}
}
intoutputqueue(PCB*head)
{
PCB*p;
if(head->next==NULL)
{
printf("队列为空\n");
return1;
}
p=head->next;
while(p)
{
printf("UID=%dNAME=%sPrio=%d\n",p->UID,p->name,p->Prio);
p=p->next;
}
return0;
}
intoutputs()
{
printf("就绪队列:
\n");
outputqueue(ready);
printf("运行队列:
\n");
outputqueue(run);
printf("等待队列:
\n");
outputqueue(wait);
return1;
}
intmain()
{
charCOMMAND;
if(init()==1)
{
printf("初始化......\n");
}
else
{
printf("初始化失败:
\n");
}
printf("创建一个新的进程请输入c;\n");
printf("就绪队列转向运行队列请输入r;\n");
printf("运行队列转向等待队列请输入w;\n");
printf("等待队列转向就绪队列请输入d;\n");
printf("请输入命令(支持大小写均识别);\n");
while
(1)
{
scanf("%c",&COMMAND);
switch(COMMAND)
{
case'\n':
break;
case'c':
create();break;
case'r':
runqueue();break;
case'w':
waitqueue();break;
case'd':
readyqueue();break;
case'o':
outputs();break;
case'C':
create();break;
case'R':
runqueue();break;
case'W':
waitqueue();break;
case'D':
readyqueue();break;
case'O':
outputs();break;
}
}
}
开始
流程图:
进程状态转换(插入不同的链表的)
首先是初始进程的创建.
管理进程