介绍
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有变化时通过回调的方式主动告知用户进程;无最大链接数的限制