转载自 http://blog.youkuaiyun.com/it_lover_/article/details/52154591
并发(concurrency)
并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。
- 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
- 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
同步与异步
同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
阻塞,非阻塞
阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式。
阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
一般来说IO模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
同步阻塞IO
用户进程在发起一个IO操作以后,阻塞直到系统调用完成为止,用户进程才能运行。
同步非阻塞IO
用户进程发起一个IO操作以后,需要时不时的询问IO操作是否就绪,引入了不必要的CPU资源浪费。
异步阻塞IO
应用发起一个IO操作以后,使用阻塞 select 系统调用来等待 I/O可用的通知。 select 调用非常有趣的是它可以用来为多个IO描述符提供通知,而不仅仅为一个描述符提供通知。
如图,其与同步阻塞的区别在于同步阻塞中系统调用read()在IO完成后才返回结果,而异步阻塞中read()会先返回一个错误代码,之后在select()中等待IO可用通知时阻塞,接到通知再执行系统调用read()完成IO操作。
异步非阻塞IO
用户进程只需要发起一个IO操作然后立即返回,
等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,
此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作因为真正的IO读取或者写入操作已经由内核完成了。

总结
同步是走得快的A耐住性子等待B,异步是A让B完成后通知A。
阻塞与非阻塞是线程的状态,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
阻塞是当事件没完成就等待a的完成,非阻塞就是直接说当前做完了没,做完就发结果,没做完就说没做完,不会去等待。