消息队列
- 基本概念:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。消息队列是双向通信,传输的是有类型的数据块,它的本质是内核中的优先级队列。
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操作
- 创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制
- 添加消息使用的函数是msgsnd函数,它把消息添加到已打开的消息队列末尾
- 读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息
- 控制消息队列使用的函数是msgctl,它可以完成多项功能。
msgget
msgsnd
msgrcv
msgctl
信号量
基本概念:信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。它的本质是内核中的一个计数器,带有一个PCB等待队列。
- PV操作
P操作:如果有可用的资源(信号量值>0),则占用一个资源(给信号量值减去一,进入临界区代码);如果没有可用的资源 (信号量值等于0),则被阻塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源(给信号量值加一)。
功能:
- 实现进程/线程间的同步与互斥
- 1、信号量实现同步:计数器+等待+唤醒
- 2、信号量实现互斥:计数器只有0、1 +等待+唤醒
信号量编程
- 第一步:创建信号量或获得在系统已存在的信号量,调用semget()函数。
- 第二步:初始化信号量,此时使用semctl()函数的SETVAL操作。。
- 第三步:进行信号量的PV操作,调用semop()函数。这一步是实现进程之间的同步和互斥的核心工作部分。
- 第四步:删除信号量,此时使用semclt()函数的IPC_RMID操作。
对于以上的信号量的相关函数,我用的比较少,也就不做过多介绍,如果大家想了解的话,可以man page 查看。