信号量

解决信号量之间的互斥问题

概念

数据不一致问题

首先,对于一个共享资源,如果不加保护,可能会导致数据不一致问题

  • 例如:当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/信号量的互斥/
作者
weihehe
发布于
2024年7月23日
许可协议