秒懂Linux之消息队列与信号量(了解)
目录
前言
消息队列原理
信号量理论
信号量原理
IPC资源
前言
消息队列与信息量目前已经不常用了,大家也可以参考共享内存去了解基本原理即可。
消息队列原理
- 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
- 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值特性方面
消息队列的创建:
消息队列的删除:
消息队列的发送与接收:
信号量理论
对于信号量我们可以这么理解:
- 我们去电影院买票预定座位这种行为本质上就是信号量对资源的预定机制~
- 这个资源并不是说被我持有才是我的,只要我预定了,在某一个时间点上那他就是我的~
- 有多少票,就卖多少座位(资源),这样就能保证每一份资源都不会被并发访问~
信号量在这当中扮演的就是一个描述资源数量的计算器——int count = xx;
进程要想访问到资源就得进行以下步骤:
- 申请信号量(买票)——预定——信号量申请成功(拿到资源) if(count>0) count-- else wait
- 进行资源的访问
- 释放信号量(看完电影,离开)——该资源可以别人申请——count++
这片区域称为保护临界资源的临界区~
不过需要注意一点:在多线程的场景下int是无法支撑住资源的描述的,就拿父子进程的写时拷贝就可以验证二者并无法看到同一份count,而且count不是原子性的,他会在执行期间被干扰~
所有的进程在访问临界资源时都必须要申请信号量——而前提是信号量能被所有进程看到,这意味着它本身就是共享资源。既然int count无法代表信号量(没有原子性),那么申请信号量(--)与释放信号量(++)这些操作(简称PV操作)又是如何保证原子性的?
下面我们来介绍三个函数
创建信号量:跟前面所学的共享内存一致~ nsems为创建信号量的个数
删除信号量:semnum为信号量的属性~
PV操作:nsops是对应哪一个信号量,sops为具体操作
信号量原理
用以下几点做总结:
- 信号量就是对共享资源进行保护~
- 用于同步(访问资源在不争抢的情况下,具有一定的顺序性。)例如食堂排队打饭~,也用于互斥(访问一部分共享资源时,任何时刻都只有我一个人。)例如直接买下整个电影院~
- 被保护起来的,任何时刻都只允许一个进程访问的公共资源称为临界资源
- 访问临界资源的代码称为临界区,其他的称为非临界区。所谓的保护临界资源,其实就是我们程序员去保护临界区
- 原子性:操作对象的时候只有两种状态,要么还没开始,要么已经结束,绝不存在过程被干扰~
IPC资源
所谓的共享内存,消息队列,信号量本质上都属于IPC资源,而OS必然要对这些IPC资源作管理,如何管理?先描述,再组织~
通过强转为对应的指针就可以访问其结构所在的数据~那我们如何确定位于ipc[ ]中是哪一个IPC资源呢?
利用标记位设置进mode中自动帮我们判断~
但IPC资源后面渐渐退伍的根本原因还是在于它违背了Linux下一切皆文件的核心概念,如果ipc_id下存放的是对应的文件描述符还好,但它偏偏另搞一套体系,也造成了逐渐脱离大势的结果~