进程创建模拟实现_第1页
进程创建模拟实现_第2页
进程创建模拟实现_第3页
进程创建模拟实现_第4页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目 1进程创建模拟实现1.1 题目的主要研究内容及预期达到的目标(1)至少创建 10 个进程;(2)创建进程树中 4 层以上的树型结构。(3)理解进程创建相关理论;(4)掌握进程创建方法;(5)掌握进程相关数据结构。1.2 题目研究的工作基础或实验条件(1)硬件环境:装有Linux 操作系统(虚拟机)的计算机一台。(2)软件环境: vim 编辑器、 Visual C+。1.3 设计思想(1)进程树进程的创建过程是操作系统重要的处理过程之一。在系统中运行的进程都是由进程创建出来的, 创建进程的进程与被创建的进程之间构成父子关系,子进程还可以再创建它的子进程,由此可以构成一颗进程树,如图1-1

2、所示。根进程进程进程子进程子进程子进程子进程子进程孙进程孙进程孙进程孙进程图 1-1进程树(2)根进程子进程的创建是基于父进程的,因此一直追溯上去,总有一个进程是原始的,是没有父进程的,这个进程是根进程。根进程没有可复制和参考的对象,它所拥有的所有信息和资源都是强制设置的,不可复制的,这个过程称为手工设置,也就是说根进程是“纯手工打造”的,它是操作系统中“最原始”的一个进程,它是个模子,后面的任何进程都是基于根进程生成的。在 Linux 系统中的这个根进程的进程号是0,也把它叫做 0 号进程。创造 0号进程主要包括两部分: 一是创建进程 0 运行时所需的所有信息, 即填充 0 号进程;二是调度

3、 0 号进程的执行,即让它“动”起来,只有动起来,才是真正意义上的进程,符合进程动态的概念。(3)进程的创建过程一但操作系统发现了要求创建进程的事件后,便调用进程创建原语按下述步骤创建一个新进程。A、申请空白 PCB为新进程申请获得唯一的数字标识符, 并从 PCB 集合中索取一个空白PCB。如果无空白 PCB,可以创建一个新的PCB。在本实验中,每次动态创建PCB。B、为新进程分配资源为新进程分配内存空间和栈空间。C、初始化进程控制块a) 初始化标识信息;b) 初始化处理机状态信息;c) 初始化处理机控制信息。D、将新进程插入就绪队列1.4 流程图开始输入指令NNexit?showdetail

4、 ?Y退出Y结束显示进程信息createpc?Y创建新进程图 1-2进程创建流程图1.5 主要程序代码( 1) 主程序源代码:#include "basic.h"pnode *proot;/ 系统进程树的树根pnode *plink;/ 系统进程树的连接头int createpc(int *para)pnode *p,*p1,*pp;/ 定义进程节点int pflag;/ 标识pflag=0;for(p=plink;p;p=p ->next)if(p ->node->pid = para0) / 检查进程是否已经存在printf(" 进程%d 已

5、经存在 !n",para0);return -1;if(p ->node->pid = para1) / 查找父进程pflag=1;pp = p;if(!pflag)printf(" 父进程%d 不存在 n",para1);return -2;/初始化一个新的进程控制块p1 = new pnode;/ 为 p1 创建一个新的节点p1->node=new pcb;/ 为 p1 节点创建一个新的进程控制块p1->node->pid = para0;/ 对 p1 进程 id 进行赋值p1->node->ppid = para1;

6、/ 对 p1 父进程 id 进行赋值p1->node->prio = para2;/ 对 p1 的优先级进行赋值p1->sub=NULL;/ 初始化p1->next=NULL;/ 初始化p1->brother=NULL;/初始化/添加进程树if(!pp ->sub)pp->sub=p1;elsefor(p=pp ->sub;p ->brother;p=p ->brother);p->brother=p1;/ 添加进程连接for(p=plink;p ->next;p=p ->next);p->next=p1;re

7、turn 0;/显示进程信息void showdetail()pnode *p,*p1;p=plink;/ 定位到头节点for(;p;) / 打印所有sub 的信息printf("%d( 优先级%d):",p ->node->pid,p ->node->prio);p1 = p ->sub;for(;p1;) / 打印出 p1 的控制块 (sub)信息printf("%d( 优先级%d)",p1 ->node->pid,p1 ->node->prio);p1 = p1 ->brother;pri

8、ntf("n");p = p ->next;printf("n");int main()initerror();short cflag,pflag;char cmdstr32;proot = new pnode;proot ->node=new pcb;proot ->node->pid=0;proot ->node->ppid= -1;proot ->node->prio=0;proot ->next=NULL;proot ->sub=NULL;proot ->brother=NULL;

9、plink=proot;for(;)cflag=0;pflag=0;printf("cmd:");scanf("%s",cmdstr);if(!strcmp(cmdstr,"exit")/退出程序 ,strcmp 函数比较两个字符串,相同返回 0break;if(!strcmp(cmdstr,"showdetail")/显示进程信息cflag = 1;pflag = 1;showdetail();else/创建进程int *para;char *s,*s1;s = strstr(cmdstr,"creat

10、epc"); /strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,if(s)/ 则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。cflag=1;para = (int *)malloc(3);s1 = substr(s,instr(s,'(')+1,strlen(s) -2); / 得到参数字符串para=strtoarray(s1);/ 得到参数para0,para1,para2createpc(para); /创建进程pflag=1;if(!cflag)geterror(0);else if(!p

11、flag)geterror(1);( 2) basic.h源代码:#ifndef basic_h#include<stdio.h>#include<string.h>#include<stdlib.h>#define basic_hchar *errormsg256;/进程控制块struct pcbint pid;/ 进程 idint ppid;/ 父进程 idint prio;/ 优先级;/进程节点struct pnodepcb *node;/ 控制块节点pnode *sub;/ 用来存放控制中第一个进入的兄弟节点pnode *brother;/ 兄弟节点

12、pnode *next;/ 下一个节点;/信号量struct semphorechar name5; / 名称int count;/ 计数值int curpid;/ 当前进程idpnode *wlist; / 等待链表;#define geterror(eno) printf("%sn",errormsgeno)void initerror()errormsg0 = (char *)malloc(20);errormsg0=(char *)" 错误的指令 !"errormsg1 = (char *)malloc(20);errormsg1=(char *

13、)" 错误的参数 !"/得到字符串的字串char * substr(char *s,int start,int end)char *s1;int i;int len = strlen(s);if(start<0 | end>=len | start>end)return NULL;s1=(char *)malloc(end -start+2);/ 强制转换for(i=0;i<=end -start;i+)s1i= si+start;/ 从 '('的下一个字符开始以此向s1i 赋值 ,一直到')'的前一个结束s1i=&#

14、39;0'return s1;/查找字符串中的位置int instr(char *s,char c)/ 返回 start 的值unsigned i;for(i=0;i<strlen(s);i+)if(si=c)return i;return - 1;/更改字符串数组数据int * strtoarray(char *s)int *a,count,x1;unsigned int i;char c, *s1,*s2;if(!s)printf(" 字符串不能为空!n");return NULL;count=0;s1=s;for(i=0;i<strlen(s1);i+)if(s1i=',')count+;count+;a = (int *)malloc(count);c=','for(i=0;i<(unsigned int)count;i+)x1 = i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论