Handler消息机制(一):Linux的epoll机制
1、在 Linux 中,epoll 机制是一个重要的机制。在 Android 中的 Handler,简单的利用了 epoll 机制,做到了消息队列的阻塞和唤醒。
2、epoll是select和poll的改进版本,更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
3、这将导致多个线程操作同一fd,可以使用EPOLLNESHOT标志避免,即在一次wait返回后禁止fd再产生事件,并在处理完成后使用epoll_ctl的MOD操作重新开启。
4、epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
5、epoll是linux中IO多路复用的一种机制,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
关于Linux下的select/epoll
1、select是IO多路复用模型的一种实现,当select函数返回后可以通过轮询fdset来找到就绪的socket。优点是几乎所有平台都支持,缺点在于能够监听的fd数量有限,Linux系统上一般为1024,是写死在宏定义中的,要修改需要重新编译内核。
2、epoll在Kernel内核中存储了对应的数据结构(eventpoll)。
3、文件抽象 在 Linux 内核里,文件是一个抽象,设备是个文件,网络套接字也是个文件。文件抽象必须支持的能力定义在 file_operations 结构体里。
求一个linux下的epoll服务器和客户端代码
文件抽象 在 Linux 内核里,文件是一个抽象,设备是个文件,网络套接字也是个文件。文件抽象必须支持的能力定义在 file_operations 结构体里。
epoll相关的内核代码在fs/eventpoll.c文件中,下面分别分析epoll_create、epoll_ctl和epoll_wait三个函数在内核中的实现,分析所用linux内核源码为2版本。
因此,基于select模型的服务器程序,要达到10万级别的并发访问,是一个很难完成的任务。由于epoll的实现机制与select/poll机制完全不同,上面所说的 select的缺点在epoll上不复存在。