操作系统课程设计指导书.docx

上传人:b****1 文档编号:269769 上传时间:2022-10-08 格式:DOCX 页数:71 大小:72.44KB
下载 相关 举报
操作系统课程设计指导书.docx_第1页
第1页 / 共71页
操作系统课程设计指导书.docx_第2页
第2页 / 共71页
操作系统课程设计指导书.docx_第3页
第3页 / 共71页
操作系统课程设计指导书.docx_第4页
第4页 / 共71页
操作系统课程设计指导书.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

操作系统课程设计指导书.docx

《操作系统课程设计指导书.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计指导书.docx(71页珍藏版)》请在冰豆网上搜索。

操作系统课程设计指导书.docx

淮阴工学院

操作系统

课程设计指导书

陈礼青

计算机工程学院

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;i

if(s[i]==c)

returni;

return-1;

}

//changethestringtoarraydata

int*strtoarray(char*s

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

当前位置:首页 > 外语学习 > 其它语言学习

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

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