进程互斥与同步--锁与信号量
互斥量与二元信号量的异同
实现机制上
- 互斥量通过软件方式或者硬件中断、原子指令等方法实现;信号量的实现中也需要互斥量保证P、V操作的原子性。
- 互斥量只能由同一个进程获取和释放; 信号量的获取和释放可以由两个进程完成。
实际应用上
- 互斥量只能用以保证进程对临界区的独占访问,不能实现两个进程的同步。
- 二元信号量如果由同一进程获取和释放,实现的就是和互斥量相同的效果;但如果由两个进程分别获取和释放,实现的就是进程的同步。
关于进程同步的思考
假定场景:生产者-消费者问题-缓冲区已满
此场景中需要保证的是生成者等到消费者消耗一个物品后再操纵buffer(临界区)。如果仅使用一个互斥量,那么生产者流程是:
//producer
while True:
getlock();
if(buff!=full)
// produce_one
releaselock();
这样的效果是,生产者会和消费者一起竞争锁,即使这次发现buff是满的,下次仍然会竞争锁,因为没人通知它buff的实时情况(操作系统是不知道哪个进程该等待的,因为这是业务逻辑上的问题)。

浙公网安备 33010602011771号