网络IO模型(二):多路复用IO

多路复用IO (IO multiplexing)

提到多路复用,大家最熟悉的莫过于select/epoll。有些地方也将这种IO方式称之为事件驱动IO。我们知道,select/epoll的好处在于单个进程就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll会不断轮训所负责的所有socket.当某个socket到达了,就会通知用户进程。它的流程下:

在这里插入图片描述
如上图,当用户进程调用select,那么进程就会block,同时kernel监听所有select负责的socket,当有一个socket ready了,select就会返回,这时候用户进程再调用read,将数据从kernel拷贝到用户进程。

这里使用了两个系统调用,但使用select以后的有事在于可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断用selec去轮询,而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。(其实如果处理的连接数不是很多的话,使用select/epoll 的server不一定比multi-threading + blocking IO的server性能要好)记住select/epoll优势在于能处理更多的连接。

一般来说,select并不是实现事件驱动的最好选择,因为其有句柄值得限制,即访问的fd的数量是有限的。我们可以使用epoll。但epoll这样的接口在不同的操作系统中有很大差异,所以用于实现具有较好跨平台能力的服务器会比较困难。我们可以选取事件驱动库来实现,例如libevent、libev。这些库会根据OS来选择最适合的接口~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值