进程间的通信方式
一个进程不可直接访问其他进程的地址空间。
以下方式的生命周期都随内核结束而结束,不手动释放就不会消失。
-
管道:内核中申请一块固定大小的缓冲区,程序有读写的权利。
a. 匿名管道:进程和子进程间通信
b. 有名管道:允许无血缘关系的进程间通信
特点:自带同步互斥机制,半双工
缺点:只能承载无格式字节流,携带信息量少;缓冲区大小受限。 -
消息传递:
a. 直接通信:消息直接挂在接收进程的消息缓冲队列上
b. 间接通信:消息先发送到中间实体上
在内核中的一个队列,其中的元素是一个数据块,可存储不同类型的数据。
缺点:数据块容量有上限,队列总数有上限 -
共享内存:
a. 基于数据结构的共享:速度慢,限制多,低级共享方式
b. 基于存储区的共享:映射一段能被其他进程访问的内存,由一个进程创建,多个进程可访问,是最高效的进程间通信方式。往往与其他通信机制配合使用。
特点:需要保证共享资源的同步互斥性;进程访问速度快,不需要从用户态和内核态之间频繁切换,从内存中读取即可。 -
信号量:用一个变量表示系统中某种资源的数量。
解决多进程竞争内存,用计数器实现针对一块内存的进程间同步互斥。
a. 整形信号量:用整数变量作为信号量,表示系统资源的数量。不满足“让权等待”,会发生“忙等”。
b. 记录型信号量:用记录型数据结构表示的信号量。
wait(S) signal(S):申请P(S--)、释放V(S++)系统资源,申请不到资源的进程进入阻塞队列等待,满足“让权等待”。
信号量实现进程互斥:
- 分析问题,确定临界区
- 设置同步信号量为1
- 临界区前对信号量执行P操作
- 临界区后对信号量执行V操作
信号量实现进程同步:
- 分析哪里需要实现同步关系,即“一前一后”执行的两个操作。
- 设置同步信号量S,value=0。
- 在“前操作”之后执行V(S)
- 在“后操作”之前执行P(S)
生产者消费者问题,同步互斥问题
- 当消息队列为空时,消费者需要等待生产者生产
- 消息队列满了后,生产者需要等消费者消费
两个同步信号量实现同步关系












网友评论