操作系统原理进程管理及进程通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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页

相关文档
最新文档