`
xly_971223
  • 浏览: 1273838 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

同步IO与异步IO的区别

阅读更多
同步IO与异步IO的区别

首先要明确一点:不同IO模型之间的差别本质上是CPU的参与方式

这里重点说一下各自的应用场景

如何选择同步还是异步呢?
主要有这么几个指标供参考
1. 并发数量
2. 接收字节数
3. 处理请求所需CPU时间
我们一个一个来考察

并发数
并发低的时候同步IO与异步IO差别不大
并发高时差别会比较明显,这要表现在
1. 开启线程数:如并发1000时,同步IO要开启1000个线程,1000个线程要占用很多内存,这是其一,其二1000个线程间切换的时间也是很可观的;异步IO则可避免这个问题


接收字节数
接收字节越少被阻塞的概率越低,同步IO与异步IO的差别就越小
接收字节越多被阻塞的概率就越大,异步IO的优势越明显,能够同时服务更多的客户端请求

处理请求所需CPU时间
与同步异步没什么关系


同步阻塞IO
服务端在调用read()时,如果网卡缓冲区中没有数据则程序停止向下执行,直到网卡缓冲区中有数据。伪代码如下
Before Blocking
Read(buffer);//读不到数据则一直等待
After blocking


同步的非阻塞IO是这样的
服务端调用read()后,网卡缓冲区中如果没有数据可读就返回
服务器采用循环的方式再去读取 伪代码如下
Byte[] buffer = new Byte[1024];
While(read(buffer)==0){ //read()返回读到的字节数
	//todo
}
processBuffer(); //处理读取的数据


可以看出CPU大部分被浪费了


异步非阻塞IO
服务端调用read()方法,若网卡缓冲区中无数据则返回,程序继续向下执行。当缓冲区中有数据时,系统会通知应用程序。
Java nio中的selector可设置为异步非阻塞IO

异步阻塞IO
谁来补充下
4
0
分享到:
评论
3 楼 mercyblitz 2010-07-13  
xly_971223 写道
mercyblitz 写道
楼主是不是搞错了,Java NIO是同步非阻塞,在Linux 2.6以上的内核中,JDK6采用的epoll,如果前提条件不满足,则是select/poll的模式,都属于同步非阻塞IO。

多谢提醒 java nio确实是同步非阻塞的
如下伪代码
Byte[] buffer = new Byte[1024];
While(read(buffer)>0){ //read()返回读到的字节数
	//todo
}
processBuffer(); //处理读取的数据




不客气,呵呵。
2 楼 xly_971223 2010-07-13  
mercyblitz 写道
楼主是不是搞错了,Java NIO是同步非阻塞,在Linux 2.6以上的内核中,JDK6采用的epoll,如果前提条件不满足,则是select/poll的模式,都属于同步非阻塞IO。

多谢提醒 java nio确实是同步非阻塞的
如下伪代码
Byte[] buffer = new Byte[1024];
While(read(buffer)>0){ //read()返回读到的字节数
	//todo
}
processBuffer(); //处理读取的数据


1 楼 mercyblitz 2010-07-12  
楼主是不是搞错了,Java NIO是同步非阻塞,在Linux 2.6以上的内核中,JDK6采用的epoll,如果前提条件不满足,则是select/poll的模式,都属于同步非阻塞IO。

相关推荐

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

    1. 同步IO与异步IO: - **同步IO**:在同步模式下,应用程序执行I/O操作时会等待操作完成。这意味着程序在数据传输期间被挂起,直到数据准备就绪或传输完毕。例如,Java的`InputStream`和`OutputStream`类的读写...

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

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

    JAVA IO同步,异步

    同步IO 是指应用程序在执行IO 操作时,需要等待IO 操作完成后才能继续执行其他操作,而异步IO 则是指应用程序可以继续执行其他操作,而不需要等待IO 操作完成。 在本文中,我们将讨论基于系统底层通信技术Socket 的...

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

    在IO多路复用机制如select和poll中,通过fd(文件描述符)来监控多个IO事件,它们在处理异步IO时显得尤为重要。无论是在传统的网络编程还是在现代的云服务架构中,这些IO处理模型都是不可或缺的一部分。

    同步、异步IO

    同步IO和异步IO的主要区别在于如何处理数据传输时的等待时间。在同步IO中,当一个进程发起IO操作时,它会直接等待操作完成,这期间CPU会处于空闲状态,直到数据准备好才能继续执行后续代码。这种方式简单易懂,但...

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

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

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

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

    同步异步阻塞非阻塞

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

    文件的IO异步读写操作

    传统的同步IO操作会阻塞程序执行,直到IO操作完成。这意味着在IO操作期间,CPU资源可能会被浪费,无法执行其他任务。而异步IO则允许程序在等待IO操作完成的同时继续执行其他任务,提高了系统的整体效率。在异步模式...

    WSAEventSelect IO异步io

    在同步IO模式下,程序必须等待IO操作完成才能继续执行,而异步IO则允许程序在IO操作进行的同时执行其他任务,提高了程序的响应性和效率。 **二、异步IO的工作原理** 在WSAEventSelect中,开发者可以指定一个或多个...

    WinSock 异步IO模型

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

    linux异步IO.pdf

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

    Python 携程_异步IO 04同步和异步的概念.mp4

    Python 携程_异步IO 04同步和异步的概念.mp4

    多线程,重叠IO,异步读写 命名通道服务器源码

    《多线程、重叠IO、异步读写与命名通道服务器源码解析》 本文将深入探讨一种基于Windows API的多线程命名管道服务器的实现,涉及的关键技术包括多线程、重叠I/O(Overlapped I/O)、异步读写以及命名管道。这些技术...

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

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

    一个简单的异步IO库

    本项目是一个基于C语言在Linux环境下实现的简单异步IO库,旨在提供对socket、文件读取、定时器以及文件状态变更监控的支持。 首先,我们来看一下异步I/O的基本概念。传统的同步I/O模式在执行I/O操作时会阻塞,直到...

    基于异步IO的socket通信程序

    在标题所提及的“基于异步IO的socket通信程序”中,我们可以推测有以下三个主要部分: 1. **Socket通信的抽象**:这是对socket通信的基本封装,通常包含连接建立、数据传输和断开连接等基本操作。抽象类或接口可以...

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

    同步和异步的区别在于数据访问时是否使进程阻塞,而阻塞和非阻塞的区别在于调用是否立即返回,无论数据是否准备好。 需要注意的是,同步和异步是客户端的视角,而阻塞和非阻塞是服务器的视角。同步和异步主要由...

    java同步异步知识

    - **使用场景**:适用于复杂的异步编程场景,如异步IO操作、异步网络请求等。 #### 四、案例分析 以下是一个简单的synchronized关键字使用的示例: ```java package test.thread; public class SynTest { // ...

    异步IO、APC、IO完成端口、线程池与高性能服务器.pdf

    ### 异步IO、APC、IO完成端口、线程池与高性能服务器 #### 一、异步IO概述及背景 异步IO是计算机科学领域中一种重要的机制,用于提高系统的性能,尤其是在处理大量的输入输出操作时。随着计算能力的发展,CPU速度...

Global site tag (gtag.js) - Google Analytics