io多路复用总结

多路复用

 

让我们回顾下计算机网络中的多路复用技术,百度百科的解释基本和课本中应该是一样的:

数据通讯系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的基本要求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。

采用多路复用技术能把多个信号组合起来在一条物理信道上进行传输,在远距离传输时可大大节省电缆的安装和维护费用。

以上加粗的部分指出了多路复用的关键特性:

  • 一个信道,多路信号,复用的是信道。

 

io多路复用

 

根据以上定义,io多路复用 就是在某个通道传递多个io流信息

其实站在操作系统的角度看,除了cpu计算,其他的都是io操作。

这么理解就简单了,os需要创建一个通道来管理,传递这些io操作,这个通道就被理解为io多路复用手段。

特点:

  • 一个操作(工具,手段)被复用
  • 监听多个io流
  • 返回有数据返回的io流(epoll才有的扩展)

 

手段的种类

上个流程图:

1,任意个用户线程client发起任意个socket请求,自身可以设置一些socket的监听(方便server回调)

2,请求最终到达server端服务器

3,server端用某种手段接受这些socket(fd,文件描述符和socket是一个意思),不用每个socket单独用一个线程处理,然后处理socket,这个时候client端是异步的,可以继续干其他事情,但是server在处理socket,server是阻塞

4,server端处理完后,利用某种手段通知client socket处理完毕,client端从socket中读取数据(server把数据从内核拷贝到用户)

5,socket 数据返回客户端,处理完毕。

 

OK,上述过程中的手段有3中典型的处理方式:

多路复用技术简介优缺点
select采用32个32位整数,即32*32= 1024来标识,fd值为1-1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候就可以标识32*max值范围的fd
  1. select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件;
  2. 有最大fd限制

poll

 

通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次poll使用链表保存文件描述符,因此没有了监视文件数量的限制,但是仍然需要返回所有句柄
epoll是poll的一种优化,返回后不需要对所有的fd进行遍历,在内核中维持了fd的列表。select和poll是将这个内核列表维持在用户态,然后传递到内核中。与poll/select不同,epoll不再是一个单独的系统调用,而是由epoll_create/epoll_ctl/epoll_wait三个系统调用组成
  1. 没有fd限制,是os能打开的最大的fd数量
  2. 抽象三个过程:
  • 调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源)
  • 调用epoll_ctl向epoll对象中添加这100万个连接的套接字
  • 调用epoll_wait收集发生的事件的连接

 

关键不同:

1,select,poll都需要用户自己处理活跃事件,epoll交给内核处理,所以需要系统支持才行

2,select,poll需要两次拷贝,epoll无需拷贝

 

参考文献:

https://blog.csdn.net/wxy941011/article/details/80274233

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值