操作系统原理进程管理及进程通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如有你有帮助,请购买下载,谢谢!
广州大学学生实验报告
一、实验目的
1、掌握进程的概念,明确进程的含义
2、认识并了解并发执行的实质
3、了解什么是管道
4、熟悉UNIX/LINUX支持的管道通信方式
二、实验器材
1、计算机一台。
2、Linux
三、实验内容
1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
3、编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。
四、实验步骤、记录和结果
实验二进程管理实验
(一)进程的创建实验
1.使用vi输入下面代码
编译运行结果:
从执行情况来看,可能输出bac,bca...
2.使用vi输入下面代码
编译运行结果:
分析原因:
1、从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。
2、由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。
1页
如有你有帮助,请购买下载,谢谢!
实验总结:
通过这次实验,即时在多进程中printf()在输出字符串时不会被中断。调用fork()会使运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。调用一次却返回2次这点也是非常特殊的。
思考题:
(1)系统是怎样创建进程的?
操作系统通过进程创建原语来创建一个进程。
创建原语通过下述步骤创建一个进程:
1.申请空白PCB
2.为新进程分配资源
3.初始化进程控制块
4.讲新建进程插入就绪态队列
(2)当首次调用新创建进程时,其入口在哪里?
fork之后。系统调用穿件的子进程继承了原进程的context,但由于子进程也继承了父进程的程序指针,所以子进程是从fork()之后的语句开始执行,也就是新进程的入口。
实验三进程通信实验
(二)进程的管道通信实验
使用vi输入下面代码:
编译运行结果
结果分析
首先在向管道写入“child 1....”之前,下面的第一句作用就是给其上锁,使得其他进程不得使用该管道,等到写完之后,倒数第二句将其解锁,然后调用exit(0)正常退出,清楚进程占用资源。
在主进程读取管道数据输出这段使用得很有考究,使用了2个wait(0),
它的作用是等待子进程完成对管道的写入执行完毕后,等待唤醒后才开始读取管道数据,避免因为主进程过早结束,而子进程未结束而产生僵尸进程。
思考题
1、程序中的sleep(5)起什么作用?
暂停子进程5秒,让其它进程有机会运行。
2、子进程1和2为什么也能对管道进行操作?
父进程通过调用pipe()创建无名管道,而子进程1和2同属一个父进程,都知道该管道文件描述符,所以可以直接访问该管道进行数据传输。
心得体会
通过这次实验对lockf(),wait(),sleep()等函数有更深的理解。从实现方式可以看出,使用管道进行进程通信是很原始的方式,但是要学习好操作系统原理,必须对原理性的基本性的功能要有深刻的理解认识才能学好。
2页