信号量的pv操作是怎么保证原子性的?

发布于 2022-09-12 00:10:25 字数 159 浏览 43 评论 0

信号量中有pv两种操作,都需要保证原子性,以p操作为例,包含计数器减一和阻塞进程两个动作,之前看网友说难点主要在怎么保证计数器加减的原子性上,这个可以通过lock引脚控制来实现。那么我想问,阻塞动作不是比计数器加减更复杂么,而且要操作的数据也多的多,那操作系统是怎么实现计数器加减和阻塞一起的原子性的呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生活了然无味 2022-09-19 00:10:25

那操作系统是怎么实现计数器加减和阻塞一起的原子性的呢?

阻塞操作为什么需要原子性?! 你上面也说了重点在于计数器的原子加减。计数器是什么?就是一段内存啊,原子加减意思是修改这段内存的值的操作是一个cpu上的线程独占的。如何保证?Lock住总线呗,操作系统一般不会去管如何Lock总线,它只要这个cpu能提供这样的机制就ok了。比如x86,就是LOCK前缀的指令


补充:
直接看linux是怎么做的好了

void down(struct semaphore *sem)
{
        unsigned long flags;

        raw_spin_lock_irqsave(&sem->lock, flags); // 这里面禁止了抢占
        if (likely(sem->count > 0))
                sem->count--;
        else
                __down(sem);   // 这里睡眠,重新调度
        raw_spin_unlock_irqrestore(&sem->lock, flags);
}

所以不会存在你说的 计数器操作后又被抢占

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文