欢迎来到天天文库
浏览记录
ID:9303965
大小:47.50 KB
页数:6页
时间:2018-04-27
《《操作系统》实验一 进程创建》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验一进程创建与撤消一、实验目的通过进程的创建、控制和通讯的设计达到下述目的:⑴加深对进程概念的理解,明确进程和程序的区别;⑵进一步认识并发(共行)执行的概念,区别顺序执行和并发(共行)执行;⑶分析进程争用临界资源的现象,学习解决进程互斥的方法.二、实验要求实现进程控制中的进程创建和进程撤消的功能,使系统能正常工作,并支持内存中的多个用户进程依次调度执行。三、实验内容1、数据结构进程控制块pcb和进程队列结构1)进程控制块pcb定义my.h中定义了pcb结构。该结构中各符号的意义说明如下:structpcb{intid/*进程id号*/name[10];/*进程符
2、号名*/regxreg;/*进程现场保护区*/priority;/*进程优先级*/status;/*进程状态指针*/next;/*进程当前队列链接字*/all_q_next;/*总链队列链接字*/}pcba[num4];2)进程现场保护区regx定义typedefstrustregist{intflag;1ntax;intbx;intcx;intdx;intsi;intdi;intbp;intds;1ntes;lntsp;intSS;intip;intcs;}regx;2、算法1)进程的创建创建一个指名进程,调用格式为:pcbcreat(name);该调用的入口是
3、一个字符指针,指向创建进程符号名字符串,出口是创建进程pcb的地址,它由一个全程变量pcb_addr指向创建进程pcb的首址。创建一个进程的主要工作是找一个空的pcb结构(即id=-1的pcb结构),然后根据系统进程和用户进程的不同填写pcb的信息。用户进程的id为pcb结构数组中的序号,状态为"ready“。其优先级在prio的基础上变化。而系统进程的id应设置为一个特殊值(例如100),其状态为"system",优先级定为0。有关pcb现场保护区的信息,因为调用pcbcreat之前已对进程进行了初始化工作,且初始信息都已送到内存r区,所以在pcbcreat中设
4、置pcb现场信息只需将r区的内容送pcb的reg区即可。其功能描述如下:进程创建算法算法pcbcreat输入:指向创建进程符号名的指针输出:指向创建进程pcb首址的指针(全程变量pcb_addr){在pcb总链队列中查找同名进程;if(有同名进程){显示出错信息;exit();}在pcb池中找一个空的pcb结构;if(无空pcb){显示出错信息;exit();}pcb_addr指向找到的pcb结构首址;if(是系统进程){设置系统进程pcb信息;}else{设置用户进程pcb信息;}将r区内容送新创建进程pcb的reg区;新创建进程入总链队列;if(是用户进程)插
5、入到就绪队列;}创建流程如下:入口查pcb总链有同名?向pcb资源池申请一个空的pcb结构有pcb?将入口信息填入pcb相应项将pcb入就绪队列和总链队列返回2)进程撤消kill进程撤消功能由kill()完成。其功能就是从总链队列中摘下此pcb结构,并将该pcb中的id置为-1,然后转进程调度程序。3)查找同名进程searchsearch函数的功能是在pcb总链上查找同名进程,若有同名进程存在,则返回的指针值为找到的pcb地址,否则指针值为空。此函数定义如下:struetpcbfar*search(name)char*name.说明:该函数的返回值为指向pcb结构
6、的指针。四.示例(1)用4个基本系统调用实现进程的创建、执行和自我终止:①fork()。创建一个子进程。用它创建的子进程是fork调用者进程(即父进程)的复制品,即进程映象。除了进程标识数以及与进程特性有关的一些参数外,其它与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度。如果创建进程失败,则fork()返回值为-1:若创建进程成功,则从父进程返回值是子进程号,从子进程返回的值是0,返回值在R0。m=fork()。②wait()。父进程处于阻塞(或等待)状态,等待子进程执行完成终止后继续工作。其返回值R0为等待子进程的子进程号。n=wait(
7、)。③exit()。子进程自我终止,释放所占资源,通知父进程可以删除自己。此时它的状态变成P_state=SZOMB。④getpid()。获得进程的标识数(进程号),一般是正整数。P=getpid()。编程示例:例1.编写一个程序,父进程生成一个子进程,父进程等待子进程wait(),子进程执行完成后自我终止exit(),并唤醒父进程。父、子进程执行时打印有关信息。main(){inti,j,k;if(i=fork())//非零值{j=wait();printf(“Parentprocess!”);printf(“i=%dk=%d,i,k);}else{k=
8、getpi
此文档下载收益归作者所有