【操作系统实验三——进程通信详解】
本实验主要探讨了两种进程间通信(IPC,Inter-Process Communication)的方式:管道(Pipe)和共享存储区(Shared Memory)。这些是操作系统中实现多进程协同工作的重要机制。
**一、管道通信**
1. **实验目标**:通过管道实现两个并发进程之间的数据实时传送,父进程负责接收,子进程负责发送。
2. **基本原理**:管道是一种半双工的通信方式,数据只能单向流动。在Linux中,可以通过`pipe()`系统调用来创建管道。管道中的数据会被缓冲,且具有先进先出(FIFO)的特性。
3. **实验步骤**:
- 父进程创建一个无名管道`fd[2]`,其中`fd[0]`用于读,`fd[1]`用于写。
- 父进程创建两个子进程`p1`和`p2`。
- 子进程通过`write()`函数将数据写入管道的写端,这里使用了`lockf()`函数对写端进行加锁,确保数据的原子性。
- 父进程通过`read()`函数从管道的读端接收数据,并输出到屏幕。
**二、共享存储区通信**
1. **实验目标**:通过共享存储区实现在两个并发进程之间交替发送和接收数据,模拟服务器(SERVER)与客户端(CLIENT)的交互。
2. **基本原理**:共享存储区允许多个进程访问同一块内存区域,实现数据的快速交换。在Linux中,可以使用`shmget()`创建共享内存段,`shmat()`将其映射到进程的地址空间。
3. **实验步骤**:
- SERVER进程创建一个键值为75的共享内存区,设置第一个字节为-1作为空闲标志。
- 当SERVER检测到共享内存的第一个字节改变时,它读取数据并处理,然后显示处理结果。
- CLIENT进程检查共享内存的第一个字节,若为-1则填充数据并显示发送信息,然后将共享内存的第一个字节设置为非-1。
- 该过程循环进行30次。
4. **注意点**:在实验中,SERVER和CLIENT都需要使用`shmctl()`系统调用来管理共享内存,例如在不使用时删除。
**总结**:这两个实验展示了进程通信的基本概念和操作。管道适合于简单、单向的数据传输,而共享存储区则允许更复杂的双向通信和数据共享。通过实践,学生能深入理解进程间的同步与通信机制,为后续学习操作系统原理和开发多进程应用打下基础。