背景 : socket在没有得到IO结果的时候会在系统态阻塞自己, 一个进程监听多个socket, 减少进程切换开销
几种方法:
- 同步方法
- 异步方法
异步方法等系统准备好并拷贝到用户态之后发信号过来读
同步方法分成阻塞和非阻塞.
非阻塞就是在没有准备好时return -1, 因此需要程序反复查询
阻塞就是直接阻塞, 等待准备好.
同步方法都是在系统准备好就调用, 需要手动拷贝到用户态, 这个时候时阻塞的.
select poll 和epoll都是同步方法, 让程序阻塞在用户态, 自己在系统态.
select和poll是反复查询所有的socket IO接口, 如果有IO好了就叫哪个. select上限1024个, poll使用链表记录, 无上限.
epoll在注册的时候需要注册回调函数, 当SOCKET IO 准备好的时候会被被动触发, epoll就能知道是谁好了, 直接交给对方.
select是POSIX, epoll是Linux专享
网友评论