同步,异步,阻塞,非阻塞是什么意思?
首先,这四个词是对于当前进程而言的,脱离了这个大前提,描述也不再有意义。
同步和异步
同步是说当前代码不执行完,后面的代码,或者严谨点说,后面的指令将不执行。
例如[1],下列,select 函数不返回,下面的代码将不会执行。
异步,只是简单地向操作系统注册完一个函数,操作系统在IO操作完成后,用信号通知该进程。例如[2],
第一行,signal不必等到 on_input 函数执行完才执行后面的指令,而是立即返回。那 on_input 什么时候执行呢,进程通过什么方式知道该执行了呢?信号,当内核发送一个特有的信号,这里是SIGIO,进程将执行 on_input 函数,执行完再回到原来的地方。
阻塞和非阻塞
阻塞和非阻塞是说,进程是否由运行态变成阻塞态,这时,操作系统将会将该进程挂在阻塞队列上,并选择其他就绪进程上CPU,所以,阻塞对当前进程是种时间和效率上的浪费。阻塞是说,当前操作会引起进程进入阻塞态,例如普通的打开文件操作,就会阻塞自己,直到内核返回。而非阻塞是否,当前操作不会引起进入阻塞态。
那么同步阻塞,同步非阻塞,异步非阻塞是说什么呢?
其实,最后一个名词是个伪命题,异步不会引起进程进入阻塞态,例如上面的注册回调函数的操作。
同步阻塞就是我们普通的打开文件操作,同步非阻塞,是指,进程调用select等系统调用[3],而且把该系统调用的超时时间设置为0时,select函数会立即返回,不会阻塞当前进程,引起进程进入阻塞态。而且,后面的指令也必须在select等执行完之后再执行,这二者一组合,就变成了同步非阻塞。
参考资料:
1. ostep第33章 ostep
2. 《Unix/Linux编程实践教程》 第7章12节,第15章第2节