信号量
解决信号量之间的互斥问题
概念
数据不一致问题
首先,对于一个共享资源,如果不加保护,可能会导致数据不一致问题。
- 例如:当
A
正在写入,但是写到一半就被B
拿走了,导致双方发和收的数据不完整 —— 数据不一致问题。
为了解决上面的问题,我们引入了临界资源
的概念。
临界资源和临界区
任何时刻 只允许一个执行流访问的共享资源——临界资源
。
在一份代码中,访问临界资源的
的那一部分代码我们叫做临界区。
信号量
- 信号量(灯)的本质是一个计数器,用来描述
临界资源
数量的多少。其最重要的意义是:将临界资源
的统计工作放了共享区
之外。
例如:我们将共享内存拆分为N
个块,每一个块代表一个临界资源,每个进程给予他们不同的临界资源,因此可以处理N
个执行流。因此也就达到了并发。
为了方便管理,我们引入了一个计数器,来记录剩余临界资源的数量
。对该计数器的加减被称为P-V
操作。
*信号量的自增自减本身其实并不安全,因为进程的运行的时候,也有可能被切换。因此我们的对信号量的增减进行了封装,使其变为了P-V
操作,它们具有**原子性——即两态的,没有正在做
这样的概念,只有没做
和做完
***。
P
操作:将信号量值减 1,表示申请占用一个资源。如果结果小于 0,表示已经没有可用资源,则执行P
操作的进程被阻塞。如果结果大于等于 0,表示现有的资源足够你使用,则执行P
操作的进程继续执行。V
操作:将信号量值加 1,表示释放一个资源,即使用完资源后归还资源。若加完后信号量的值小于等于 0,表示有某些进程正在等待该资源,由于我们已经释放出一个资源了,因此需要唤醒一个等待使用该资源(就绪态)的进程,使之运行下去。
例如:当信号量
的值为 2 的时候,表示有 2 个资源可以使用,当信号量
的值为 -2 的时候,表示有两个进程正在等待使用这个资源。
二元信号量
值为1
,0
两态的计数器叫做二元信号量
,本质上是一个锁。
总结
一个执行流想要申请临界资源,都需要先申请信号量计数资源。
信号量
https://weihehe.top/2024/07/23/信号量的互斥/