io-同步 异步 阻塞 非阻塞
异步io是kernel帮你的线程盯着该线程所要的数据是否可用,而线程可以去做别的事情。当数据可用时kernel通知你的线程。需要利用事件等机制来完成。
同步io是你的线程自己去向内核查询所要的数据是否可用。在查询的时候,数据不可用的话:
如果内核将这个线程塞进等待队列,直到数据可用时,内核将线程加进可运行队列,并将可用数据给它,则是阻塞型io;
如果内核不将其塞进等待队列,而是直接给他一个error代码表示数据不可用,则是非阻塞io。执行非阻塞型io的线程需要一遍一遍的去询问内核数据是否可用,否则它可能读不到可用的数据。
可见-同步 异步 阻塞 非阻塞的关系。
①异步同步是指线程对数据获取的方式而言的,
异步:内核主动通知线程,
同步:线程主动询问内核。
②而阻塞非阻塞是在线程主动询问内核时,内核对线程的不同处理方式。所以阻塞非阻塞都是在同步的情况下发生的。
即
|----异步
|----同步|-----阻塞
|-----非阻塞
执行同步io时,就是直接向内核索取数据,非阻塞io(r如read函数)会立即返回,阻塞io(如read函数)则在数据可用时返回。线程中需要对返回值检查,返回值一般是数据不可用时的错误代码或可用数据。
执行异步io时,就像向内核提交一个"申请当数据可用时的事件通知"的服务(所以可以立即返回),所以需要向内核提交一个事件参数,当数据可用时,内核自动触发该事件。
当然执行异步io的谈不上阻塞非阻塞,因为他在执行异步io(比如read)时内核没机会没理由将它阻塞。