`

非阻塞I/O及epoll理解新方式?

阅读更多

 

阻塞I/O与非阻塞忙轮询I/O的缺点

阻塞I/O:一个线程只能处理一个流的I/O事件。如果想要同时处理多个流,要么多进程(fork),要么多线程(pthread_create)。

非阻塞忙轮询I/O:循环轮询所有流,没有I/O时CPU空转。

以上两种方式缺点很明显,阻塞I/O一个线程(或进程)处理一个流不适合高并发和大量长连接场景,非阻塞忙轮询I/O的主要问题需要主动轮询流的状态,无I/O时CPU空转。

 

 

非阻塞I/O及epoll理解新方式

非阻塞I/O可以理解为引入一个代理(select、poll、epoll等),这个代理比较厉害,可以同时观察许多流的I/O事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中醒来,由程序轮询一遍所有的流进行相应的I/O。

有两点很重要:

1、非阻塞I/O的本质,是把一个流加入到内核监控列表中,当监控列表中的流有I/O操作时,会主动推送消息给应用程序,让应用程序知道,哪个流发生了怎样的I/O事件。

2、epoll比select更好的一点是,当有I/O事件发生时,select返回的是所有监控的流,应用程序需要O(n)的无差别轮询所有流。epoll模式下内核只会返回有发生I/O事件的流并且指明发生了什么I/O事件。

补充一点:阻塞模式下,内核对于I/O事件的处理是阻塞或者唤醒,而非阻塞模式下则把I/O事件交给(代理给)其他对象(select、epoll等)处理甚至直接忽略。

 

参考链接

网络编程基础——学习阻塞,非阻塞(select和epoll)

http://www.cnblogs.com/Simon-xm/p/4093347.html

 IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

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

 

 

 

 

 

 

分享到:
评论

相关推荐

    linux 设备驱动中的阻塞与非阻塞 I/O

    然而,使用非阻塞I/O需要应用层代码进行复杂的轮询检查,以确定数据是否已准备好,这可能导致CPU资源的过度消耗。 在Linux设备驱动中,通常需要根据具体应用场景选择合适的I/O模型。例如,对于实时性要求高的系统,...

    unix平台下I/O聚集和分离的一种方案

    Unix系统提供了多种I/O模型,如阻塞I/O、非阻塞I/O、I/O多路复用(如select、poll、epoll)、信号驱动I/O以及异步I/O。I/O聚集通常指的是在一个系统调用中处理多个文件描述符,而I/O分离则是在不同时间或通过不同...

    Unix I/O 小结

    Unix I/O系统是操作系统的核心部分,它提供了对文件和设备进行输入输出操作的接口。本文主要总结了Unix下的I/O模型及其相关系统调用。 在Unix中,每个进程都有一个打开文件描述符表,用于存储指向文件inode的指针和...

    socket I/O模型源代码

    本文将深入探讨五种主要的套接字I/O模型:阻塞I/O、非阻塞I/O、I/O复用(select/poll/epoll)、信号驱动I/O以及异步I/O,同时通过提供的源代码文件,我们可以更直观地理解这些模型的工作原理。 1. **阻塞I/O模型**...

    非阻塞式编程

    在实际应用中,常常结合多线程或多进程模型,利用非阻塞I/O来实现高效的I/O复用,例如在一个线程中使用epoll来监听多个网络连接,一旦有新的数据到达,就唤醒另一个线程或进程进行处理。这种方式称为“Reactor”模式...

    linux下非阻塞IO程序源码.zip

    在"linux下非阻塞IO程序源码.zip"这个压缩包中,我们可以找到相关的源代码示例,以帮助理解非阻塞I/O的实现。 非阻塞I/O在Linux中的实现主要通过以下方式: 1. **fcntl()** 函数:可以将文件描述符设置为非阻塞...

    i.MX6ULL实现非阻塞IO访问【Linux驱动】.zip

    这些驱动程序需要实现非阻塞I/O接口,以便用户空间程序能够以非阻塞方式与其交互。 7. **线程和同步**:在实现非阻塞I/O时,可能需要使用线程来并发处理多个I/O请求。为了防止数据竞争和死锁,需要合理使用互斥锁、...

    I/O交互支持库

    8. **非阻塞I/O**:与异步I/O类似,非阻塞I/O允许程序在等待I/O操作时不会被挂起,而是立即返回,通过轮询检查数据是否准备就绪。 总之,I/O交互支持库是软件开发中的基础工具,它简化了与系统进行数据交换的复杂性...

    STM32H7 LWIP Rev非阻塞方式

    STM32H7系列是意法半导体(STMicroelectronics)推出的高性能微控制器,基于ARM Cortex-M7内核,具有强大的处理能力和丰富的外设接口。...正确理解和使用非阻塞I/O,能够帮助开发者构建更加稳定和高效的嵌入式系统。

    C/C++ 学习代码实例 - socket编程代码(包括阻塞式、非阻塞式:select/epoll模式)

    本资料包“C/C++ 学习代码实例 - socket编程代码(包括阻塞式、非阻塞式:select/epoll模式)”提供了一些关键知识点,帮助开发者深入了解 socket 编程。 首先,我们来讨论 socket 编程。Socket 是网络通信的基本...

    非阻塞IO+Proactor+日志系统 自定义协议服务器.zip

    在C++中,可以使用套接字API(如`select`、`poll`或`epoll`)来实现非阻塞I/O,也可以利用Boost.Asio库,它为异步I/O和Proactor模式提供了高级接口。同时,C++标准库中的`std::future`和`std::async`可以用于实现...

    ZYNQ 7010-7020实现非阻塞IO访问(Linux驱动).zip

    在这些函数中,需要利用Linux提供的API,如`poll`、`select`、`epoll`等,来支持非阻塞I/O模型。 4. **同步机制**:为了保证数据一致性,驱动可能需要使用信号量、条件变量、原子操作等同步原语来控制对共享资源的...

    阻塞与非阻塞IO

    - **非阻塞I/O**:当进程发起I/O请求后,如果I/O操作尚未完成,进程不会被挂起,而是立即返回错误或特定值。 - **轮询(Polling)**:进程不断地查询设备的状态,直到设备准备好接收数据或提供数据。 **3.2 性能...

    IO 模型网络程序实验

    2. 同步非阻塞I/O模型:在这种模型中,read或write操作会立即返回,即使数据未准备好,但需要不断地轮询检查数据是否就绪。 3. I/O复用模型(如select、poll、epoll):允许单个线程监视多个文件描述符,等待数据...

    网络IO模型 Linux环境下的network IO

    本主题将深入探讨几种主要的网络I/O模型,包括阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O以及异步I/O,并结合Linux内核机制进行详细分析。 1. **阻塞I/O模型** 在阻塞I/O模型中,当进程尝试读取或写入数据时,如果...

    重叠IO模型

    传统的I/O模型通常分为阻塞I/O、非阻塞I/O、I/O复用(如select、poll、epoll)、信号驱动I/O和异步I/O。重叠IO模型属于异步I/O的一种,但与标准的异步I/O(如POSIX的aio_*函数)不同,它在Windows操作系统中被广泛...

    Proactor模式&Reactor模式详解

    根据数据传输方式的不同,通常将I/O模型分为四类:同步阻塞I/O、同步非阻塞I/O、I/O多路复用(Reactor模式)以及异步I/O(Proactor模式)。本文旨在详细介绍这些I/O模型,并着重解析Reactor模式与Proactor模式的设计...

    linux的IO编程

    Linux提供了多种I/O模型,包括同步I/O、异步I/O、阻塞I/O和非阻塞I/O,以及更高级的I/O复用技术如 select、poll 和 epoll。以下是对这些内容的详细阐述: 1. **同步I/O与异步I/O** 同步I/O操作意味着执行I/O操作的...

    一种普通I/O模拟收发数据源代码

    7. **性能优化**:在实际应用中,可能会对模拟I/O进行优化,如使用缓冲技术减少频繁的系统调用,或者利用非阻塞I/O或多路复用I/O(如select、poll、epoll等)提高并发处理能力。 8. **跨平台性**:普通I/O接口在...

    非阻塞模式网络聊天应用程序

    非阻塞模式网络聊天应用程序是一种高效且现代的通信软件设计方式,它主要利用了计算机网络编程中的非阻塞I/O模型。在这个模型中,当一个I/O操作(如读取或写入数据)不能立即完成时,程序不会被挂起等待,而是继续...

Global site tag (gtag.js) - Google Analytics