进程同步实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三进程的同步
一、实验目的
1、了解进程同步和互斥的概念及实现方法;
2、更深一步的了解fork()的系统调用方式。
二、实验内容
1、预习操作系统进程同步的概念及实现方法。
2、编写一段源程序,用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。程序的输出是什么?分析原因。
3、阅读模拟火车站售票系统和实现进程的管道通信源代码,查阅有关进程创建、进程互斥、进程同步的系统功能调用或API,简要解释例程中用到的系统功能或API的用法,并编辑、编译、运行程序,记录程序的运行结果,尝试给出合理的解释。
4、(选做)修改问题2的代码,使得父子按顺序显示字符“a”;“b”、“c”编辑、编译、运行。记录程序运行结果。
三、设计思想
1、程序框架
(1)创建两个子进程:(2)售票系统:
(3)管道通信:
先创建子进程,然后对内容加锁,将输出语句存入缓存,并让子进程自己进入睡眠,等待别的进程将其唤醒,最后解锁;第二个子进程也执行这样的过程。父进程等待子进程后读内容并输出。
(4)修改程序(1):在子进程的输出语句前加上sleep()语句,即等待父进程执行完以后再输出。
2、用到的文件系统调用函数
(1)创建两个子进程:fork()
(2)售票系统:DWORD WINAPI Fun1Proc(LPVOID lpPartameter);
CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
(HANDLE)CreateMutex(NULL,FALSE,NULL);
Sleep(4000)(sleep调用进程进入睡眠状态(封锁), 直到被唤醒);
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
(3)管道通信:pipe(fd),fd: int fd[2],其中: fd[0] 、fd[1]文件描述符(读、写);
lockf( fd,function,byte)(fd: 文件描述符;function: 1: 锁定 0:解锁;byte: 锁定的字节数,0: 从当前位置到文件尾);
write(fd,buf,byte)、read(fd,buf,byte) (fd: 文件描述符;buf : 信息传送的源(目标)地址;byte: 传送的字节数);
sleep(5);
exit(0);
read(fd[0],s,50)
(4)修改程序(1):fork(); sleep();
四、调试过程
1、测试数据设计
(1)创建两个子进程:
运行结果:(2)售票系统:
运行结果:
(3)管道通信:
运行结果:
(4)修改程序(1):
2、测试结果分析 (1)调用fork()创建一个子进程,当运行到第一个子进程输出了b ,当父进程运行时创建另一个子进程。所以出现了a ,b ,c 。还有可能是a ,c ,b 等等。
(2)两个线程相互切换,直到把票卖完停止。
(3)由pipe(fd)创建了一个管道(信号缓冲区),创建一个进程将信息写入buf ;再将buf 写入文件,再由父进程将信息读取出来输出。
pipe()调用可以创建一个管道(通信缓冲区)。当调用成功时,我们可以访问文件描述符fd[0]、fd[1](其中fd[0]是用来读的文件描述符,而fd[1]是用来写的文件描述符)。
lockf()函数允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。
wait(0)可以用来实现父子进程的同步。
(4)在子进程的输出语句前加上sleep()语句,即等待父进程执行完以后再输出。
五、总结
运行结果:
1、调试过程中遇到的主要问题及解决过程
(1)在修改程序(1)时,最开始使用了read()、schedual()、lock(),但是编译出现错误。
解决方法:使用sleep()函数。
(2)exit()缺少头文件。
解决方法:加头文件#include
(2)sleep()等linux系统调用缺少头文件。
解决方法:加头文件#include
2、体会和收获。
通过这次实验我知道了在不同的位置创建子进程执行的结果是不一样的,因为一次调用有两次返回;同时学到了更多的windows和linux的系统调用函数,也知道了一些新概念,比如句柄的的创建和关闭;学会了管道的概念,知道如何用管道进行进程间的通讯;知道了如何用lockf函数控制进程的执行结果,而不是随机的结果。同时我也更加深刻的了解了fork函数的调用过程。
六、附录:源程序代码(另附)