最新进程的创建与并发执行

上传人:pu****.1 文档编号:549024402 上传时间:2023-03-29 格式:DOC 页数:13 大小:272KB
返回 下载 相关 举报
最新进程的创建与并发执行_第1页
第1页 / 共13页
最新进程的创建与并发执行_第2页
第2页 / 共13页
最新进程的创建与并发执行_第3页
第3页 / 共13页
最新进程的创建与并发执行_第4页
第4页 / 共13页
最新进程的创建与并发执行_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《最新进程的创建与并发执行》由会员分享,可在线阅读,更多相关《最新进程的创建与并发执行(13页珍藏版)》请在金锄头文库上搜索。

1、实验二 进程管理2.1 进程的创建与并发执行1. 实验目的(1) 加深对进程概念的理解 , 理解进程和程序的区别。(2) 认识并发进程的实质。分析进程争用资源的现象,学习解决进程互斥的方法。(3) 理解系统调用和用户命令的区别。2. 实验类型: 验证型3. 实验学时: 24. 实验原理和知识点(1) 实验原理: 程序的并发执行具有随机性和不可再现性。 程序并发执行会导致资源共享和 资源竞争, 各程序向前执行的速度会受资源共享的制约。 程序的动态执行过程用进程这个概 念来描述。 由于向前推进的速度不可预知, 所以多个进程并发地重复执行, 整体上得到的结 果可能不同。但要注意,就其中某单个进程而言

2、,其多次运行结果是确定的。(2) 知识点:进程、子进程、并发执行的特性;5. 实验环境(硬件环境、软件环境) :(1) 硬件环境: Intel Pentium III 以上 CPU, 128MB 以上内存, 2GB 以上硬盘(2) 软件环境: linux 操作系统。6. 预备知识(1) fork() 系统调用头文件: #include unix standard header/* 是 POSIX 标准定义的 unix 类系统定义符号常量的头文件,包含了许多 UNIX 系统服务 的函数原型,例如 read 函数、 write 函数和 getpid 函数 */ 函数原型: pid_t fork(v

3、oid);/* 是 Linux 下的进程号类型,也就是 Process ID _ Type的缩写。其实是宏定义的unsigned int 类型 */函数功能: fork 的功能是创建 子进程 。调用 fork 的进程称为 父进程 。如图 2.1 所示。子 进程是父进程的一个拷贝,它继承了父进程的用户代码、 组代码、 环境变量、 已打开的文件 代码、工作目录及资源限制。 fork 语句执行后,内核向父进程返回子进程的进程号,向子 进程返回 0。 父子进程都从 fork() 的下一句开始并发执行 。返回值:返回值 =-1 :创建失败。返回值 =0 : 程序在子进程中。返回值 0 : 程序在父进程中

4、。 (该返回值是子进程的进程号)编程提示: 虽然子进程是父进程的一个复制品,但父子的行为是不同的。编程时要抓住内 核的返回值。通过返回值,可以知道是父进程还是子进程,因而可以编写不同行为的代码。父退程(进程号;1869)include 匸 rr.am () int pl;plfark(); t这里裱返回1听口if(pi=a)printf(HBonnn); while(1);elseprintf(rtfathernH): wait();仓健进程子进程(进程号:16TO)注;子进程是父送程的一个拷贝父子送程都从下一包幵绘执行. 父子送程年发技厅#mclde int main() inE pl; p

5、l=fork ;t_这里披返回Difpl=Oprintf(sonXn; while(1);elseprintf(nfathernn; wait (;图 2.1 fork()创建进程示意图wait()系统调用头文件:#in clude 函数原型:pid_t wait(i nt *status);发出wait调用的进程只要有子进程,就会睡眠函数功能:wait的功能是等待子进程结束。直到子进程中的一个终止为止。若没有子进程,则该调用立即返回。函数参数:status是子进程退出时的状态信息。返回值:成功则返回子进程号,否则返回-1。getpid()系统调用头文件:unistd.h ,在 VC+6.0

6、下可以用 process.h函数原型:pid_t getpid(void);函数功能:wait的功能是将父进程挂起,等待子进程终止。getpid函数用来取得目前进程的进程ID,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。 返回值:目前进程的进程ID。(4) 其他系统调用 exit -终止进程execnice执行一个应用程序 改变进程的优先7. 实验内容与步骤(将所有截图换成用户名为你们自己姓名的拼音,并回答所有的问题)(1 )运行图2.1所示程序将图2.1中的源程序保存为 e201.c在终端中编译gcc p e201 e201.c运行./e201y i n ji.aot

7、tYou You S gcc -o e20i e201 . cI yinjiYouYou * )3 ./e201sonfather此时,程序为死循环,在该终端中无法继续输入命令执行,于是,我们可以暂时不管这一个终端,而是再新建一个终端,然后键入PS -3,列出当前所有进程 i nj iYou $ 卩!t 弋FID TTYThtE:CMD1 ?00:00:00I Hit2 ?00:00:00misrntinn/O3 ?00:00:00ksoftirqd/O4 ?00:00:00fitchdoE/O5 ?00:00:00events/06 ?00:00:00khelper7 ?00:00:00kt

8、hread10 ?00:00:00kblcKkd/O11 ?00:00:00kacpid175 ?O0iC0:0OcQucue/ti观察屏幕,是否有两个名为e201的进程。比较它们的进程号,判别哪个是父进程,哪个是子进程。3713 pts/100;00:00bash3755 pts/I00:00:00c2013756 pts/100i00:23e2dl3762 pts/200;00;00bash3790 pts/200:00:00psyi njiou SyinjiaotyouVou S kill 3755y i njl tntYauYou |S kill 3756 ylnJiaoYouYou

9、3 ps -eFID TTVTIMECMD1 ?00:00:00init2 ?OO; 00: 00 mi g rail di)/03 ?00:00:00ksoftirqd/O程序中的while(1);语句是为了不让程序退出来,以便于你观察进程状态。用kill 命令把这两个进程终止。可见,第一个终端如下图所示,已经从死循环中解救出来了。yinjiaotYouYou 3 - Z&201sonfather已终止y i n j i. noiiYouYd u *jS |ctrl+c强制结束。当然,最简单粗暴的方法不是关闭相关进程,而是直接通过 对图2.1的程序稍加改进,可看见两个进程的进程号。#incl

10、ude int main()int pl:pl=fork();if(pi=e)p rlntf ( son : dXn * ( getpid ();/whiled);elsewait();p rintf ( fathe r:%dn, getpid(); yi nji aoaYouYou S gcc -c e20I e201.c I yinjiao&YouYou *$ ./e201ton:3B45father:a844编写一段名为e202.c 的源程序,使用系统调用fork() 创建两个子进程 pl和p2。 pl 的功能为显示字符b ,p2的功能为显示字符c,父进程的功能为显示字符a,父进程和两个

11、子进程并发运行。不停的运行e202,观察并记录屏幕上的显示结果。程序设计过程:用while 语句控制fork() 直到创建成功。用if语句判别是在子进程中还是在父进程 中。程序运行后会创建三个进程,它们分别是子进程pl、p2、父进程。这三个进程并发运行。假定子进程有些任务要做, 完成这些任务要花一定时间, 因此,可以用一个延时函数简 单地模拟这些任务。e202.c#i nclude void delay(i nt x)/*int i,j;for(i=0;ix;i+) for(j=0;jx;j+);int mai n()in t p1,p2;while(p 1= fork()=-1);/*if(

12、p1=0)/*delay(4096);/*putchar(b);/*else while(p2=fork()=-1); /* if(p2=0)/*delay(2048);/*putchar(c);/*elseputchar(a);/*延时函数*/创建子进程pl */子进程pl创建成功*/子进程pl延时*/子进程pl显示字符b */创建子进程p2 */子进程p2创建成功*/子进程p2延时*/子进程p2显示字符c */父进程显示字符a */return 0;按向上的光标键、回车,运行刚才的程序。快速重复这个步骤,观察并记录结果。I yi njiaoYouYou S gcc -o e202 e202

13、cI yinjiaoYouYou S 4/e2Q2bcayinjiaottYouYou $ ./e202ca i i nji aofiiYouYou *S b. /e2C2I ayinji aoYcuYou S bc/e202I fly inJiao* You You * |S be. /e202*1 yinjiaottYouYou S he./e202a yi nji aoYouYou * S be - /e202a yinjiaoftYouYcu * S be,/e202basinjiaoYcuYou *S c./e202ca yinjiaoYouYolj $ b-/e202ca yinJ

14、iaoYcuYou *$ b. /e202I ayinjiaoYouYoubc./e202r一 _ -bJ请回答问题:屏幕上是否有时显示 bac,有时显示bca,。为什么会这样呢?(3) 参考(1)完成下列程序设计父子进程同步实验:编写一段程序,使用系统调用fork()创建一个子进程,子进程求1+2+100的和并打印出来,使用系统调用wait()让父进程等待子进程结束。请贴出源代码截图:include int main()int pl;pl=fork);if (pl=0)int i;int su m=01Tor(i=i;i+)(sum=sum+i; printf(son:dnf getpidf); printf 1 十2十十1)百寻小口 * ( sum);elsewaitO;prlntT(father;%dn , g

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号