操作系统实验报告 - -进程管理(2)

2020-06-05 09:09

daughter3 daughter4 daughter5 daughter6 daughter7 daughter8 daughter9 son0 son1 son2 son3 son4 son5 son6 son7 son8 son9 parent0 parent1 parent2 parent3 parent4 parent5 parent6 parent7 parent8 parent9

分析:程序开始定义了文件读写指针用于打开指定的文件,当文件不存在时则自动创建。然后有创建了一个进程p1,p1获得处理机执行,给文件读写指针加锁,这样,即使p1失去处理机,其他获得处理机的进程也无法访问文件指针指向的文件,当p1再次获得处理机后继续执行直至进程p1结束并解锁;p1结束后父进程获得处理机执行又创建了进程p2,p2获得处理机执行,也给文件指针加锁,同理直至p2运行完解锁;p2结束后父进程获得处理机,父进程也给文件指针加锁,直至父进程执行完毕解锁,程序结束。

2、按以下步骤分析下面的程序:

(1)查看程序执行的结果并估计程序执行所需要时间。

(2)将程序中所有的lockf函数加上注释,再观察程序执行的结果和估算程序执行所需的时间。

(3)分析这两次执行的结果与时间的区别。 #include #include main( ) {

int p1,p2,i;

p1=fork( ); /*创建子进程p1*/ if (p1==0) {

lockf(1,1,0); /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/ for(i=0;i<10;i++) {

printf(\ sleep(1); }

lockf(1,0,0); /*解锁*/ } else {

p2=fork(); /*创建子进程p2*/ if (p2==0) {

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

printf(\ sleep(1); }

lockf(1,0,0); /*解锁*/ } else {

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

printf(\ sleep(1); }

lockf(1,0,0); /*解锁*/ } } }

未加注释的执行结果:

child1=0 child1=1 child1=2 child1=3 child1=4 child1=5 child1=6

child1=7 child1=8 child1=9 child2=0 child2=1 child2=2 child2=3 child2=4 child2=5 child2=6 child2=7 child2=8 child2=9 parent0 parent1 parent2 parent3 parent4 parent5 parent6 parent7 parent8 parent9

加上注释的执行结果: child1=0 child2=0 parent0 child1=1 child2=1 parent1 child1=2 child2=2 parent2 child1=3 child2=3 parent3 child1=4 child2=4 parent4 child1=5 child2=5 parent5 child1=6

child2=6 parent6 child1=7 child2=7 parent7 child1=8 child2=8 parent8 child1=9 child2=0 parent9

分析:未加注释时程序运行时间大约是30秒,注释后的程序运行时间大约只是10秒钟。在注释掉之前,由于给后面的循环输出语句块加了锁,所以该语句只能被当前进程访问,即使其他进程获得处理机也无法访问,只有当前进程获得处理机并接着中断的地方继续执行完毕将锁释放其他的进程才能访问。所以输出结果按照顺序依次输出。由于sleep(1)语句在输出语句块中,每输出一次的要休眠1秒钟,所以大约需要30秒钟。

注释掉所有lockf()函数后,循环输出语句块没有被加锁,当当前进程失去处理机后,获得处理机的其它进程也可以继续输出。另外,当进程child1输出一句后进入1秒休眠,此间进程child2获得处理机并输出一句也进入1秒休眠,此时进程parent获得处理机输出一句后也进入1秒休眠,由于三进程是依次进入休眠,因此也会依次醒来,依次获得处理机,依次输出,再依次休眠,直至循环输出完毕。由于一个进程的输出是在其他两个进程休眠期间运行的,而这两个进程之一也在这个进程运行完一次输出进入休眠期间醒来,因此,只相当于休眠了10次,故大约需要10秒钟。

三、实验总结

1、fork()函数用于创建进程,返回值是整数。当为0时,表示当前进程是子进程;>0时,表示父进程。-1时,表示创建进程失败。子进程与父进程共享代码区,子进程复制父进程的数据区。

2、fork()创建进程的时候,子进程复制父进程的代码,要想改变子进程的代码就可以调用execl()来实现,调用execl()即可用于新程序的运行;注意exit()和_exit()的不同区别。

3、lockf(files,function,size)

用作锁定文件的某些段或者整个文件,从而实现互斥。头文件为#include \参数定义:

int lockf(files,function,size) int files,function; long size;

其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。


操作系统实验报告 - -进程管理(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:小学英语课新知导入方法探索

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: