目录
1 概述
在计算机领域经常会听到同步和异步的概念,首先我们先看下什么是同步和异步。
同步:是指一个进程在执行某个请求的时候,若这个请求没有执行完成, 那么这个进程将会一直等待下去,直到这个请求执行完毕,返回数据(比如1+1=2),才会继续执行下面的请求。
异步:是指一个进程在执行某个请求的时候,如果这个请求没有执行完毕,进程不会等待(但是会返回结果,如果1+1=2,或者是正在计算中),而是继续执行下面的请求。
阻塞:不立即返回结果,期间线程挂起(执行者等待)
非阻塞::立即返回结果(执行者不等待)
总结下,同步异步讲的是调用接口数据返回的方式,同步是调用者主动查询,而异步是指被调用者通知调用者数据。阻塞非阻塞讲的是调用者调用接口后是否可以执行其他的任务,阻塞是指调用者调用接口后不可以继续执行其他的任务,非阻塞是指调用接口后可以继续执行其他的任务。
2 进程同步
并发进程之间分为独立关系和交互关系,独立关系的进程分别在自己的变量集合上运行,互不影响;但交互关系的并发进程在执行过程中需要共享或交换数据,因此交互的并发进程之间存在着竞争和协作关系。
Process Synchronization means a mechanism to the consistency of data shared in cooperative process
进程同步是一种维持交互进程之间共享数据一致性的机制。同步的工具:Mutex Lock(互斥锁)和Semaphore(信号量)。
进程本身是相互独立运行的,也就是说是异步的,但是由于进程间的交互,使得进程间一定要保证某种时序关系,因此需要做进程间的同步。
2.1 临界区
进程同步中,当两个进程同时操作共享数据时,如果不加以干涉就会出问题,换言之,我们需要共享数据的进程之间互斥,即以一种手段确保当一个进程在使用共享数据时,其他进程不能做同样的操作。
每个进程中,对共享数据进行访问的程序片段被称为“临界区”。
2.2 互斥锁
操作系统设计人员建立软件工具来解决临界区问题,最简单的工具就是互斥锁
A procss must acquire the lock before entering a critical section
一个进程进入临界区之前必须获取锁
It must release the lock when it exits the critical section
进程在退出临界区时必须释放锁
为什么说互斥锁是硬件的实现方案呢,因为互斥锁需要通过执行TSL指令来获取锁,而TSL指令称为测试并加锁(test and set lock),但它是一个原子操作,由硬件保证原子性,执行TSL指令时,执行该指令的CPU通过硬件锁住内存总线,其他CPU将无法访问内存,直到TSL指令执行完测试并加锁。
2.3 信号量
信号量(Semaphore)是一种比互斥锁更强大的同步工具,它可以提供更高级的方法来同步并发进程。
信号量是由荷兰学者Dijkstra1965年提出的,网络中的链路状态算法也是他提出的。
A semaphore S is an integer variable that,apart from initialization,is accessed only through two standard atomic operations: P(proberen in dutch 测试) and V(verhogen in dutch 增加)
信号量S是一个整数,除了初始化之外,只能通过两个标准的原子操作P和V访问
P:wait() operation 等待操作
V:signal() operation 信号操作
第一种,二值信号量的值只能是0或1,通常将其初始化为1(S=1),用于实现互斥锁的功能。
第二种, 一般信号量的取值可以是任意数值(S > 1),用于控制并发进程对共享资源的访问
例子:有个Y字型的交通路口,其中主干道的车要进入两个小路,而每条小路上最多只能有一辆车行驶。
假设现在有三辆车Car1、Car2、Car3都到达了Y字型路口,信号量road表示小路的数量,首先Car1通过P操作,将road减一,并进入了小路,此时road=1,还有一条小路可以用;
Car2也通过P操作,再将road减一,并进入小路,此时road=0,没有小路可用了;
当轮到Car3的时候,由于此时road=0,执行P操作的时候,进入到了空循环进行忙式等待(自旋);
过了一段时间,Car1驶出了其中一条小路,并对信号量进行V操作,通过Car1的V操作,此时road=1,Car3在P操作中再次循环的时候就退出循环,将road减一,然后进入到小路。