[操作系统]进程通信方式:信号量(互斥量、事件对象)、管道、消息队列
1.信号量
信号量(singal)、互斥量(mutex)、事件对象(event)是由操作系统内部维护的一组数据。
它们由系统内核维护,对所有进程(线程)都是可见的,因此可以被用于信息传递。例如实现资源锁和进行线程唤醒通知等。
信号量:本质是一个技术器,只能进行P和V操作。
P操作:若信号量大于0,则减1。否则挂起执行的线程。
V操作:若有操作信号量的进程因等待被挂起,则将其恢复运行。否则将信号量加1。
以上操作均是系统调用,因此具有原子性。
2.管道
管道由操作系统维护,有两个文件描述符,管道由环形队列实现,数据从写入端流入并从读取端流出。
管道只允许在具有亲属关系的进程间使用。即在属于同一个父进程的子进程间使用,或在父子进程间使用。
管道只能单向通信,内部保证数据同步(一致性),但是流管道可以双向传输。
管道有容量上限。linux系统中一般为64KB。
父进程创建管道,fork得到子进程后,父进程和子进程分别关闭管道的不同文件描述符,使用另外一个文件描述符进行读写操作。当进程销毁时管道也会被销毁。
3.消息队列
由操作系统维护,是存放消息的链表、存放在内核中的消息队列标识符组成。
相比管道,起有点在于可以承载有格式的字节流以及可以避免缓冲区大小受限。