
操作系统上机实验报告,涉及进程间的管道通信。
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
1. 实验目标旨在深入理解进程的概念,明确进程与程序的区别。此外,还需进一步认识并发执行的本质,分析进程争用资源的现象,并学习解决进程互斥和同步的方法。同时,需要掌握Linux系统中进程通信的基本原理。进程是操作系统中至关重要的概念,贯穿始终,也是学习现代操作系统核心知识的关键。通过本次实验,要求深刻理解进程的实质以及进程管理的机制。具体而言,需要在Linux系统下模拟进程从创建到终止的全过程,从而体会进程创建过程、父进程与子进程之间的关系、进程状态的变化、以及进程间的互斥和同步机制。此外,还需要理解并实现进程调度原理以及以管道为代表的进程间通信方式。
2. 内容及要求:
该实验设计为一种实践型任务,要求学生独立编写程序代码。具体操作包括使用系统调用`pipe()`建立一条管道,并由两个子进程分别向管道写入消息: “Child process1 is sending a message!” 和 “Child process2 is sending a message!” 。随后,父进程从管道读取这两个子进程的信息,并将结果显示在屏幕上。实验过程中存在以下具体要求:首先父进程必须先接收子进程1发送的消息,然后再接收子进程2发送的消息;其次需要实现管道的互斥使用机制:当一个子进程正在对管道进行写操作时,另一个子进程必须暂停等待;为了实现互斥访问, 需要利用系统调用`lockf(fd[1],1,0)`对管道进行加锁操作, 随后使用 `lockf(fd[1],0,0)` 释放锁;最后需要实现父子进程之间的同步机制:当子进程将数据写入管道后应进入睡眠状态等待;当父进程尝试从一个空管道中读取数据时也应暂停等待直至有数据写入才被唤醒。
3. 相关系统调用:
* `fork()`: 用于创建新的子进程。函数原型为 `int fork();` 。返回值:在子进程中返回 0;在父过程中返回新创建的子过程 ID 值;若返回 -1 则表示创建失败。
* `wait()`: 用于控制父过程与子过程的同步。在父过程中调用 `wait()` 函数时会阻塞父过程直到有子过程结束;返回值大于 0 时为结束的子过程 ID 值;等于 -1 时表示调用失败。
* `exit()`: 用于结束当前处理器的执行流程. 函数原型为 `void exit( int status);` 其中 status 为结束状态码.
* `pipe()`: 用于创建一个管道结构体以便于进行双向通信. 函数原型为 `pipe(int fd);` ,其中 fd 是一个包含两个整数元素的数组, fd[0] 为读端, fd[1] 为写端; 返回值 0 表示成功, -1 表示失败.
* `sleep()`: 调用当前线程进入休眠状态一段时间后自动唤醒. 函数原型为 `sleep(int t);`, 其中 t 为休眠时间 (秒).
* `lockf()`: 用于对互斥资源进行加锁和解锁操作. 在本实验中, 该调用的格式为 `lockf(fd[1],1,0); /* 表示对管道的写端口加锁 */ 和 `lockf(fd[1],0,0); /* 表示对管道的写端口解锁 */`.
* `write(fd[1],String,Length)`: 将字符串 String 的内容写入到管道的写端口 fd[1]。
* `read(fd[0],String,Length)`: 从管道的读端口 fd[0] 读取信息并存储到字符串 String 中.
4. 程序流程:
父过程:
a) 创建一个管道;
b) 创建第一个子过程;
c) 创建第二个子过程;
d) 等待从管道中读取第一个子过程写入的数据并将其显示在屏幕上;
e) 等待从管道中读取第二个子过程写入的数据并将其显示在屏幕上;
f) 退出程序。
子过程:
a) 获取对管道写端口的锁定;
b) 将消息 “Child process n is sending a message!” 输入到变量 OutPipe 中 (n=1 或 n=2);
c) 将 OutPipe 中的消息写入到对应的管道;
d) 进入睡眠等待状态;
e) 释放对管道写端口的锁定;
f) 退出程序。
全部评论 (0)


