Linux:System V - 信号量
1.信号量是什么?
本质上是一个计数器,通常用来表示公共资源中,资源数量使用情况;
公共资源:被多个进程同时可以访问的资源(管道、消息队列、共享内存、信号量)
访问没有保护的公共资源:数据不一致问题(数据在没被完全写入时就被读取)
2.暂停:为什么要让不同的进程看到同一份资源呢?—因为需要通信,想让进程间实现协同,又因为进程具有独立性,所以得让它们看见同一份资源,这样又会有数据不一致的问题。
3.我们未来将被保护起来的资源叫做临界资源。但是 有大部分资源都是独立的。
资源(内存、文件、网络等)是要被使用的,如何被进程使用呢?一定是该进程有对应的代码来访问资源的,而访问临界资源的代码称为临界区,不访问的代码称为非临界区。
4.如何对资源进行保护:同步和互斥(当有两个进程访问同一个公共资源时只能其中一个去访问)。
原子性:只有两态,要做就做完、要么不做,数据完整才有意义。
信号量就是为了解决让多进程/多线程之间进行协同,原子性的互斥和同步;信号量是其中一种方案。5.为什么要有信号量?
公共资源有两种使用方式:1.整体使用 ; 2.拆开去使用
公共资源被分为很多部分,定义信号量,当进程访问前先预订资源sem--,之后可以访问这部分公共资源;当使用完毕sem++。所有进程要访问公共资源之前,要先申请信号量,先申请信号量必须让这些进程要先看到信号量(信号量本身也是公共资源),信号量怎么保护自己的安全?—信号量的++(v操作)和--(p操作)操作是原子的。只有两种状态的信号量称为二元信号量—提供互斥功能(共享资源只有一份)。
同时对多个信号量进行PV操作;操作几个信号量就定义多少个struct sembuf并在结构体中定义操作方式。
进程间通信