Process/Thread Synchronization

进程同步

进程间同步和进程间通信没必要区分过于清楚,一般能通信的机制也能用于同步。
进程间通信(IPC)有以下几种:

  • 信号量(semaphores):低级通信方式,分为整型和记录型;
  • 共享内存(shared memory):高级方式;
  • 消息队列(message passing):高级方式;
  • 管道通信(pipe):高级方式。
  • 套接字(socket):网络上不同进程通信
  • 信号(signal):

进程间同步方式有:

  • 信号量(semaphores):
  • 管程(monitors):

由于进程之间一般是独立的,所以进程同步机制大多不需要锁。

线程同步

线程同步机制有以下几种:

  • 互斥锁(mutex):排他性访问共享数据,用来保护临界区。某个线程加锁后,其它要加锁的线程将被阻塞,申请失败进入休眠,直到锁被释放。
  • 读写锁(ReadWriteLock):用于读者-写者问题,共有三种状态:不加锁、读模式加锁、写模式加锁。每次只有一个线程可以占用写模式的锁,但可以有多个线程占有读模式锁。
  • 自旋锁(spinlock):专为多处理器并发引入,不断循环测试锁的状态,申请线程不会休眠,忙等锁。
  • 条件变量(condition variables)
  • 信号量(semaphores):有更多取值空间,实现更复杂的同步。

信号量和P,V原语的使用可归纳为三种情形:

  1. 把信号量视为加锁标志位,其目的是为了实现对某个唯一的共享数据互斥访问,如各个进程间的某共享变量,数据库中的某个记录。
    共享数据的值与信号量本身的值没有直接关系,信号量的作用仅仅是作为加锁标志位。其特征是信号量初始值为1,然后在一个进程内部对它进行配对的P,V操作。
    这里写图片描述
  2. 把信号量视为某种类型的共享资源的剩余个数,目的是实现对这种类型的共享资源的访问,如各种I/O设备。
    信号量的取值具有实际意义,即为空闲资源的个数。多个进程可以同时使用这种类型的资源,直到所有空闲资源均已用完。
    其特征是信号量的初始值为N(N>=1),然后在一个进程内部对它进行配对的P,V操作
    这里写图片描述
  3. 把信号量作为进程间同步的工具,利用它来设定两个进程在运行时的先后顺序。比如,它可以是某个共享资源的当前个数,但是由一个进程负责生成该资源,而另一个进程负责消费该资源,由此引发了两个进程间的先后顺序。
    其特征是信号量的初始值为N(N>=0),然后在一个进程里对其使用V原语,增加资源个数,而在另一个进程里对其使用P原语,减少资源个数,从而实现两个进程之间的同步关系。
    这里写图片描述
    来源:https://wenku.baidu.com/view/254d1fc6aa00b52acfc7ca81.html
原文地址:https://www.cnblogs.com/EIMadrigal/p/9248211.html