`

java thread : select poll epoll

阅读更多

 

Select/Poll函数

Selec()3种情况:

1.    永远等待下去:直到有一个描述字准备好IO才返回,此时select()函数的参数timeout设置为空指针

2.    等待固定的时间:在不超过等待时间的情况下,有一个描述字准备好IO时才返回. (返回之后,)

3.    不等待:检查描述字之后立即返回,这称为轮询。

 

Select返回的情况:

  集合fd中的任何描述字准备好读

  集合fd中的任何描述字准备好写

  集合fd中的任何描述字有异常条件待处理

  等待了timeout的时间

Select参数会通知内核程序对哪些描述字(fd)感兴趣以及感兴趣的条件( 写或异常条件)以及等待多长时间 . 描述字不限制于套接字,任何描述字都可用select来测试

(PS: select对所管理的描述字是有MAX限制的)

Select Poll 本质也是阻塞的

 

  摘自:http://kaiyuan.blog.51cto.com/930309/341121

1将用户传入的pollfd数组拷贝到内核空间,因为拷贝操作和数组长度相关,时间上这是一个On)操作,这一步的代码在do_sys_poll中包括从函数开始到调用do_poll前的部分。

每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

 

2查询每个文件描述符对应设备的状态,如果该设备尚未就绪,则在该设备的等待队列中加入一项并继续查询下一设备的状态。查询完所有设备后如果没有一个设备就绪,这时则需要挂起当前进程等待,直到设备就绪或者超时,挂起操作是通过调用schedule_timeout执行的。

每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

 

3设备就绪后进程被通知继续运行,这时再次遍历所有设备,以查找就绪设备。这一步因为两次遍历所有设备,时间复杂度也是On),这里面不包括等待时间。相关代码在do_poll函数中。

将获得的数据传送到用户空间并执行释放内存和剥离等待队列等善后工作,向用户空间拷贝数据与剥离等待队列等操作的的时间复杂度同样是On),具体代码包括do_sys_poll函数中调用do_poll后到结束的部分。

 

 

EPOLL

selectpoll都只提供了一个函数——select或者poll函数。

epoll提供了三个函数,epoll_create,epoll_ctlepoll_wait

epoll_create是创建一个epoll句柄;

epoll_ctl是注册要监听的事件类型;

epoll_wait则是等待事件的产生。

 

 

先来看sys_epoll_create(epoll_create对应的内核函数),这个函数主要是做一些准备工作,比如创建数据结构,初始化数据并最终返回一个文件描述符(表示新创建的虚拟epoll文件),这个操作可以认为是一个固定时间的操作。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

epoll是做为一个虚拟文件系统(虚拟fd Manager)来实现的,这样做至少有以下两个好处:
     1
,可以在内核里维护一些信息,这些信息在多次epoll_wait间是保持的,比如所有受监控的文件描述符

2 epoll本身也可以被poll/epoll;

 

接着是sys_epoll_ctl(epoll_ctl对应的内核函数),需要明确的是每次调用sys_epoll_ctl只处理一个文件描述符,这里主要描述当op(operate)EPOLL_CTL_ADD时的执行过程,

op:要进行的操作例如注册事件,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 改、EPOLL_CTL_DEL 删除 

 

sys_epoll_ctl做一些安全性检查后进入ep_insertep_insert里将 ep_poll_callback做为回掉函数加入设备的等待队列(假定这时设备尚未就绪),由于每次poll_ctl只操作一个文件描述符,因此也可以认为这是一个O(1)操作

 

   ep_poll_callback函数很关键,它在所等待的设备就绪后被系统回掉,执行两个操作:
       1
,将就绪设备加入就绪队列,这一步避免了像poll那样在设备就绪后再次轮询所有设备找就绪者,降低了时间复杂度,由On)到O1;
        2
,唤醒虚拟的epoll文件;

 

epoll的优点:

1、没有最大并发连接的限制,能打开的FD的上限远大于10241G的内存上能监听约10万个端口);
  2
、效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;
      
Epoll最大的优点就在于它只管你活跃的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于selectpoll

3 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。

 

 

 

 

 

分享到:
评论

相关推荐

    linux_threadpool.zip_epoll select _epoll thread_epoll编程_thread

    epoll是Linux内核提供的更为高效的一种I/O多路复用技术,相比select和poll,它能处理更多的并发连接,并且有更好的性能。epoll采用“事件驱动”模型,通过`epoll_create()`、`epoll_ctl()`和`epoll_wait()`三个系统...

    epoll的用法

    Epoll是Linux 2.6内核版本引入的,它与早期的select和poll模型相比,在性能上有显著的提升。 在讨论Epoll的用法之前,首先要了解一些基础概念和现有技术的局限性。在Linux系统中,每个进程都有一个文件描述符(File...

    Linux C epoll.zip_Linux下线程池_c epoll_epoll C++_epoll 线程池_linux c

    2. **Epoll(Event Poll)**:Epoll是Linux内核提供的一种I/O多路复用技术,相较于传统的select和poll,Epoll更高效,支持水平触发和边缘触发两种模式,并且能够有效地解决大量文件描述符的问题。Epoll的优势在于其...

    EpollServer-master.zip

    Epoll是Linux内核提供的I/O多路复用接口,它是select和poll的升级版。Epoll的优势在于其高效的数据结构和API设计,能够处理大量的并发连接,并且减少了上下文切换的开销。Epoll使用“事件”的概念,可以实现水平触发...

    Linux_Epoll介绍和程序实例

    Epoll 使用共享内存的方式代替了 Select 和 Poll 中的内核与用户空间之间的内存拷贝,进一步减少了系统开销。 #### 三、Epoll 的工作原理 Epoll 的高效与其内部的数据结构密切相关。在传统 Select 模型中,当有 I/...

    Linux C epoll.zip

    传统的`select`和`poll`函数在处理大量并发连接时效率较低,因为它们会轮询所有的文件描述符,即使大多数描述符可能并未准备就绪。而epoll采用“边缘触发”(ET)和“水平触发”(LT)两种模式,以及“事件驱动”的...

    epoll_sever linux下用epoll编写的服务器

    在Linux操作系统中,`epoll`是用于I/O事件通知的一种高效机制,它极大地改进了传统的`select`和`poll`方法。`epoll Sever`是利用`epoll`实现的服务器模型,它可以处理大量的并发连接,适用于高性能、高并发的网络...

    线程池epoll多路复用服务器c++

    epoll是Linux内核提供的一种I/O多路复用机制,它是select、poll的增强版本。在epoll中,可以注册多个文件描述符(如套接字),然后在一个单一的系统调用中检查它们的状态,而不是轮询检查每一个。当文件描述符上有可...

    基于epoll实现http1.1服务器 支持php参数传递及html的c++网络服务器

    2. **epoll**:epoll是Linux内核提供的一种I/O事件通知机制,相比于传统的select和poll,epoll具有更高的性能和可扩展性。epoll使用“事件”的概念,可以同时监控多个文件描述符,并且在有事件发生时,只唤醒处理...

    阿里P8 架构师整理Java学习笔记.pdf

    - **多路复用IO**: 使用select/poll/epoll等技术实现同时监听多个Socket的状态变化,提高了系统的并发能力。 **2.4 信号驱动IO模型** - **信号驱动IO**: 当用户进程发起IO操作后,内核会立即返回,当IO操作完成后...

    华为校园招聘历年经典面试题汇总:Java开发

    ### 华为校园招聘历年经典面试题汇总:Java开发 #### 拓扑排序思想 拓扑排序是对有向无环图(DAG)的顶点的一种线性排序方式,使得对于任意一对顶点u、v,如果图中存在一条从u到v的路径,则在排序结果中,u出现在v...

    cpp-多线程epolllibevent网络库分别实现的三个网络HTTP服务器程序

    2. **epoll**:epoll是Linux内核提供的一种I/O多路复用技术,相比旧有的poll和select,它有更好的性能和可扩展性。epoll允许我们注册感兴趣的文件描述符,并在它们就绪时通过`epoll_wait`函数通知我们,减少了不必要...

    libevent-thread-20140224-1.7z

    Libevent提供了三种主要的事件模型:基于内核的epoll、基于文件描述符的poll和基于select。这些模型在多线程环境下的实现都需要考虑到线程安全问题。例如,当一个线程修改了事件列表,而另一个线程正在读取或处理...

    C事件驱动循环的网络IO编程框架的源码.rar

    - highly optimised select, poll, epoll, kqueue and event ports backends. - filesystem object (path) watching (with optional linux inotify support). - wallclock-based times (using absolute time, cron-...

    C++ 网络编程,是一个pdf文件,说的是关于在linux下进行c++ socket开发 ,很不错哦

    8. **异步I/O**:利用`epoll`、`select`或`poll`系统调用来实现非阻塞I/O,提高程序的并发处理能力。特别是`epoll`,在处理大量并发连接时表现出优越的性能。 9. **安全考虑**:网络编程中,数据安全不容忽视。SSL/...

    linux类IOCP接口

    这种设计使得程序可以在等待 I/O 完成时,可以去做其他有意义的工作,避免了传统的 select 和 poll 等机制中的“忙等”问题。 类 IOCP 接口的实现通常包括以下几个关键组件: 1. **Epoll 实例**:程序首先创建一个...

    C++ Socket

    在Linux系统中,`epoll`提供了更强大的文件描述符监控机制,相比于传统的`select`和`poll`,它具有更好的性能和可扩展性。 首先,`epoll`的工作原理是通过`epoll_create`创建一个`epoll`实例,然后使用`epoll_ctl`...

    网络IO框架-Netty-v1.3.pdf

    非阻塞I/O允许应用程序在等待数据准备就绪时执行其他任务,通过I/O多路复用(如select、poll、epoll)系统调用,只阻塞在这些系统调用上,而不是实际的数据读写操作。这使得IO处理与业务处理可以解耦,CPU密集型的IO...

Global site tag (gtag.js) - Google Analytics