实验三 进程的同步
一、 实验目的
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<stdlib.h>。
(2)sleep()等linux系统调用缺少头文件。
解决方法:加头文件#include<unistd.h>
2、体会和收获。
通过这次实验我知道了在不同的位置创建子进程执行的结果是不一样的,因为一次调用有两次返回;同时学到了更多的windows和linux的系统调用函数,也知道了一些新概念,比如句柄的的创建和关闭;学会了管道的概念,知道如何用管道进行进程间的通讯;知道了如何用lockf函数控制进程的执行结果,而不是随机的结果。同时我也更加深刻的了解了fork函数的调用过程。
六、附录:源程序代码(另附)
第二篇:进程创建模拟实验报告
进程创建模拟实验报告
一.实验目的
1.加深对进程概念的理解,明确进程和程序的区别。
2.深入了解系统如何组织进程,创建进程。
3.掌握进程相关数据结构。
二.实验要求
1.编写程序完成实验内容
2.对测试数据进行分析
3.撰写实验报告
三.实验内容
1.进程的创建
2.对代码进行测试
3.进程控制
四.实验原理
1.进程
(1)进程是程序是一次执行
(2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动
(3)进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
2.进程控制块
为了描述和控制进程的运行,系统为每个进程定义了一个进程控制块(PCB),它是进程实体的一部分,是操作系统管理进程最重要
的数据结构。其主要包含四类信息:进程标识符,处理机状态,进程调度信息,进程控制信息。
3.进程创建流程
(1)申请空白PCB
(2)为新进程分配资源
(3)初始化进程控制块
(4)将新进程插入就绪队列
4.进程树
P12 P6 P7 P8 P9 P10 P11 P2 P3 P1 P4 P5
五.实验步骤
1.在C++环境下输入实验提供的代码,并对程序运行
2.输入 createpc 命令创建进程,输入 showdetail 显示每个进程及其子进程的信息
3.对代码进行测试
六.实验总结
1.运行结果
2.解释函数
3.问题解答