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

新手上路,请多包涵

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

阅读 7.4k
1 个回答
那操作系统是怎么实现计数器加减和阻塞一起的原子性的呢?

阻塞操作为什么需要原子性?! 你上面也说了重点在于计数器的原子加减。计数器是什么?就是一段内存啊,原子加减意思是修改这段内存的值的操作是一个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);
}

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题