进程控制系统设计说明Word格式.docx

上传人:b****6 文档编号:17710401 上传时间:2022-12-08 格式:DOCX 页数:18 大小:228.61KB
下载 相关 举报
进程控制系统设计说明Word格式.docx_第1页
第1页 / 共18页
进程控制系统设计说明Word格式.docx_第2页
第2页 / 共18页
进程控制系统设计说明Word格式.docx_第3页
第3页 / 共18页
进程控制系统设计说明Word格式.docx_第4页
第4页 / 共18页
进程控制系统设计说明Word格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

进程控制系统设计说明Word格式.docx

《进程控制系统设计说明Word格式.docx》由会员分享,可在线阅读,更多相关《进程控制系统设计说明Word格式.docx(18页珍藏版)》请在冰豆网上搜索。

进程控制系统设计说明Word格式.docx

id[i]:

是进程标识符。

Id为外部标识符;

i为内部标识符,被定义为结构体变量。

i.status:

进程状态,包括Running、Readya、Readys、Blockeda、Blockeds等。

i.state:

队列指针,所在队列的首指针。

i.addr:

队列中进程的PCB间的链接指针,又可分为向前、向后两种指针。

i.priority:

进程的优先级。

i.CPU-state:

CPU的状态保护区。

i.mainstore:

分配的主存区域。

i.resource:

资源清单。

i.parent:

父进程指针。

i.progeny:

后代进程指针。

EP:

运行指针。

RQ:

就绪队列指针。

WQ[r]:

因事件r阻塞队列指针。

1.创建原语:

过程:

先寻找一个空闲的PCB,然后填写PCB初值,赋值完后,将PCB插入相应的队列中。

创建原语流程图:

创建原语算法:

voidcreate(n,S0,K0,M0,R0,acc)

{

i=getinternalname(n);

/*获得进程n的内部名*/

i.id=n;

/*填写进程的外部名*/

i.priority=K0;

/*填写进程的优先级*/

i.cpustate=S0;

/*填写CPU的初始状态*/

i.mainstore=M0;

/*填写内存区域*/

i.resources=R0;

/*填写资源清单*/

i.status="

就绪"

;

/*设置“就绪”状态*/

j=EP;

/*获得调用者内部名*/

i.parent=j;

/*填入调用者进程内部名,即进程i的父进程*/

i.progeny=0;

/*i的子进程为空,刚被创建,还没有子进程*/

j.progeny=i;

/*把i填入其父进程PCB中家族指针处*/

i.state=RQ;

/*指示i进程属于就绪队列*/

insert(RQ,i);

/*把i进程PCB插入就绪RQ队列*/

}

2.撤销原语:

首先要找到要终止进程的PCB,若该进程正在运行,则终止它的运行,并置重新调度标识,终止属于该进程的子孙进程,释放终止进程所拥有的全部资源,将终止进程移出它所在队列并收回PCB。

撤销流程图:

撤销原语算法:

voiddestroy(n)

sched=false;

kill(i);

/*撤销进程*/

if(sched==true)scheduler;

/*需要调度时转进程调度程序重新调度*/

voidkill(i)

if(i.status=="

执行状态"

{

stop(i);

sched=true;

}

remove(i.state);

/*将该进程的PCB从相应队列中移去*/

foralls∈i.progenydokill(s);

/*若有子进程s,递归调用kill(s)撤销之*/

forallr∈(i.mainstore||i.resources)do

if(owend(r))insert(r.semaphore,r.data);

/*属于父进程资源归还,且插入资源清单*/

forallR∈createdresources(i)do

removedescriptor(R);

/*撤销自己的资源清单,归还清单*/

removeprocessconcrolblock(i);

/*释放进程PCB*/

3.阻塞原语:

首先中断PCB,停止进程运行,将CPU的现行状态存放到PCB的CPU状态保护中,然后将该进程置阻塞状态,并把它插入等待队列中,然后系统执行调度程序,将CPU分配给另一个就绪的进程。

阻塞原语流程图:

阻塞原语算法:

voidblock(void)

i=EP;

stop(i);

/*阻塞调用进程自己*/

阻塞"

/*设置阻塞状态*/

i.state=WQ(r);

/*填写阻塞队列名称*/

insert(WQ(r),i);

/*把调用进程的PCB插入相应等待队列WQ(r)*/

scheduler;

/*转进程调度程序重新调度*/

4.唤醒原语:

执行时,首先找到被唤醒进程的内部标识,让该进程脱离阻塞队列,将现行状态改为就绪态,然后插入就绪队列中,等待调度运行。

唤醒原语流程图:

唤醒原语算法:

voidwakeup(n)

/*获得进程n内部名*/

remove(WQ(r),i);

/*把进程i的PCB从相应阻塞队列中移出*/

/*将进程置为就绪态*/

/*指示i进程属于就绪队列RQ*/

/*把进程i的PCB插入就绪队列RQ*/

五、函数关系调用

六、调试分析

在WINDOES系统中,使用一种数据结构—进程控制块(PCB)来标记进程,PCB是进程存在的唯一标志。

进程控制块保存进程状态、进程性质(如优先程度)、与进程有关的控制信息(如参数、信号量和消息等)、相应队列和现场保护区域等。

进程控制块随着进程的建立而产生,随着进程的完成而撤消,它是操作系统核心中最主要的数据结构之一,它既是进程存在的标志和调度的依据,又是进程可以被打断并能恢复运行的基础。

操作系统核心通过PCB管理进程,一般PCB是常驻内存的,尤其是调度信息必须常驻内存。

在操作系统中有许多进程,它们对应着不同的或相同的程序,竞争地使用着系统的资源。

在编写程序过程中,我们遇到最大的问题是四个算法在总程序中的运用以及函数的定义,经过查阅资料后我们发现用C语言来编写我们的程序以及算法是最合理的,其后我们先把每一个算法用C语言先定义后编写,在借鉴网上以及书本有关操作系统进程控制系统源代码,把我们自己编写的算法运用到整个程序中,最终完成了本次操作系统进程控制系统的代码。

七、调试结果

输入所需进程:

请输入进程数:

2

进程号No.1:

输入进程名:

进程1

输入进程优先级:

输入进程运行时间:

3

进程号No.2:

进程2

1

显示所输出进程信息:

经过五次运行后进程控制完成:

总结

不知不觉中为期2个星期的课程设计结束了,我的设计结果终于出来了,仔细想来,有喜有忧。

通过课程设计我学到了很多东西,也提高了我的动手能力。

经过这次课设我学到了很多。

通过此次课程设计加深理解了什么是进程,熟悉了LINUX/WINDOWS支持的进程的控制方式。

熟悉了/LINUX/WINDOWS的常用基本命令。

这次课设主要是由我和刘左彩两人一起完成,这是课设的题目是进程控制系统,而经过查阅的大量资料,我们发现进程控制系统主要包括进程的创建,进程的撤销,进程阻塞以及进程的唤醒,经商量后我负责进程的创建和撤销,刘左彩负责进程的阻塞和唤醒,这两部分组合起来就完成的本次课设。

而且通过此次课程设计使我们懂得了思考的重要性,学到了严谨的学习态度、刻苦的探索精神,也增加了去面对更大挑战的信心和勇气,同时也培养了把学到的知识用于解决实际问题,培养了我们的独立动手能力。

如果仅靠一个人要完成所有的工作是非常困难的,所以在以后的学习中我会更加注意各个方面的能力的协调发展。

在课程设计时遇到了很多的问题,在老师的帮助,同学的帮助以及对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,也告诉我合作的重要性,为今后在学习工作中能更好的发展作下了很好的铺垫。

两周的课程设计很短暂,但其间的内容是很充实的,在其中我们学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力。

并学会了如何将所学的各课知识融汇组织来配合学习,两周中我们受益匪浅。

参考文献

1.王万森·

《计算机操作系统原理》·

高等教育出版社,2001年3月.

2.孔宪军,王亚东·

《操作系统的原理与应用》·

高等教育出版社,2007年9月.

3.王长山·

《操作系统学习指导》·

西电子科技大学出版,2003年10月.

4.JeanBacon,TimHarris·

《操作系统并发与分布式软件设计》·

陈向群译·

电子工业出版社,2002年7月.

5.张坤,姜立秋,赵慧然·

《操作系统实验教程》·

清华大学出版社,2008年5月.

6.任满杰,刘树刚,李军红·

《操作系统原理实用教程》·

电子工业出版社,2005年8月.

7.张尧学,史美林,张高·

《计算机操作系统教程》·

(第三版)·

清华大学出版社,2006年10月.

8.刘克成·

《C语言程序设计》·

中国铁道出版社,2007年5月.

致谢

为期两个星期的课程设计结束了,说实话我从中学到了很多课本上没有的东西,让我受益匪浅。

在此,我要向我的指导老师陈老师致以最诚挚的谢意。

她在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。

在这段时间内老师一直认真的指导我们,才使设计圆满完成!

我还要再次感谢我的操作系统老师陈老师,在以往的基础课学习中为我打下良好的基础,这是我这次课程设计能够顺利完成的前提。

一个学期以来陈老师的严肃的教学态度使我从对该课程的一无所知到有所掌握,也为我今后的学习与工作打下了坚实的基础。

最后还要感谢我的同学们,感谢他们给与我必要的帮助和讲解。

没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。

也感谢他们给我提出那么多的解决方案和指导性意见,帮我顺利完成我的课程设计。

附件:

源程序(带注释)

#include"

stdio.h"

#include<

stdlib.h>

conio.h>

#definegetpch(type)(type*)malloc(sizeof(type))

#defineNULL0

structpcb{/*定义进程控制块PCB*/

charname[10];

charstate;

intsuper;

intntime;

intrtime;

structpcb*link;

}*ready=NULL,*p;

typedefstructpcbPCB;

voidsort()/*建立对进程进行优先级排列函数*/

{

PCB*first,*second;

intinsert=0;

if((ready==NULL)||((p->

super)>

(ready->

super)))/*优先级最大者,插入队首*/

{

p->

link=ready;

ready=p;

}

else/*进程比较优先级,插入适当的位置中*/

first=ready;

second=first->

link;

while(second!

=NULL)

if((p->

(second->

super))/*若插入进程比当前进程优先数大,*/

{/*插入到当前进程前面*/

link=second;

first->

link=p;

second=NULL;

insert=1;

else/*插入进程优先数最低,则插入到队尾*/

first=first->

second=second->

if(insert==0)first->

}

voidinput()/*建立进程控制块函数*/

inti,num;

system("

cls"

);

/*清屏*/

printf("

\n请输入进程数:

"

scanf("

%d"

&

num);

for(i=1;

i<

=num;

i++)

\n进程号No.%d:

\n"

i);

p=getpch(PCB);

\n输入进程名:

"

%s"

p->

name);

\n输入进程优先数:

p->

super);

\n输入进程运行时间:

ntime);

rtime=0;

state='

W'

link=NULL;

sort();

/*调用sort函数*/

intspace()

intl=0;

PCB*pr=ready;

while(pr!

l++;

pr=pr->

return(l);

voiddisp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/

\n进程名\t状态\t优先数\t需要运行时间\t已经运行时间\n"

|%s\t"

pr->

|%c\t"

state);

|%d\t"

|%d\t\t"

rtime);

voidcheck()/*建立进程查看函数*/

PCB*pr;

\n****当前正在运行的进程是:

/*显示当前运行进程*/

disp(p);

pr=ready;

\n****当前就绪队列状态为:

/*显示就绪队列状态*/

disp(pr);

voiddestroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/

\n进程[%s]已完成.\n"

free(p);

voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态*/

(p->

rtime)++;

if(p->

rtime==p->

ntime)

destroy();

/*调用destroy函数*/

else

super)--;

/*调用sort函数*/

voidmain()/*主函数*/

intlen,h=0;

charch;

input();

len=space();

while((len!

=0)&

&

(ready!

=NULL))

ch=getchar();

h++;

-----------------------------------------------------"

\n现在是第%d次运行:

\n"

h);

p=ready;

ready=p->

R'

check();

running();

\n按任意键继续......\n"

\n\n进程已经完成.\n"

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

当前位置:首页 > 工程科技 > 电子电路

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

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