《实验一 进程控制 报告.docx》由会员分享,可在线阅读,更多相关《实验一 进程控制 报告.docx(5页珍藏版)》请在优知文库上搜索。
1、实验一进程控制一、实验目的:加深对进程概念的理解,明确进程和程序的区别;掌握LinUX操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化;进一步认识并发执行的实质,编写并发程序。二、实验平台:虚拟机:VMWare9以上操作系统:UbUntUI2.04以上编辑器:GeditIVim编译器:Gcc三、实验内容:(1)编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示“身份信息”:父进程显示“Parentprocess!PID=xxxlPPlD=XXX2”:子进程显示wChildxprocess!P
2、ID=xxxPPID=Xxx”。多运行几次,观察记录屏幕上的显示结果,并分析原因。说明:XXXl为进程号,用geipid()函数可获取进程号;xxx2为父进程号,用getppid()函数可获取父进程号;Childx中X为1和2,用来区别两个子进程;Wait()函数用来避免父进程在子进程终止之前终止。程序源码:#include#include#include#defineNUM2intmain(void)pid_tpidl,pid2;if(pidl=fork()0)PrintfC创建进程1失败);)elseif(pidl=O)/子进程1执行printf(Childlprocess:);print
3、f(PID=%dPPlD=%dn,getpid(),getppid();sleep(2);)else(if(pid2=fork()0)Primf(创建进程2失败)elseif(pid2=O)子进程2执行printf(,Child2process:);printf(PID=%dPPID=%dn,getpid(),getppid();)else父进程执行wait();wait();printf(Parentprocess:);printf(PID=%dPPID=%dn,getpid(),getppid();exit(0);执行结果WhtCmiSSWhtCmiSS-VirtUalBox:/Deskt
4、op$gcctest1.c-otestwhtcmisswhtcmiss-VirtualBox:/Desktop$./testChild2process:PID=2527PPID=2525Childlprocess:P1D=2526PP1D=2525Parentprocess:PID=2525PPID=2127whtcmisswhtcmiss-VirtualBox:/Desktop$./testChild2process:PID=253OPPID=2528Childlprocess:PID=2529PPID=2528Parentprocess:PID=2528PPID=2127WhtCmiSSW
5、htCmiSS-VirtUaIBOx:/Desklop$./testChild2process:PID=2533PPID=2531Child1process:PID=2532PP1D=2531Parentprocess:PID=2531PPID=2127实验结果分析:第一次程序运行结果,两个子进程的PPlD都是2525,是由同一个进程创建。而父进程PlD是2525,父进程PPlD是2127,说明父进程也是一系统进程的子进程。第二次程序运行结果,父进程PID是2528,PPID是2127,说明父进程是由同一进程创建的,父进程也是以子进程的方式存在,且进程ID是逐渐递增的。(2)fork()和ex
6、ec()系列函数能同时运行多个程序,利用上述函数将下面单进程顺序执行的程序Single.c改造成可并发执行3个进程的程序mulkprocess.c;并用time命令获取程序的执行时间,比较单进程和多进程运行时间,并分析原因。/single.cincludedefineNUM5intmain(void)(voidprint_msg(char*m);print-msg(,Good);print_msg(Morning);print_msg(H007nn);将007替换为本人学号return0;voidprint_msg(char*m)inti;for(i=0;iNUM;i+)printf(,%s,
7、m);fflush(stdout);sleep(l);)编译运行方法:#gccsingle.c-osingle#time./single单线程执行结果:whtcmtss0whtcniss-Vtrtual.Box:/Desktop$gccsingle.c-osinglewhtcmisswhtcniss-VirtualBox:-/Desktopstime./singleGoodGoodGoodGoodGoodMorningMorningMorningMorningMorning213824419213O82441920130824419213824419213O824419realml5.lsus
8、erm.lssys.2sWhtcmisswhtciniss-VirtualBox:-/DesktopS多线程代码:#multi_process.c#include#include#include#defineNUM5intmain(void)(pid.tpid3;inti;for(i=l;i=3;i+)pidi-l=fork();if(pidi-l=Opidi-l=-l)break;Iif(pidO=O)execl(,print,print,Good,NULL);elseif(pidl=O)execl(print,print,Hello,NULL);)elseif(pid2=0)execl(p
9、rint,print,20l300814113,NULL);1wait();wait();wait();exit(O);11return0;whtcmtsswhtcmtss-VirtualBox:-/DesktopStime./single201300824419HelloGood213824419HelloGood2130824419HelloGoodGoodHello2130824419213O0824419HelloGoodreal0n5.O5suserm0.0sISySe11e.eees_实验分析:第二个实验结果,第二个程序的多线程因为是并发执行,而且是有三个线程,所以在时间上几乎是单线程的1/3,而且因为是并发的,所以打印结果是无序的。实验总结本次实验首先要明确进程和程序的区别,我通过在Linux操作系统的进程创建和终止操作,运行父进程和子进程,查看运行结果和进程状态的变化。实验过程中也了解了父进程与子进程的运行过程及其机制。