socket 阻塞模式、非阻塞模式、select、poll、epoll

介绍

socket发展过程

阻塞模式

早期的操作系统,socket是阻塞模式

调用recv()函数接收数据,会一直阻塞,直到套接字读取到数据才会返回

优点:开发相对简单
缺点:效率低下

非阻塞模式

由于 阻塞模式 的缺点,后来提出非阻塞模式,各主流操作系统都支持此模式

不论套接字有没有数据都会马上返回。没有数据时会返回一个错误

优点:效率高
缺点:编写更多的代码,开发难度较大

I/O 多路复用( IO multiplexing)

对多个套接字进行统一管理与调度

select

select是不断轮询去监听的socket,socket个数有限制,一般为1024个(文件描述符为1024,该值可以修改);随着文件描述符数量增加,轮询一回成本增加

各主流操作系统相继支持 select 模型,但不同的操作系统,对 select模型 支持有些诧异,其中 unix、linux相似,功能较强;windows与前两者区别较大

poll

是systemV标准,unix、linux支持

poll类似 select,采用轮询方式监听,但没有个数限制

epoll

是linux2.6以后出现的内核直接支持的方法,具有了select和poll的一切优点,被认为是linux2.6下最优秀的I/O就绪通知方式

epoll不采用轮询方式去监听,而是当socket有变化时通过回调的方式主动告知用户进程;无最大链接数的限制


原文出处:/show_1EF5UyLVfoB8.html