IO多路复用select,poll,epoll
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select/poll传入多个文件描述符(FileDescription 简称FD),如果有一个文件描述符准备就绪就返回,否则一直阻塞到超时。
IO多路复用是一种机制,一个进程监控多个文件描述符,一旦某个文件描述符准备就绪就通知进程执行相应的IO操作,但select、poll、epoll本质上是同步IO,需要在读写事件就绪后自己负责读写,也就是说这个读写过程是阻塞的。而异步IO无需自己处理读写,而是把读写交给了内核。
与多线程或多进程相比,IO多路复用技术最大的优势就是开销小,不用再创建或维护进程或线程,从而大大见笑了开销。
1、select
select坚实的文件描述符分为3类,即write_fds、read_fds、except_fds,调用select函数后,进程会阻塞,直到文件描述符就绪(可读、可写或者except)或超时,函数返回。当函数返回后遍历fd_set找到就绪的文件描述符。
select的缺点
- ①、单个进程监视的文件描述符的数量FD_SETSIZE是有限的,一般是1024,可以修改宏定义来修改这一限制,但内核需要重新编译;
- ②、对select扫描时是线性扫描,采用轮询的方式,效率低;
- ③、每次调用select()函数都需要把fd从用户态拷贝到内核态,当fd很多时这个复制开销会很大,而且每次调用select()函数都会在内核态遍历fd,这个开销在fd很多时也是很大的。
2、poll
poll本质上与select没什么大的差别,管理多个文件描述符也是采用轮询的方式,但是poll没有大小限制,因为poll使用的是链表存储文件描述符。poll同样存在一个问题,包含大量文件描述符的数组会被整体复制于内核态与用户态的地址空间之间,它的开销随着文件描述符的数量则加而增大。
3、epoll
epoll是2.6内核之后提出的,相对于poll与select更加灵活,而且没有数量限制,epoll使用一个文件描述符管理多个描述符,将用户关系的描述符的事件存放到内核的一个事件表中,这样用户空间和内核空间只需复制一次。
优点:
- 没有最大连接的并发限制,能打开的FD的最大数量远远大于1024;
- 效率提升,不是轮询的方式,不会随着FD数量的增加导致效率降低,只在乎活跃的连接,而与连接的总数无关。
参考文章:
IO多路复用select,poll,epoll详解
IO多路复用select,poll,epoll
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select/poll传入多个文件描述符(FileDescription 简称FD),如果有一个文件描述符准备就绪就返回,否则一直阻塞到超时。
IO多路复用是一种机制,一个进程监控多个文件描述符,一旦某个文件描述符准备就绪就通知进程执行相应的IO操作,但select、poll、epoll本质上是同步IO,需要在读写事件就绪后自己负责读写,也就是说这个读写过程是阻塞的。而异步IO无需自己处理读写,而是把读写交给了内核。
与多线程或多进程相比,IO多路复用技术最大的优势就是开销小,不用再创建或维护进程或线程,从而大大见笑了开销。
1、select
select坚实的文件描述符分为3类,即write_fds、read_fds、except_fds,调用select函数后,进程会阻塞,直到文件描述符就绪(可读、可写或者except)或超时,函数返回。当函数返回后遍历fd_set找到就绪的文件描述符。
select的缺点
- ①、单个进程监视的文件描述符的数量FD_SETSIZE是有限的,一般是1024,可以修改宏定义来修改这一限制,但内核需要重新编译;
- ②、对select扫描时是线性扫描,采用轮询的方式,效率低;
- ③、每次调用select()函数都需要把fd从用户态拷贝到内核态,当fd很多时这个复制开销会很大,而且每次调用select()函数都会在内核态遍历fd,这个开销在fd很多时也是很大的。
2、poll
poll本质上与select没什么大的差别,管理多个文件描述符也是采用轮询的方式,但是poll没有大小限制,因为poll使用的是链表存储文件描述符。poll同样存在一个问题,包含大量文件描述符的数组会被整体复制于内核态与用户态的地址空间之间,它的开销随着文件描述符的数量则加而增大。
3、epoll
epoll是2.6内核之后提出的,相对于poll与select更加灵活,而且没有数量限制,epoll使用一个文件描述符管理多个描述符,将用户关系的描述符的事件存放到内核的一个事件表中,这样用户空间和内核空间只需复制一次。
优点:
- 没有最大连接的并发限制,能打开的FD的最大数量远远大于1024;
- 效率提升,不是轮询的方式,不会随着FD数量的增加导致效率降低,只在乎活跃的连接,而与连接的总数无关。
参考文章:
IO多路复用select,poll,epoll详解