1、进程间通信方式:不同进程间各种消息传递的方式
管道pipe
(亲缘关系父子进程使用)、
FIFO(有名管道)
消息队列
信号量
共享内存
socket套接字
远程过程调用RPC
2、进程间同步方式:防止多个进程同时修改同一资源临界区
互斥锁、条件变量、读写锁、记录锁、信号量
3、IPC对象的持续性:
随进程持续的
随内核持续的
随文件系统持续的
4、Posix IPC:
Posix消息队列
mq_open\mq_close\mq_send\mq_receive
Posix信号量
sem_open\sem_wait\sem_post\
Posix共享内存区
shm_open\shm_unlink\mmap\munap
5、SystemV IPC:
SystemV消息队列
msgget\msgctl\msgsnd\msgrcv
SystemV信号量
semget\semctl\semop
SystemV共享内存
shmget\shmctl\shmat\shmdt
6、消息传递:
管道pipe
:用于亲缘关系父子进程间通信、全双工双向、无名管道、
FIFO
:单向半双工、有名管道、可用于无亲缘关系
Posix消息队列
:消息链表、写权限线程放消息、读权限线程取消息、具有内核持续性、断电消失
返回最高优先级的最早消息、有消息发送信号提醒
SystemV消息队列:
返回指定优先级的消息
7、同步方式:多个进程间共享的某个内存区中,也允许这些方式进程间同步
互斥锁:
用于保护临界区(被操纵的数据)critical region、保证只有一个进程或线程在执行其代码
通常保护由多个进程或多个线程分享的共享数据
互斥锁每一次上锁解锁都会造成CPU浪费、可以使线程进程睡眠
条件变量:
等待信号发送
读写锁:
共享-独占上锁,一写称独占锁,多读称共享锁、银行账户的访问和交易
使用互斥锁和条件变量实现读写锁、被保护数据的读访问比写访问更频繁时
读写所能提供更高的并发性
记录上锁
:读写锁的一种扩展、用于亲缘关系和无亲缘关系的进程之间共享某个文件的读写
当读写锁是共享内存区中多进程间共享时,该数据要使用
PTHREAD_PROCESS_SHARED
初始化
文件锁:
fcntl记录上锁提供一个文件强制性上锁功能,这些锁用不同进程间上锁于
Posix信号量:
是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语
Posix有名信号量:使用IPC名字标识,可用于进程或线程间同步
Posix基于内存的信号量:存放在共享内存中,可用于进程或线程间同步
SystemV信号量:
在内核中维护,可用于进程或线程间同步
信号量:二值信号量、计数器信号量semaphore
创建、等待P-、挂出V+
信号量的挂出不必由执行过它的等待操作的同一线程执行
互斥锁必须总是由锁住它的线程解锁,
信号量、互斥锁、条件变量
之间的三个差异
互斥锁必须总是由它上锁的线程解锁,
信号量的挂出却不必由执行过它的等待操作的同一线程执行
互斥锁要么被锁住、要么被解开
信号量挂出操作总是被记住,当向一个条件变量发送信号时,如果没有
线程等待在该条件变量上,那么该信号将丢失
提供信号量的主要目的是提供一种进程间同步方式,这些进程可能共享也可能不共享内存区
互斥锁和条件变量是作为线程间的同步机制,这些线程总是共享内存区也可用于进程间
信号量意图在于进程间同步,也可用于线程间,
8、共享内存区
:是IPC形式中最快的、
内存区映射到共享它的进程地址空间,进程间数据的传递不在设计内核
需要某种形式同步、互斥锁、信号量、读写锁、记录锁、信号量
mmap\munap、msync
mmap共享内存区:使用内存映射文件、使用匿名内存映射、使用/dev/zero匿名内存映射
两种无亲缘关系进程间共享内存区的方法:
内存映射文件、共享内存区对象
9、消息队列和过程调用往往单独使用、它们通常提供了自己的同步机制
共享内存通常需要程序提供同步形式
10、