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

下载本文档

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

文档简介

题目1进程创建模拟实现1.1题目的主要研究内容及预期达到的目标至少创建10个进程;创建进程树中4层以上的树型结构。理解进程创建相关理论;掌握进程创建方法;掌握进程相关数据结构。1.2题目研究的工作基础或实验条件硬件环境:装有Linux操作系统(虚拟机)的计算机一台。软件环境:vim编辑器、VisualC++。1.3设计思想(1)进程树进程的创建过程是操作系统重要的处理过程之一。在系统中运行的进程都是由进程创建出来的,创建进程的进程与被创建的进程之间构成父子关系,子进程还可以再创建它的子进程,由此可以构成一颗进程树,如图1-1所示。根进程进程 进程子进程 子进程 子进程 子进程 子进程//\孙进程孙进程孙进程孙进程图1-1进程树(2)根进程子进程的创建是基于父进程的,因此一直追溯上去,总有一个进程是原始的,是没有父进程的,这个进程是根进程。根进程没有可复制和参考的对象,它所拥有的所有信息和资源都是强制设置的,不可复制的,这个过程称为手工设置,也就是说根进程是“纯手工打造”的,它是操作系统中“最原始”的一个进程,它是个模子,后面的任何进程都是基于根进程生成的。在Linux系统中的这个根进程的进程号是0,也把它叫做0号进程。创造0号进程主要包括两部分:一是创建进程0运行时所需的所有信息,即填充0号进程;二是调度0号进程的执行,即让它“动”起来,只有动起来,才是真正意义上的进程,符合进程动态的概念。(3)进程的创建过程一但操作系统发现了要求创建进程的事件后,便调用进程创建原语按下述步骤创建一个新进程。A、 申请空白PCB为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。如果无空白PCB,可以创建一个新的PCB。在本实验中,每次动态创建PCB。B、 为新进程分配资源为新进程分配内存空间和栈空间。C、 初始化进程控制块a) 初始化标识信息;b) 初始化处理机状态信息;c) 初始化处理机控制信息。D、 将新进程插入就绪队列1・4流程图开始开始图1-2进程创建流程图1.5主要程序代码(1)主程序源代码:#include"basic.h"pnode*proot;〃系统进程树的树根pnode*plink;〃系统进程树的连接头intcreatepc(int*para){pnode*p,*pl,*pp;〃定义进程节点intpflag;//标识pflag=0;for(p=plink;p;p=p->next){if(p->node->pid==para[0])//检查进程是否已经存在{printf("进程%d已经存在!\n",para[0]);return-l;}if(p->node->pid==para[l])//查找父进程{pflag=l;pp=p;}}if(!pflag){printf("父进程%d不存在\n",para[1]);return-2;}//初始化一个新的进程控制块pl=newpnode;//为pl创建一个新的节点p1->node=newpcb;//为pl节点创建一个新的进程控制块p1->node->pid=para[0];〃对p1进程id进行赋值p1->node->ppid=para[1];〃对p1父进程id进行赋值p1->node->prio=para[2];〃对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;return0;}//显示进程信息voidshowdetail(){pnode*p,*p1;p=plink;〃定位到头节点for(;p;)//打印所有sub的信息{printf("%d(优先级%d):",p->node->pid,p->node->prio);p1=p->sub;for(;pl;)//打印出pl的控制块(sub)信息{printf("%d(优先级%d)",pl->node->pid,pl->node->prio);pl=pl->brother;}printf("\n");p=p->next;}printf("\n");}intmain(){initerror();shortcflag,pflag;charcmdstr[32];proot=newpnode;proot->node=newpcb;proot->node->pid=0;proot->node->ppid=-l;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"))〃退出程序,strcmp函数比较两个字符串,相同返回0break;if(!strcmp(cmdstr,"showdetail"))//显示进程信息{cflag=1;pflag=1;showdetail();}else//创建进程{int*para;char*s,*s1;s=strstr(cmdstr,"createpc");//strstr()函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,if(s) //则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。{cflag=1;para=(int*)malloc(3);s1=substr(s,instr(s,'(')+1,strlen(s)-2);//得到参数字符串para=strtoarray(sl);〃得到参数para[0],para[l],para[2]createpc(para);//创建进程pflag=l;}}if(!cflag)geterror(0);elseif(!pflag)geterror(l);}}(2)basic.h源代码:#ifndefbasic_h#include<stdio.h>#include<string.h>#include<stdlib.h>#definebasic_hchar*errormsg[256];//进程控制块structpcb{intpid;〃进程idintppid;//父进程idintprio;//优先级};//进程节点structpnode{pcb*node;〃控制块节点pnode*sub;〃用来存放控制中第一个进入的兄弟节点pnode*brother;〃兄弟节点pnode*next;〃下一个节点};//信号量structsemphore{charname[5];//名称intcount;//计数值intcurpid;//当前进程idpnode*wlist;//等待链表};#definegeterror(eno)printf("%s\n",errormsg[eno])voidiniterror(){errormsg[0]=(char*)malloc(20);errormsg[0]=(char*)"错误的指令!";errormsg[1]=(char*)malloc(20);errormsg[1]=(char*)"错误的参数!";}//得到字符串的字串char*substr(char*s,intstart,intend){char*s1;inti;intlen=strlen(s);if(start<0||end>=len||start>end)returnNULL;sl=(char*)malloc(end-start+2);〃强制转换for(i=0;i<=end-start;i++)s1[i]=s[i+start];//从'('的下一个字符开始以此向s1[i]赋值,一直到')'的前一个结束s1[i]='\0';returns1;}//查找字符串中的位置intinstr(char*s,charc)〃返回start的值{unsignedi;for(i=0;i<strlen(s);i++)if(s[i]==c)returni;return-1;}//更改字符串数组数据int*strtoarray(char*s){int*a,count,x1;unsignedinti;charc,*s1,*s2;if(!s){printf(”字符串不能为空!\n");returnNULL;}count=0;s1=s;for(i=0;i<strlen(s1);i++)if(s1[i]==',')count++;count++;a=(int*)malloc(count);c=',';for(i=0;i<(unsignedint)count;i++){x1=instr(s1,c);if(x1>=0)

s2=substr(s1,0,x1s2=substr(s1,0,x1-1);elses2=s1;a[i]=atoi(s2);〃将字符串转换成数组if(c==',')s1=substr(s1,x1+1,strlen(s1)-1);}returna;}#endif1.6运行结果及分析A.匚PPA.CPP*a.outbasic.hbasic・h~ztang@ubuntu:~/os/ljinchengchuangjianS*/zcnd:createpc(l,0„2)end:createpcf2^6,3)cmd:createpc(3,1,4)end:createpc(4,1,3)end:createpc(5,Z,3)end:createpcffi,2,4)end:createpc(7,3,6)end:createpc(8f3,2)lend:createpc(9,4,5)cmd:createpc(10,4,6)cndicreatepctll^S,3)cmdicreatepc(12,6,5)2) 2(优先级4) 4(优先级3) 6(优先级08(优先级5) 10(优先级6)优先级2) 2(优先级4) 4(优先级3) 6(优先级08(优先级5) 10(优先级6

温馨提示

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

评论

0/150

提交评论