1、为什么需要进程间同步

1.1、生产者-消费者问题

有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者进程可以并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程需要将所生产的产品放到一个缓冲区中,消费者进程可以从缓冲区取走产品消费。

20211226125157.png

  • 生产者往缓冲区 +1
  • 消费者往缓冲区 -1
  • 在生活中这种模型没有问题
  • 缓冲是在Cache上
  • 操作缓冲需要三个步骤
    • register = count
    • register = register+1
    • count = register
    • count是缓冲区的值
  • 但从生产者程序或者消费者程序去看是没问题的
  • 但两者并发执行时就可能出差错

20211226125206.png

1.2、哲学家问题

有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共同使用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子。平时哲学家们只进行思考,饥饿时则试图取靠近他们的左、右两支筷子,只有两支筷子都被他拿到的时候才能进餐,进餐完毕后,放下左右筷子继续思考。

20211226125227.png

20211226125236.png

  • 筷子就是==临界资源==

1.3、总结

  • 根源问题是:彼此相互之间没有通信
  • “如果生产者通知消费者我已经完成一件生产”
  • “哲学家向旁边的哲学家说我要进餐了”

==需要进程间的同步==

2、进程间同步的原则

  • ==对竞争资源在多进程间进行使用次序的协调==
  • ==使得并发程序的多个进程之间可以有效的使用资源和相互合作==

临界资源指的是一些碎作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可重新竞争使用资源。

进程间同步的四个原则

  • 空闲让进:资源无占用,允许使用
  • 忙则等待:资源有占用,请求进程等待
  • 优先等待:保证有限等待时间能够使用资源
  • 让权等待:等待时,进程需要让出CPU

进程同步的方法

  • 消息队列
  • 共享存储
  • 信号量

3、线程同步

当多个线程并发使用进程资源时,会发生什么?==> 进程内多线程也需要同步

  • 互斥量
  • 读写锁:读多写少或者写多读少
  • 自旋锁
  • 条件变量