Loading

进程互斥与同步--锁与信号量

互斥量与二元信号量的异同

实现机制上

  • 互斥量通过软件方式或者硬件中断、原子指令等方法实现;信号量的实现中也需要互斥量保证P、V操作的原子性。
  • 互斥量只能由同一个进程获取和释放; 信号量的获取和释放可以由两个进程完成。

实际应用上

  • 互斥量只能用以保证进程对临界区的独占访问,不能实现两个进程的同步。
  • 二元信号量如果由同一进程获取和释放,实现的就是和互斥量相同的效果;但如果由两个进程分别获取和释放,实现的就是进程的同步。

关于进程同步的思考

假定场景:生产者-消费者问题-缓冲区已满
此场景中需要保证的是生成者等到消费者消耗一个物品后再操纵buffer(临界区)。如果仅使用一个互斥量,那么生产者流程是:

//producer
while True:
  getlock();
  if(buff!=full)
    // produce_one
  releaselock();

这样的效果是,生产者会和消费者一起竞争锁,即使这次发现buff是满的,下次仍然会竞争锁,因为没人通知它buff的实时情况(操作系统是不知道哪个进程该等待的,因为这是业务逻辑上的问题)。

参考

  1. 锁 知乎
  2. mutex v.s. semaphore
  3. 信号量LINUX中实现
  4. 信号量LINUX中实现
  5. 信号量 linux gitbook
posted @ 2021-09-10 10:59  Sherlock-Tang  阅读(160)  评论(0)    收藏  举报