【进程间通信】System V--消息队列和信号量
共同点
发现System V通信的接口很类似,底层也是用key来标识这个资源,用的是几乎同样的结构体来描述资源属性
消息队列的基本原理
了解即可
进程间通信的本质是让不同进程看到同一份资源
消息队列里的队列就是数据结构里的队列,A进程通过数据块的形式发送给B进程,B进程也可以通过数据块的形式发送给A进程,这些数据块就在内存中以队列的形式来组织,A,B进程怎么知道哪个是自己的数据块呢?这些数据块都是有类型的,进程们通过类型来寻找数据块
刚刚看到的消息队列的接口中,就有一个结构体,这个结构体就是数据块的类型和内容
接口不讲怎么使用了,消息队列原理了解即可
IPC在内核中数据结构的设计----shmid的由来
信号量原理
阐述几个知识
1.A,B看到同一份资源,共享资源,如果不加保护,就会导致数据不一致问题
2.任何时候只允许一个执行流访问共享资源,叫互斥
3.共享的,任何时候只允许一个执行流访问的资源,叫临界资源,一般是内存空间
4.100行代码,5--10行是访问临界资源的代码,这几行代码叫做临界区
信号量本质是一把计数器,类似并不是int cnt=n,用来描述临界资源的多少
当一个执行流申请一个共享资源时,这个计数器就减减,当计数器减到0时,执行流就申请失败临界资源了,计数器资源就是计数器里的资源
1.申请到计数器资源,就有了临界资源的访问权限
2.申请到计数器资源,我们当前并没有访问这个临界资源,申请到计数器资源是对这个资源的预定机制
3.计数器可以有效保证进入共享资源的执行流数量
4.当我们想访问共享资源时,我们要先申请计数器资源
这个计数器就好比电影院买票,买了票就是对这个座位资源的预定,我们并没有立即去看,如果没去看这个座位也会空出来,好比执行流没有访问这个资源,其他执行流也不会访问
如果只有一个资源,只能有一个执行流去访问,我们把1,0两态的计数器叫二元信号量,本质是锁(后面的文章在详细讲)
思考:当我们想访问共享资源时,我们要先申请计数器资源,计数器资源不也是共享资源吗?
那就会有以下问题
怎么保证呢?
申请资源,本质是对cnt--,P操作,释放资源,本质是cnt++,V操作,申请和释放的PV操作是原子的,原子意思就是要么不做,做就做完,没有正在做的状态,这样的原子性就不会导致上面的问题
信号量为啥是进程间通信的一种?
1.通信不仅是通信数据,互相协同也是
2.要协同,本质也是通信,信号量首先要被所有通信进程看到
总结
1.执行流申请资源,必须先申请信号量资源,得到信号量之后,才能访问临界资源
2.申请信号量本质是对临界资源的预定机制
3.信号量的1,0两态,二元信号量,就是互斥功能
4.信号量本质是计数器,PV操作,原子的
信号量的接口太难了,详细请看线程的文章