select和epoll学习总结

一、实现

  Select实现

  原理:

   Select把要监听的文件信息拷贝到内核层。接着遍历所有监听的文件描述符对应的驱动程序的Poll函数,poll函数把当前进程挂到该设备驱动的等待队列中去,然后Poll函数会返回哪些资源可用的bitmask。如果有资源可用,则把表示哪些文件有事件的bitmask拷贝到用户空间。如果没有一个资源可用,则select会让当前进程睡眠,等有资源可用时,当前进程在资源等待队列中被唤醒,循环扫描。

  过程:

  1. 把需要监听文件的bitmap拷贝到内核空间
  2. 遍历需要监听的文件的poll方法,把当前进程挂到设备的等待队列中,poll返回设备是否可读写的bitmask,并根据bitmask给res_in、res_out、res_ex赋值。

    (1)此时进程并没有睡眠。

    (2)设备有读写事件时会唤醒相关等待队列上的进程。

  1. 遍历完所有fd,如果有可读写的文件,则把处理后的fd_set拷贝到用户空间。如果没有可读写文件,则调用schedule_timeout使当前进程睡眠,等待被唤醒,唤醒后重复2、3步。

  Epoll实现

二、优缺点

时间: 2024-10-08 05:55:25

select和epoll学习总结的相关文章

【UNIX】select、poll、epoll学习

三者都是UNIX下多路复用的内核接口,select是跨平台的接口,poll是systemV标准,epoll是linux专有的接口,基于poll改造而成. select 函数原型: int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);  select通过系统调用监视多个文件描述符的数组,select返回后,就绪的文件描述符会被修改标志位,使得进程可以获得准

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

<h3 class="xyn" helvetica="" neue',="" helvetica,="" arial,="" sans-serif;="" line-height:="" 22px;="" "="" style="padding: 0px; margin: 0px 0px 1px; fo

多进程、协程、事件驱动及select poll epoll

目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---Pipe ---通过Manager可以不同进程间实现数据的共享 --进程同步,即进程锁 --进程池 -协程 --先用yield实现简单的协程 --Greenlet --Gevent --用协程gevent写一个简单并发爬网页 -事件驱动 --IO多路复用 ---用户空间和内核空间 ---文件描述符fd

select,poll,epoll用法

http://blog.csdn.net/sunboy_2050/article/details/6126712 select用法 #include <sys/time.h>       #include <sys/types.h>       #include <unistd.h> #include <sys/select.h> int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exc

select和epoll解释

转载地址:http://yaocoder.blog.51cto.com/2668309/888374 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据:通过write,我们可以往流写入数据.现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回

Linux下select&amp;poll&amp;epoll的实现原理(一)

最近简单看了一把Linux linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已经有IO事件就绪 如果已经有IO事件就绪,则直接所收集到的IO事件返回,本次调用结束 如果暂时没有IO事件就绪,则根据所给定的超时参数,选择性地进入等待 如果超时参数指示不等待,则

Select与Epoll比较

一.问题引出 联系区别 问题的引出,当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或者多线程,但是这种方法会造成程序的复杂,而且对与进程与线程的创建维护也需要很多的开销.(Apache服务器是用的子进程的方式,优点可以隔离用户) 2.用一个进程,但是使用非阻塞的I/O读取数据,当一个I/O不可读的时候立刻返回,检查下一个是否可读,这种形式的循环为

I/O多路复用之select,poll,epoll简介

一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作. 2.select的优点 目前几乎在所有的平台上支持,具有良好的跨平台支持. 3.select的缺点 单个进程能够监视的文件描述符的数量存在最大限制.默认情况下,在Linux上单个进程能够打开的最

select/poll/epoll on serial port

In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port to transmit data between PC and Raspberry pi. Outline Character device file of serial port Naive serial communication Asynchronous conferencing Select