`
jaesonchen
  • 浏览: 311422 次
  • 来自: ...
社区版块
存档分类
最新评论

深入理解非阻塞同步IO和非阻塞异步IO

 
阅读更多

这两篇文章分析了Linux下的5种IO模型 

http://blog.csdn.NET/historyasamirror/article/details/5778378

http://blog.csdn.Net/hguisu/article/details/7453390

 

很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO。其实区别很大,编程模型完全不同

 

阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(block,线程进入阻塞状态)。

同步 / 异步描述的是执行IO操作的主体是谁,同步是由用户进程自己去执行最终的IO操作。异步是用户进程自己不关系实际IO操作的过程,只需要由内核在IO完成后通知它既可,由内核进程来执行最终的IO操作。

 

这两组概念交集在一起参生的非阻塞同步IO和非阻塞异步IO的概念就不难理解。

非阻塞同步IO指的是用户调用读写方法是不阻塞的,立刻返回的,而且需要用户线程来检查IO状态。需要注意的是,如果发现有可以操作的IO,那么实际用户进程还是会阻塞等待内核复制数据到用户进程,它与同步阻塞IO的区别是后者全程等待。

 

非阻塞异步IO指的是用户调用读写方法是不阻塞的,立刻返回,而且用户不需要关注读写,只需要提供回调操作,内核线程在完成读写后回调用户提供的callback。

 

这两个概念的不同造成了编程模型的不同

非阻塞同步IO由于读写方法非阻塞,并且需要用户自己来进行读写,所以每次调用读写方法实际读写的字节数是不确定的,所以需要一个Buffer来保存每次读写的字节状态。更重要的是用户不知道什么时候完成了读写,一般需要用while循环判断Buffer的状态来跟踪读写

 

非阻塞异步IO由于是内核线程进行读写,并且在IO完成后会回调用户提供的callback,编程模型就比较简单,用户只需要调用读写,提供回调就可以了,比如 read(filename, callback)

select / poll / epoll 从本质上说都是非阻塞同步IO,select会收到IO就绪的状态,然后通知用户去处理IO,实际的IO操作还需要用户等待内核复制操作。

 

要理解IO就绪和完成的区别。就绪指的是还需要用户自己去处理,完成指的是内核帮助完成了,用户不用关心IO过程,只需要提供回调函数。

 

理解了非阻塞同步IO和非阻塞异步IO的区别之后,就不难理解Java NIO的设计了。NIO是围绕ByteBuffer来进行读写的,ByteBuffer是一个缓冲区,用来记录读写的状态,通过多次检查ByteBuffer的状态来确定IO是否完成

 

Java 1.7的NIO2.0 引入了非阻塞异步IO的概念,编程模型大大简化了。用户只需要关注回调函数即可。

 

分享到:
评论

相关推荐

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    这里我们将深入探讨同步IO、异步IO、阻塞IO和非阻塞IO的概念,理解它们的工作原理以及在实际应用中的差异。 1. 同步IO与异步IO: - **同步IO**:在同步模式下,应用程序执行I/O操作时会等待操作完成。这意味着程序...

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO.pdf

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...

    同步异步阻塞非阻塞

    同步异步阻塞非阻塞 IO 模型 在 Linux 环境下的网络 IO 中,有五种基本的 IO 模型:阻塞 IO、非阻塞 IO、IO 多路复用、信号驱动 IO 和异步 IO。其中,信号驱动 IO 不常用,因此主要介绍其余四种 IO 模型。 1. 阻塞...

    IO中同步、异步与阻塞、非阻塞的区别

    在软件开发领域,尤其是在涉及输入输出(IO)操作时,理解同步与异步、阻塞与非阻塞的概念是非常重要的。这些概念对于设计和实现高效的程序至关重要,尤其是在高并发和分布式系统中。 一、同步与异步 同步和异步是...

    同步与异步--阻塞与非阻塞型IO

    ### 同步与异步——阻塞与非阻塞型IO详解 #### 一、引言 在计算机科学中,I/O(输入/输出)操作是任何程序与外部世界交互的基础。根据I/O操作的不同特性,可以将其分为四大类:同步阻塞IO、同步非阻塞IO、异步阻塞...

    JAVA IO同步,异步

    JAVA IO同步、异步详解 IO 操作是计算机系统中最基本的操作之一,它可以分为同步(Synchronous)和异步(Asynchronous)两种模式。...同时,我们还讨论了四种IO 模型:阻塞IO、非阻塞IO、IO 多路复用和异步IO。

    同步、异步、阻塞、非阻塞的区别

    理解同步/异步与阻塞/非阻塞的区别后,我们可以进一步探讨这两种机制的组合应用。 1. **同步阻塞**:最常见的组合之一,适用于简单且对实时性要求不高的应用场景。例如,使用阻塞式的方法读取文件或数据库查询。 2...

    详解socket阻塞与非阻塞,同步与异步、I/O模型

    同步IO和异步IO的区别在于数据访问时进程是否被阻塞。同步IO在数据读写阶段必须阻塞,等待数据准备就绪;而异步IO在数据就绪之前并不阻塞,而是通过事件通知或回调函数来告知数据已经准备好了。 同步和异步只关注...

    2-Socket阻塞与非阻塞,同步与异步、IO模型-120412发布1

    在IT领域,特别是网络编程中,我们经常遇到“同步”、“异步”、“阻塞”和“非阻塞”这些概念。这些术语是理解和优化应用程序性能的关键,特别是涉及到客户端(C端)与服务器(S端)之间的通信时。 首先,让我们...

    同步、异步IO

    在源码层面,理解同步和异步IO的关键在于了解底层系统调用,如Linux中的read、write、epoll等。在Java中,可以查看NIO相关的类,如java.nio.channels.Selector、java.nio.channels.SocketChannel等,研究它们如何...

    简述JAVA同步、异步、阻塞和非阻塞之间的区别

    在IO操作中,我们可以将同步、异步、阻塞和非阻塞四种模式组合起来,形成四种不同的IO模式:同步阻塞IO、异步阻塞IO、同步非阻塞IO和异步非阻塞IO。同步阻塞IO是指Sender在发送请求后,等待Receiver的响应,直到...

    同步与异步IO、阻塞与非阻塞IO

    同步与异步、阻塞与非阻塞是计算机科学中关于I/O操作的两种关键概念,它们描述的是程序处理输入/输出(IO)时的不同方式。 同步与异步主要涉及的是程序等待IO操作完成的方式。同步IO指的是在发出IO请求后,程序会...

    linux异步IO.pdf

    ### Linux异步IO详解 #### 引言 在Linux环境下,输入/输出(I/O)操作是系统资源管理和数据交互的核心部分。传统上,Linux采用的最常见I/O模型是同步I/O,其中应用程序在发出请求后会阻塞,直至请求完成。然而,...

    IO模型中的阻塞模型和非阻塞模型

    - **非阻塞同步IO**:例如在某些系统中,可以设置套接字为非阻塞模式,此时即便没有数据可用也会立即返回一个特定值(如-1),而不是阻塞当前线程。 - **异步IO**:在异步IO中,进程或线程发起IO操作后可以立即...

    java 中同步、异步、阻塞和非阻塞区别详解

    在Java编程中,同步、异步、阻塞和非阻塞是四个重要的概念,它们涉及到多线程和并发处理,特别是在网络编程中尤为关键。理解这些概念有助于优化程序性能和提高资源利用率。 1. **同步**: 同步是编程中一种控制机制...

    精讲响应式webclient-响应式非阻塞IO与基础用法.docx

    3. **同步、异步和Streaming流式传输**:WebClient不仅支持同步和异步调用,还支持Streaming,允许数据在接收到时就开始处理,而不是等待整个响应接收完毕,这对于处理大数据流或实时数据传输非常有用。 在项目中...

    WinSock 异步IO模型

    与传统的同步IO模型不同,异步IO不会阻塞调用线程,而是通过事件通知或回调函数来指示操作的完成。 异步IO的核心概念包括: 1. **WSAAsyncSelect**:这是WinSock异步IO模型的一种实现方式,它允许应用程序指定一个...

    Icicle具有协同程序非阻塞IO和多线程的异步库

    Icicle是一款专为PHP设计的高级异步库,它引入了协同程序(C coroutines)和非阻塞I/O的概念,以实现高性能、低延迟的并发编程。这个库的独特之处在于它允许开发者使用类似于同步编程的方式编写异步代码,大大降低了...

    异步非阻塞socket聊天室程序

    在IT领域,网络编程是不可或缺的一部分,特别是在开发实时交互系统如聊天室时。"异步非阻塞socket聊天室程序"是一个...理解并掌握异步非阻塞的socket编程对于任何希望从事网络编程的IT专业人员来说都是至关重要的技能。

    同步异步阻塞非阻塞I/O思维导图

    同步异步,阻塞非阻塞,I/O学习总结的思维导图,需要结合Richard Stevens的书来学习

Global site tag (gtag.js) - Google Analytics