操作系统课程设计指导书.docx
《操作系统课程设计指导书.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计指导书.docx(71页珍藏版)》请在冰豆网上搜索。
淮阴工学院
操作系统
课程设计指导书
陈礼青
计算机工程学院
2011年7月2日
课题一进程创建模拟实现
1、课题目的
1)理解进程创建相关理论;
2)掌握进程创建方法;
3)掌握进程相关数据结构。
2、课题描述
本课题针对操作系统中进程创建相关理论进行设计。
要求编写程序并进行测试。
代码简化了进程创建的多个步骤和内容。
进程的树形结构采用广义二叉树的方式进行
存储。
3、课题内容
1)编写程序;
2)进行功能测试并得出正确结果;
3)分析并掌握测试结果。
4、课题要求
1)分析进程创建函数createpc程序模块;
2)在课程设计报告中画出createpc函数程序流程图;
3)撰写课程设计报告,并参加答辩。
5、测试要求
1)至少创建10个进程;
2)创建进程树中4层以上的树型结构。
6、相关知识
1)进程控制块
为了描述和控制进程的运行,系统为每个进程定义了一个进程控制块(PCB),它
是进程实体的一部分,是操作系统管理进程最重要的数据结构。
其主要包含四类信息:
(1)进程标识符
它唯一地标识一个进程。
通常包括进程号pid,父进程号ppid和用户号uid。
(2)处理机状态
处理器的状态通常由处理机的各种寄存器中的内容组成。
PCB存放中断(阻塞,
挂起)时的各寄存器值,当该进程重新执行时,可以从断点处恢复。
主要包括:
a)通用寄存器;
b)指令计数器;
c)程序状态字PSW;
d)用户栈指针。
(3)进程调度信息
a)进程状态;
b)进程优先级(用于描述优先使用cpu级别的一个整数,高优先级的进程先得到cpu,
通常情况下,优先值越小优先级越高);
c)其它信息(等待时间、总执行时间等);
d)事件(等待原因)。
(4)进程控制信息
a)程序和数据的地址(程序在内存和外存中的首址);
b)进程同步和通信机制;
c)资源列表(进程除CPU以外的所有资源);
d)链接指针(进程队列中指向下一个进程的PCB首址)。
2)进程创建流程
(1)申请空白PCB
为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
如
果无空白PCB,可以创建一个新的PCB。
在本实验中,每次动态创建PCB。
(2)为新进程分配资源
为新进程分配内存空间和栈空间。
(3)初始化进程控制块
a)初始化标识信息;
b)初始化处理机状态信息;
c)初始化处理机控制信息。
(4)将新进程插入就绪队列
3)进程树,用于描述进程家族关系。
在进程创建过程中,需将每一个新增加的进程加
入到进程树中,有了清晰的父子关系,可以使资源继承或进程删除等操作变得很方便。
4)进程总链,它是一个PCB链表,每一个新创建的进程必须把其PCB放入总链中,
该总链可以对破坏的进程树进行修复,也方便PCB查找。
7、课题指导
输入课题提供的参考代码后,可以输入createpc命令创建进程,输入showdetail显
示每个进程及其子进程的信息,测试命令解释如下:
1)createpc创建进程命令。
参数:
1pid(进程id)、2ppid(父进程id)、3prio(优先级)。
示例:
createpc(2,1,2)。
创建一个进程,其进程号为2,父进程号为1,优先级为2。
2)showdetail显示进程信息命令。
3)exit退出命令行。
8、课题思考
1)进程创建的核心内容是什么?
2)该设计和实际的操作系统进程创建相比,缺少了哪些步骤?
9、参考程序
1)主程序文件源代码如下:
#include"basic.h"
pnode*proot;//systemprocesstreeroot
pnode*plink;//systemprocesslinkhead
//createprocess
intcreatepc(int*para)
{
//addyourcodehere
pnode*p,*p1,*pp;
intpflag;
pflag=0;
for(p=plink;p;p=p->next)
{
if(p->node->pid==para[0])//checkifthispidisalreadyexist
{
printf("pid%disalreadyexist!
\n",para[0]);
return-1;
}
if(p->node->pid==para[1])//findparentpcb
{
pflag=1;
pp=p;
}
}
if(!
pflag)
{
printf("parentid%disnotexist!
\n",para[1]);
return-2;
}
//initnewpcb
p1=newpnode;
p1->node=newpcb;
p1->node->pid=para[0];
p1->node->ppid=para[1];
p1->node->prio=para[2];
p1->sub=NULL;
p1->next=NULL;
p1->brother=NULL;
//addtoprocesstree
if(!
pp->sub)
pp->sub=p1;
else
{
for(p=pp->sub;p->brother;p=p->brother);
p->brother=p1;
}
//addtoprocesslink
for(p=plink;p->next;p=p->next);
p->next=p1;
return0;
}
//showprocessdetail
voidshowdetail()
{
//addyourcodehere
pnode*p,*p1;
p=plink;
for(;p;)//printallpcbinfo
{
printf("%d(prio%d):
",p->node->pid,p->node->prio);
p1=p->sub;
for(;p1;)//printsubpcb
{
printf("%d(prio%d)",p1->node->pid,p1->node->prio);
p1=p1->brother;
}
printf("\n");
p=p->next;
}
printf("\n");
}
//don'tchange
voidmain()
{
initerror();
shortcflag,pflag;
charcmdstr[32];
proot=newpnode;
proot->node=newpcb;
proot->node->pid=0;
proot->node->ppid=-1;
proot->node->prio=0;
proot->next=NULL;
proot->sub=NULL;
proot->brother=NULL;
plink=proot;
for(;;)
{
cflag=0;
pflag=0;
printf("cmd:
");
scanf("%s",cmdstr);
if(!
strcmp(cmdstr,"exit"))//exittheprogram
break;
if(!
strcmp(cmdstr,"showdetail"))
{
cflag=1;
pflag=1;
showdetail();
}
else
{
int*para;
char*s,*s1;
s=strstr(cmdstr,"createpc");//createprocess
if(s)
{
cflag=1;
para=(int*)malloc(3);
//getparameter
s1=substr(s,instr(s,'(')+1,strlen(s)-2);//getparamstring
para=strtoarray(s1);//getparameter
createpc(para);//createprocess
pflag=1;
}
}
if(!
cflag)
geterror(0);
elseif(!
pflag)
geterror
(1);
}
}
2)basic.h文件源代码如下:
#ifndefbasic_h
#include
#include
#include
#definebasic_h
char*errormsg[256];
//processcontrolblock
structpcb
{
intpid;//processid
intppid;//parentprocessid
intprio;//priority
intstate;//state
intlasttime;//lastexecutetime
inttottime;//totleexecutetime
};
//processnode
structpnode
{
pcb*node;
pnode*sub;
pnode*brother;
pnode*next;
};
//信号量
structsemphore{
charname[5];//名称
intcount;//计数值
intcurpid;//当前进程id
pnode*wlist;//等待链表
};
#definegeterror(eno)printf("%s\n",errormsg[eno])
voidiniterror()
{
errormsg[0]=(char*)malloc(20);
errormsg[0]="errorcommand!
";
errormsg[1]=(char*)malloc(20);
errormsg[1]="errorparameter!
";
}
//getasubstringinstrings
char*substr(char*s,intstart,intend)
{
char*s1;
intlen=strlen(s);
if(start<0||end>=len||start>end)
returnNULL;
s1=(char*)malloc(end-start+2);
for(inti=0;i<=end-start;i++)
s1[i]=s[i+start];
s1[i]='\0';
returns1;
}
//findthelocationofcinstrings
intinstr(char*s,charc)
{
inti;
for(i=0;iif(s[i]==c)
returni;
return-1;
}
//changethestringtoarraydata
int*strtoarray(char*s