在网络编程中,阻塞、非阻塞、同步、异步经常被提到。网上这篇博客有详细的分析:
http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和自己的理解总结一下,加以区别,加深理解。
1.Stevens在文章中一共比较了五种IO Model:
blocking IO :阻塞IO
nonblocking IO :非阻塞IO
IO multiplexing :多路复用技术IO
signal driven IO
asynchronous IO :异步IO
由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。
2.再说一下IO发生时的步骤。
对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:
(1) 等待数据准备 (Waiting for the data to be ready)
(2) 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
3同步、异步:同步和异步过程针对的是IO的第二个阶段,就是谁将对象从内核拷贝到进程中,同步代表着应用程序参与IO过程,是应用程序负责从内核拷贝数据到进程;而异步代表着应用程序把IO操作全部托管给了系统内核kernel,数据准备好了只需要给应用程序一个通知就行,由系统内核进行从内核到进程之间数据的复制,意思是异步情况下应用程序对于IO操作撒手不管了,交给了系统内核来做。
阻塞、非阻塞:阻塞、非阻塞针对的是IO的第一个阶段,就是在数据准备时,应用程序怎么做;阻塞是应用程序就等在这,什么都不去做,数据准备好了才去做别的事;而非阻塞是我不在这干等,先去做别的事,时不时的来看下准备好了没有;(结合上面说的,如果同步则应用程序需要等待准备好了,来进行拷贝操作,所以同步可以是阻塞的,也可以是非阻塞的,取决于数据准备时,应用程序做不做其他事;而异步则不管,直接去执行下面的代码,不管也代表着应用程序去做其他事,所以异步肯定是非阻塞的)。
4.下面来说说java中 Bio、Nio,Aio
Bio:jdk1.4以前使用的io技术,阻塞io,也就是使用的blocking IO,可以阻塞到读写方法,阻塞到线程,性能不高。
Nio:利用了多路复用技术,也就是 IO multiplexing,它是同步非阻塞的模式;利用select,单个线程就可以同时处理多个网络连接的IO,实现IO事件的轮询,应用程序调用了select,那么会停在这等待把数据从内核拷贝到用户进程,所以它是同步的,但在数据准备阶段,select线程并没有干等一个IO的准备数据,而是在轮询其他注册的IO,当一个IO的数据准备好了,select就会返回,进行拷贝操作;所以,如果处理的连接数不是很高的话,使用Nio不一定比Bio的性能更好,可能延迟还更大,因为Nio需要使用两个system call,一个是调用select,一个是进行拷贝数据,而Bio只需要拷贝数据。Nio优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
简要说Nio就是:select+非阻塞,Nio是目前主流的网络通信模式,有Mima、netty等网络通信框架,比直接写Nio要容易些,并且代码可读性要好。
Aio:jdk1.7也叫Nio2,真正实现了异步io,也就是asynchronous IO,但还没有真正的流行起来,使用比较少。可以学习它的一些思想。
分享到:
相关推荐
异步调用则提供了一种非阻塞的方式,让主线程可以在等待某任务完成的同时处理其他事务。在C#中,可以使用委托的`BeginInvoke`和`EndInvoke`方法实现异步调用。如`DemoEndInvoke`方法所示: ```csharp // 启动异步...
16.8 非阻塞和异步I/O 16.9 小结 习题 第17章 高级进程间通信 17.1 引言 17.2 基于STREAMS的管道 17.2.1 命名的STREAMS管道 17.2.2 唯一连接 17.3 UNIX域套接字 17.3.1 命名UNIX域套接...
16.8 非阻塞和异步I/O 467 16.9 小结 468 习题 468 第17章 高级进程间通信 469 17.1 引言 469 17.2 基于STREAMS的管道 469 17.2.1 命名的STREAMS管道 472 17.2.2 唯一连接 473 17.3 UNIX域套接字 ...
452 16.6 套接字选项 464 16.7 带外数据 466 16.8 非阻塞和异步I/O 467 16.9 小结 468 习题 468 第17章 高级进程间通信 469 17.1 引言 469 17.2 基于STREAMS的管道 469 17.2.1 命名的STREAMS管道 ...
#### 五、小结 Mojo语法作为一种简单、强大且可扩展的Perl语言领域特定语言,凭借其模块化、异步编程、灵活的路由机制以及强大的模板引擎等特点,成为了网络开发领域中不可或缺的工具之一。无论是构建Web应用程序、...
此外,I/O操作部分探讨了同步与异步、阻塞与非阻塞I/O模型,以及AIO(异步I/O)和epoll等高级I/O接口。 《Linux文件系统详解》则专注于Linux的文件系统结构和操作。首先,书中会介绍文件系统的基本概念,如EXT2、...
16.8 非阻塞和异步i/o 467 16.9 小结468 习题468 第17章高级进程间通信469 17.1 引言469 17.2 基于streams的管道469 17.2.1 命名的streams管道472 17.2.2 唯一连接473 17.3 unix域套接字476 17.3.1 命名...
16.8 非阻塞和异步i/o 467 16.9 小结468 习题468 第17章高级进程间通信469 17.1 引言469 17.2 基于streams的管道469 17.2.1 命名的streams管道472 17.2.2 唯一连接473 17.3 unix域套接字476 17.3.1 命名...
目 录 第1篇 Linux网络开发基础 ...9.6.1 非阻塞方式程序设计介绍 264 9.6.2 非阻塞程序设计的例子 264 9.7 小结 266 第10章 基于UDP协议的接收和发送 267 10.1 UDP编程框架 267 10.1.1 UDP编程框图 267
### 5种服务器网络编程模型详解 在网络编程领域,服务器如何高效、稳定地处理客户端请求是至关重要的。...后续文章还将介绍基于事件驱动的异步非阻塞模型和混合模型,这些模型将进一步提高服务器的并发能力和效率。
02 并发并行与同步异步的概念 03 GIL的概念 04 同步锁 05 递归锁 06 同步对象event 07 信号量 08 线程队列 09 生产者消费者模型 10 多进程的调用 第35章 01 进程通信 02 进程池 03 协程 04 事件驱动模型 05 IO模型...
##### 1.4 小结 通过本节的学习,我们了解到Microsoft .NET是一项旨在推动软件行业向前发展的重大计划,而C#则是为了适应这一计划而特别设计的语言。C#不仅具备强大的功能,还拥有简洁易懂的语法和丰富的库支持,是...
阻塞状态的线程不会占用CPU资源,因此多线程环境下的非阻塞线程可以更好地利用CPU。线程的调度由Java的线程调度器(Thread Scheduler)负责,它根据线程优先级和系统策略分配CPU时间片。 多线程的主要用途包括: 1...
### 小结 并发编程是现代软件开发中不可或缺的一部分,它不仅能够显著提升程序的性能,还能改善用户体验,增加系统的吞吐量。通过对不同并发编程模型的理解和应用,可以更好地满足软件开发的需求,应对日益增长的...
JavaScript是一种非阻塞的、单线程的编程语言,它使用异步编程模型来处理耗时的网络请求或长时间运行的任务,保证用户界面不会因此冻结。异步编程常用技术有回调函数、Promise、async/await。 6. 模块化 模块化是将...
在 Twisted 中,这种能力是通过非阻塞 I/O 和回调机制实现的。 ##### 1.3.2 Deferreds Deferreds 是 Twisted 中的核心概念之一,用于管理异步操作的结果。它们提供了一种简单的方法来处理回调和错误,从而简化了...
- **1.4 小结** - 本章概述了.NET平台的概念及其与C#语言的关系,强调了C#作为一种现代化的编程语言在.NET框架中的核心地位。 ##### 第二章 运行环境 全面了解.NET - **2.1 .NET 结构** - .NET Framework 包括...