实验二进程管理.docx

上传人:b****1 文档编号:20725805 上传时间:2023-04-25 格式:DOCX 页数:11 大小:95.43KB
下载 相关 举报
实验二进程管理.docx_第1页
第1页 / 共11页
实验二进程管理.docx_第2页
第2页 / 共11页
实验二进程管理.docx_第3页
第3页 / 共11页
实验二进程管理.docx_第4页
第4页 / 共11页
实验二进程管理.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验二进程管理.docx

《实验二进程管理.docx》由会员分享,可在线阅读,更多相关《实验二进程管理.docx(11页珍藏版)》请在冰豆网上搜索。

实验二进程管理.docx

实验二进程管理

操作系统实验

实验二进程管理

 

学号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;

}

}

}

开始

流程图:

 

进程状态转换(插入不同的链表的)

 

首先是初始进程的创建.

管理进程

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1