简要
阻塞和非阻塞,异步和同步的原理,以及java和linux在这方面的实现原理。
非阻塞和阻塞
java io和nio涉及到阻塞和非阻塞,如select,read,write均存在阻塞和非阻塞的版本。
实现原理上,java依赖于低层linux的实现,所以原理是和linux的socket实现一致的,java只是封装。
在大部分c/c++程序员眼里,他们一定不明白为什么java要分为io和nio这2个包,因为他们熟悉的socket api,从一开始就有阻塞和非阻塞的概念,只是一个Socket选项的true和false的区别而已。
直接看linux源代码,能了解实现阻塞和非阻塞的区别(以下代码截自socket api的accept方法):
SS_NBIO变量是标识插口操作是否阻塞线程,tsleep是使线程睡眠的函数。如果设置了SS_NBIO为true(即值为1),则在得不到数据时返回EWOULDBLOCK,如果设置了SS_NBIO为false(即
值为
0),则在得不到数据时调用tsleep挂起等待。
看吧,阻塞和非阻塞的accept就是这点区别。 如果有兴趣想了解tsleep的具体细节,可以看看
:
refer
(来自《HttpClient分享.ppt》第9页到第16页), 看了之后就回明白"阻塞/唤醒的原理"。
异步和同步
异步和同步的区别是什么?网上有许多
不错的答案 ,本质说的是通知机制的差异:"
同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制. 同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者"
同步
就是自己去等待消息,举例:
(1)通过阻塞自己,等待消息的到来
inputstream.read();
在调用 read时,应用程序会阻塞。当响应返回时(从我们正在从中读取的设备中返回),程序就会解除阻塞(read 调用返回)。
(2)非阻塞,但通过轮询,直到消息的到来
int count = socketChannel.read(byteBuffer);
while(count == 0){
count = socketChannel.read(byteBuffer);
}
程序必须要进行忙碌等待,直到数据可用为止。
异步
就是使用某种触发机制来通知处理消息者
,下面看看java的异步IO和linux的异步IO:
Java的异步IO
"使用某种触发机制来通知消息处理者",如果你做过GUI编程,肯定对观察者模式(Observer)很熟悉,JAVA的使用了Reactor模式,结合多线程,实现了异步通知的机制。个人觉得Reactor模式实际就是观察者模式。例子如下:
网上大部分文章把这种模式归类为异步阻塞IO。不过这种模式里,既使用了阻塞的select方法,也使用了非阻塞的read/writre方法。将其称为
异 步阻塞,可能因为使用了阻塞的select方法的线程属于这个模式里主要的线程,所以称为"阻塞"。不过我们还是得记住,这种模式的特点是
"使用reactor模式和多线程实现异步的通知机制,主线程使用阻塞的select监听IO事件,其他线程使用非阻塞的read/write进行具体的事件处理"
。
Linux的异步IO
抛开Java,我们也想看看linux中的异步IO是怎么实现的?
linux的异步I/0有2种:使用O_ASYNC标志 和 使用aio.h
一 使用O_ASYNC标志
设置了O_ASYNC标志(该标志表示插口应该接收I/O事件的异步通知),当数据就绪时,内核会向"与F_SETOWN绑定的进程"发送SIGIO信号。(个人没研究过这种方法)
二 使用aio.h
库
linux2.5内核一些版本开始出现AIO,linux2.6则把AIO纳入了标准。
aio
的系列方法包括aio_read,aio_write等。这系列方法调用时需要传递一个结构体参数(struct)。当IO事件响应时,就会"产生一个信
号"或"执行一个回调函数" 来完成这次 I/O 处理过程。这里,选择"产生一个信号"或"执行一个回调函数" ,可以在结构体参数里设置。
简单地可以这样解释这系列的aio方法: aio_xx(参数:信号处理函数 或 回调函数)
(1)使用信号进行异步通知
使用信号进行进程间通信(IPC)是 UNIX 中的一种传统机制,AIO 也可以支持这种机制。应用程序需要定义信号处理程序,在产生指定的信号时就会调用这个处理程序。应用程序然后配置一个异步请求将在请求完成时产生一个信号
。
(2)使用回调函数进行异步通知
这种机制不会为通知而产生一个信号,而是会调用用户空间的一个函数来实现通知功能。
看到回调函数,我又联想到"java的reactor或观察者模式"了,个人认为,AIO也可以看成是使用了观察者模式,不过AIO是在linux操作系
统层面实现,而java的异步需要使用reactor实现,比较费劲,这是因为当时还没有得到底层的AIO支持。
目前看来,对于这些操作系统的特点,Java虽然无法超越而且有些落后,但是Java总是在努力:JDK7已经加入了异步I/O操作, 以Proactor模式为原型设计,实现当然依附于上述的linux的AIO原理。
总结
对于阻塞和非阻塞方面,到jdk1.6为止(linux版),java的io,nio包,包含了阻塞和非阻塞的IO,是完全依赖于linux的,原理和
linux一致,linux的io有SS_NBIO选项(即可以选择阻塞或非阻塞),而java则在1.0和1.4这2个版本分别实现阻塞和非阻塞。
对于异步和同步方面,java流行的nio框架(jdk1.6基于linux的epoll)使用reactor模式和多线程实现了异步阻塞io,不过这个实现和linux的异步aio没一点关
系;java7开始,添加了java aio的实现,原理就是基于linux的aio,java
aio的出现,可能让netty等nio框架要么慢慢消失,要么升级为aio框架。
参考:
http://www.ibm.com/developerworks/cn/linux/l-async/
http://dev.firnow.com/course/6_system/linux/Linuxjs/20081012/150267.html
http://www.blogjava.net/killme2008/archive/2009/09/20/295743.html
http://www.iteye.com/articles/2813
- 大小: 35.1 KB
- 大小: 569 Bytes
- 大小: 124 KB
分享到:
相关推荐
在计算机编程和系统设计中,异步、同步、阻塞和非阻塞是四个非常重要的概念,它们关乎程序执行效率和资源管理。以下是对这些概念的详细解释。 **同步与异步** 同步(Synchronous)是指一个进程或线程在等待另一个...
同步异步阻塞非阻塞 IO 模型 在 Linux 环境下的网络 IO 中,有五种基本的 IO 模型:阻塞 IO、非阻塞 IO、IO 多路复用、信号驱动 IO 和异步 IO。其中,信号驱动 IO 不常用,因此主要介绍其余四种 IO 模型。 1. 阻塞...
### 同步、异步、阻塞、非阻塞的区别详解 #### 一、同步与异步 **同步**和**异步**是计算机编程中非常重要的概念,尤其是在多线程编程、网络通信以及操作系统中有着广泛的应用。这两个概念主要涉及的是**消息的...
同步和异步只关注客户端的调用机制,而阻塞和非阻塞则关乎服务端的处理方式。同步与异步的区分并不依赖于阻塞或非阻塞,它们可以结合使用。例如,客户端可以发起异步请求,然后服务端处理请求时可能采用阻塞或非阻塞...
在实际应用中,同步和异步关注的是通知消息的机制,而阻塞与非阻塞关注的是程序等待消息时的状态。同步和异步决定了调用者是等待函数返回结果,还是继续执行其他操作。阻塞与非阻塞则决定了调用者是否在等待过程中...
源码中可能包含非阻塞的发送和接收函数,如`async_send()`和`async_receive()`,以及处理中断的回调函数。 5. **错误处理**:串口通信中可能出现的错误包括数据丢失、超时、校验错误等,源码中的类可能包含错误检查...
tcp socket同步 异步 阻塞 非阻塞 的解释.zip 基本概念:同步、异步、阻塞和非阻塞的区别 同步异步与阻塞非阻塞的区别 C++ 同步异步与阻塞非阻塞的区别
3. **非阻塞通信的完成和同步** 在使用`MPI_Isend`后,发送进程需要确认消息是否已经被接收。这通常通过调用`MPI_Wait`或`MPI_Test`来实现。`MPI_Wait`会阻塞,直到发送操作完成,而`MPI_Test`是非阻塞的,它检查...
Java 同步、异步、阻塞和非阻塞分析 Java 中的同步、异步、阻塞和非阻塞是四个相关但不同的概念,它们都是在多线程编程中解决耗时操作的方法。在这里,我们将详细介绍这些概念之间的区别和联系。 同步...
在计算机科学中,同步、异步、阻塞与非阻塞是四个紧密相关的概念,它们都是关于任务或进程之间的交互和通信方式的描述。下面将对这四个概念进行详细的介绍和比较。 同步(Synchronous) 同步是指任务之间的依赖...
这种编程模型通常与非阻塞I/O配合使用,避免了线程因等待I/O操作而被阻塞的情况。 在实际应用中,异步TCP通信广泛应用于服务器端,如Web服务器、数据库服务器等,它们需要同时处理大量的并发连接。此外,游戏服务器...
本文档,是我本人翻译的一篇介绍linux系统同步异步阻塞非阻塞的知识的,你在网上看到的百分之八十的知识,可能都以讹传讹,让你看的一知半解,因为网上很多该类博客,没有讲解清楚,举得例子:如老王烧水,小王银行...
例如,C++的Boost.Asio库提供了强大的异步Socket接口,Java的NIO(非阻塞I/O)框架以及Python的asyncio模块也支持异步Socket操作。开发者需要理解这些库的工作原理,熟练掌握异步事件循环、回调函数或者协程的概念,...
在计算机编程,特别是网络编程中,同步、异步、阻塞和非阻塞是四个关键的概念,它们描述了程序执行时处理任务的方式。 同步是一种调用模式,它要求调用者在等待结果返回之前不能继续执行其他任务。例如,当你调用`...
用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制
在IT领域,尤其是在多线程和并发编程中,同步、异步、阻塞和非阻塞是四个非常关键的概念。这些概念通常与操作系统、网络I/O、数据库操作以及Java等编程语言中的线程管理紧密相关。现在让我们逐一深入探讨它们的含义...
总结来说,阻塞和非阻塞关注的是I/O调用是否会使进程暂停,而同步和异步关注的是I/O操作的完成与应用程序执行的关系。在实际的网络编程中,选择合适的I/O模型取决于应用的需求,如响应速度、资源利用率和复杂性等...
在这样的背景下,异步读写技术应运而生,它通过非阻塞的方式极大地提升了程序的性能和效率。本文将探讨名为“异步读写文件测试”的程序,它是一个为初学者和开发者量身打造的学习资源,旨在通过测试异步读写速度来...
1. 异步非阻塞串口通讯的优点 异步串口通信的最大优势在于其非阻塞特性。在同步模式下,程序会等待数据接收或发送完成才继续执行,可能导致程序响应变慢。而异步模式允许程序在等待数据传输的同时,执行其他任务,...
在实际项目中,异步非阻塞Winsock API的使用可以提高服务器的并发处理能力,减少对CPU和内存资源的占用,尤其适合处理大量并发连接的场景,例如聊天服务器、游戏服务器等。 这个经典的源代码实例可能是通过以上步骤...