关于socket的IO多路复用

来源文章:
最多能创建多少个TCP连接?
你管这破玩意叫 IO 多路复用?

创建一个socket都需要哪些系统资源?

  • 内存资源
  • CPU资源
  • 端口号资源
  • 文件描述符资源
  • 线程资源

IO多路复用的发展历程

阻塞IO

read数据过程完全阻塞(不论有没有数据)
可把read放在子线程中,实现主线程非阻塞

非阻塞 IO

在无数据时,read不再等待数据,而是返回无数据的状态值
在读取数据时read仍然是阻塞的。

IO 多路复用

因为每一次read都是一次系统调用,所以如果一次read能够批量取回多个连接的数据状态,这将大大提高性能

select系统调用

参数为一个文件描述符列表,在内核中遍历并标记文件描述符,返回标记过状态的文件描述符列表,用户进程可以根据此状态知道哪些描述符的数据已经准备好了。

问题:

  1. select 调用需要传入 fd 数组,需要拷贝一份到内核,高并发场景下这样的拷贝消耗的资源是惊人的。(可优化为不复制)
  2. select 在内核层仍然是通过遍历的方式检查文件描述符的就绪状态,是个同步过程,只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知)
  3. select 仅仅返回可读文件描述符的个数,具体哪个可读还是要用户自己遍历。(可优化为只返回给用户就绪的文件描述符,无需用户做无效的遍历)

poll系统调用

它和 select 的主要区别就是,去掉了 select 只能监听 1024 个文件描述符的限制。

epoll系统调用

针对select的缺点做了如下改进:

  1. 内核中保存一份文件描述符集合(红黑树),无需用户每次都重新传入,只需告诉内核修改的部分即可。
  2. 内核不再通过轮询的方式找到就绪的文件描述符,而是通过异步 IO 事件唤醒。
  3. 内核仅会将有 IO 事件的文件描述符返回给用户,用户也无需遍历整个文件描述符集合。

并发设计模式

reactor

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值