一、并发,同步,异步,互斥,阻塞,非阻塞的概念
并发:在操作系统中,同个处理机上有多个程序同时运行即并发。并发可分为同步和互斥。
1. 同步、互斥、异步:
-
互斥:分布在不同进程之间的若干程序片断,规定当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如有同一个资源同一时间只有一个访问者可以进行访问,其他访问者需要等前一个访问者访问结束才可以开始访问该资源,但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
-
同步:分布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。所以同步就是在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
-
异步:异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
总结:
1)同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
2)线程是实现异步的一个方式。可以在主线程创建一个新线程来做某件事,此时主线程不需等待子线程做完而是可以做其他事情。
3)异步和多线程并不是一个同等关系。异步是最终目的,多线程只是我们实现异步的一种手段。
2. 阻塞,非阻塞:
- 阻塞和非阻塞是当进程在访问数据时,根据IO操作的就绪状态不同而采取的不同处理方式,比如主程序调用一个函数要读取一个文件的内容,阻塞方式下主程序会等到函数读取完再继续往下执行,非阻塞方式下,读取函数会立刻返回一个状态值给主程序,主程序不等待文件读取完就继续往下执行。 一般来说可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
同步阻塞,同步非阻塞,异步阻塞,异步非阻塞:
以发送方发出请求要接收方读取某文件内容为例。
-
同步阻塞:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上得到读取结果就一直等,直到获取读取结果再响应发送发,等待期间不可做其他操作(阻塞)。
-
同步非阻塞:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上的得到读取结果,就立即返回,接收方继续去做其他事情。此时并未响应发送发,发送方一直在等待。直到IO操作(这里是读取文件)完成后,接收方获得读取结果响应发送方,接收方才可以进入下一次请求过程。(实际不应用)
-
异步阻塞:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作(阻塞)。(实际不应用)
-
异步非阻塞:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,也不等待,而是马上返回取做其他事情。当IO操作(读取文件)完成以后,将完成状态和结果通知接收方,接收方在响应发送方。(效率最高)
总结:
1)同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
2)阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
3)阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。
二、线程同步和互斥
-
线程同步:每个线程之间按预定的先后次序进行运行,协同、协助、互相配合。有了线程同步,每个线程才不是自己做自己的事情,而是协同完成某件大事。
-
线程互斥:当有若干个线程访问同一块资源时,规定同一时间只有一个线程可以得到访问权,其它线程需要等占用资源者释放该资源才可以申请访问。线程互斥可以看成是一种特殊的线程同步。
三、线程同步与阻塞的关系
- 同步是个过程,阻塞是线程的一种状态:当多个线程访问同一资源时,规定同一时间只有一个线程可以进行访问,所以后访问的线程将阻塞,等待前访问的线程访问完。
注意:线程同步不一定发生阻塞!线程同步的时候,需要协调推进速度,只有当访问同一资源出现互相等待和互相唤醒会发生阻塞。