【IO】同步、异步、阻塞、非阻塞的理解

最近一直在看跟IO模型有关的内容,感觉差不多理解了,于是开始写这一篇总结博客。针对的操作系统为UNIX/LINUX,大致的体系结构如上图。

操作系统中的客体主要包括了:文件,Socket和进程,本文主要讨论与IO相关的文件和Socket。

IO主要分为文件IO网络IO,文件IO也就是对文件的读写,网络IO是利用socket进行数据传输,socket是对TCP/IP协议的封装而提供的编程接口。

首先区分一下同步、异步、阻塞式、非阻塞式这些概念,参考知乎上解答

1、同步、异步是针对消息通信机制而言的。

同步指的是当发出一个调用时,如果结果没有计算好,就不会有返回值,而当结果计算完之后,就会返回。

异步指的是发出调用后立刻返回,而结果在后台慢慢计算,当计算完成之后,通过回调函数告知调用者。常见的异步调用就是ajax和nodejs。

2、阻塞式和非阻塞式是对于线程在等待结果时的状态。

阻塞指的是线程在等待结果时会被“挂起”,也就是交出CPU资源让其他线程运行,不能做其他事。

非阻塞就是在等待结果时依然拥有CPU资源,可以做其他的事。

从这两个角度来看,同步异步与阻塞非阻塞其实没有什么关系,因为是针对于不同的方面来谈的。

所以对于IO模型可以分为下面这几种类型:

同步 阻塞式IO 非阻塞式IO IO多路复用
异步 异步IO    

多线程编程与异步编程的比较:

多线程的优缺点:

优点:顺序执行,思路简单

缺点:上下文切换占用CPU资源;线程间共享变量已造成死锁;容易编写非线程安全的代码。

异步调用的优缺点:

优点:不会给CPU造成额外负担

缺点:非顺序执行,不易理解,难以调试。

适用场景:

对于IO操作,异步调用比多线程+同步更适合,而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往 往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处 理大量的并发操作时就不合适了。

参考:http://kb.cnblogs.com/page/85931/

原文地址:https://www.cnblogs.com/puyangsky/p/5699208.html