操作系统实验报告----进程管理_第1页
操作系统实验报告----进程管理_第2页
操作系统实验报告----进程管理_第3页
操作系统实验报告----进程管理_第4页
操作系统实验报告----进程管理_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上实验内容:进程管理一、 实验目的1、 掌握Linux中进程的创建方法及执行情况;2、 加深对进程、进程树等概念的理解;3、掌握Linux中如何加载子进程自己的程序;4、掌握父进程通过创建子进程完成某项任务的方法;5.、掌握系统调用exit()和_exit()调用的使用。6、分析进程竞争资源的现象,学习解决进程互斥的方法;进一步认识并发执行的实质二、 实验内容(一)进程的创建1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符。#include<stdio.h&

2、gt;main() int p,x; p=fork(); if(p>0) x=fork(); if(x>0) printf("fathern"); else printf("child2"); else printf("child1");输出结果:child1child2father2、运行以下程序,分析程序执行过程中产生的进程情况。#include <stdio.h>main()  int p,x;  p=fork();  if 

3、(p>0)    fork();  else      fork();      fork();       sleep(15);  实验步骤:编译连接 gcc o forktree forktree.c后台运行 ./forktree &使用 pstree

4、 h 查看进程树运行结果: gnome-terminalbashforktreeforktreeforktreeforktree                                     

5、;          forktree                                     forktree&

6、#160;                          pstree分析:程序运行,系统首先创建一个进程forktree,执行到p=fork()创建一个子进程forktree,子进程获得处理机优先执行,父进程等待;执行else,当执行到第一个fork()函数时,子进程创建了一个进程forktree,称之为孙进程,孙进程获得处理机往下

7、执行,子进程等待;执行到第二个fork()函数时,孙进程又创建一个进程forktree,称之为重孙进程,重孙进程很快执行完,将处理机还给孙进程,孙进程很快执行完,将处理机还给子进程;子进程继续往下执行,执行到第二个fork()函数,又创建一个进程forktree,称之为第二孙进程,并获得处理机执行,此进程很快执行完,将处理机还给子进程,子进程也很快执行完,将处理机还给父进程,父进程P>0执行if语句,运行fork()函数,又创建一个进程forktree,称之为第二子进程,此进程获得处理机执行很快运行完,将处理机还给父进程,父进程运行sleep(15)语句,休眠15秒,用pstree命令查

8、询进程树。3、运行程序,分析运行结果。#include <stdio.h>main() int p,x,ppid,pid;  x=0;  p=fork();  if(p>0)     printf("parent output x=%dn",+x);      ppid=getpid();    &#

9、160; printf("Thi id number of parent is:ppid=%dn",ppid);         else     printf("child output x=%dn",+x);      pid=getpid();  

10、60;   printf("Thi id number of child is:pid=%dn",pid);     运行结果:Parent output x=1This id number of parent is:ppid=3110Child output x =1This  is number of&#

11、160;child is:pid=3111分析:fork创建进程的时候子进程与父进程共享代码区,子进程复制父进程的数据区,所以,两个进程中的数据互不影响都是1。4、loop.c#include <stdio.h>main()  while(1)  ;实验步骤:编译 gcc loop.c o loop后台运行 ./loop &(可多次使用该命令)多次使用ps命令查看进程状态结果:F S   UID  

12、; PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD0 S   1000  2645  2643     0  80  &#

13、160;0 -  1444 wait     pts/0    00:00:00 bash0 R   1000  3622  2645    78  80   0 -   403 -     

14、;   pts/0    00:00:18 loop0 R   1000  3627  2645    39  80   0 -   403 -        pts/0    0

15、0:00:02 loop0 R   1000  3628  2645    39  80   0 -   403 -        pts/0    00:00:01 loop0 R   1000&#

16、160; 3630  2645     0  80   0 -   625 -        pts/0    00:00:00 ps(二)进程控制1、设计一程序,父进程创建一子进程,子进程的功能是输出“hello world!”,使用execl()加载子进程的程序。程序代码如下

17、:execl.c程序:#include<stdio.h>#include<stdlib.h>#include<unistd.h>main()int p;p=fork();if(p>0) printf("father is running!n");else printf("child is running!n"); execl("./hello","hello",0);printf("child is running!n");hello.c程序:#incl

18、ude<stdio.h>main() printf("hello world!n");输出结果:child is running!hello world!father is running!2、运行以下程序,分析程序执行结果。#include<stdlib.h>#include <stdio.h>main() int p;   p=fork();  if (p>0)     printf(&qu

19、ot;this is parent ");  else      printf("this is child firstn”);      printf("this is child second ”);      _exit(0);   

20、       执行结果:this is child firstthis is parentchunRedFlagLinux jjz$换为exit(0)的执行结果:this is child firstthis is child second this is parentchunRedFlagLinux jjz$分析:_exit()只是返回进程状态SZOMB,不清除缓冲区内容; exit(0)表示进程正常终止;(三)、进程的互斥1、利用cat  to_be_locked.txt

21、 查看下面程序的输出结果。#include<stdio.h>#include<unistd.h>main()int p1,p2,i;int *fp;fp=fopen("to_be_locked.txt","w+");if(fp=NULL)printf("Fail to create file");exit(-1);while(p1=fork()=-1);/*创建子进程p1*/if(p1=0)lockf(*fp,1,0);/*加锁*/for(i=0;i<10;i+) fprintf(fp,&quo

22、t;daughter%dn",i);lockf(*fp,0,0);/*解锁*/elsewhile(p2=fork()=-1); /*创建子进程p2*/if(p2=0)lockf(*fp,1,0); /*加锁*/for(i=0;i<10;i+) fprintf(fp,"son%dn",i);lockf(*fp,0,0); /*解锁*/elsewait(NULL);lockf(*fp,1,0); /*加锁*/for(i=0;i<10;i+) fprintf(fp,"parent%dn",i);lockf(*fp,0,0); /*解锁*/

23、fclose(fp);执行结果:daughter0daughter1daughter2daughter3daughter4daughter5daughter6daughter7daughter8daughter9son0son1son2son3son4son5son6son7son8son9parent0parent1parent2parent3parent4parent5parent6parent7parent8parent9分析:程序开始定义了文件读写指针用于打开指定的文件,当文件不存在时则自动创建。然后有创建了一个进程p1,p1获得处理机执行,给文件读写指针加锁,这样,即使p1失去处理机

24、,其他获得处理机的进程也无法访问文件指针指向的文件,当p1再次获得处理机后继续执行直至进程p1结束并解锁;p1结束后父进程获得处理机执行又创建了进程p2,p2获得处理机执行,也给文件指针加锁,同理直至p2运行完解锁;p2结束后父进程获得处理机,父进程也给文件指针加锁,直至父进程执行完毕解锁,程序结束。2、按以下步骤分析下面的程序:(1)查看程序执行的结果并估计程序执行所需要时间。(2)将程序中所有的lockf函数加上注释,再观察程序执行的结果和估算程序执行所需的时间。(3)分析这两次执行的结果与时间的区别。#include <stdio.h>#include &

25、lt;unistd.h>main( )  int p1,p2,i;  p1=fork( );      /*创建子进程p1*/  if (p1=0)        lockf(1,1,0);      /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/  &

26、#160;  for(i=0;i<10;i+)              printf("child1=%dn",i);        sleep(1);            lockf(1,0,0); 

27、;                   /*解锁*/    else        p2=fork();          /*创建子进程p2*/   

28、0;if (p2=0)             lockf(1,1,0);       /*加锁*/       for(i=0;i<10;i+)              

29、printf("child2= %dn",i);       sleep(1);              lockf(1,0,0);           /*解锁*/       

30、;   else              lockf(1,1,0);         /*加锁*/        for(i=0;i<10;i+)         

31、;              printf(" parent %dn",i);            sleep(1);               

32、 lockf(1,0,0);         /*解锁*/          未加注释的执行结果:child1=0child1=1child1=2child1=3child1=4child1=5child1=6child1=7child1=8child1=9child2=0child2=1child2=2child2=3child2=4child2=5child2=6child2=7child2=8child2=9parent0parent1parent2parent3parent4parent5parent6parent7parent8parent9加上注释的执行结果:child1=0child2=0parent0child1=1child2=1parent1child1=2child2=2parent2chi

温馨提示

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

评论

0/150

提交评论