什么是IO多路复用

前景概念

IO

在linux操作系统中,一切皆文件,就是一串二进制字符流;在信息交换的过程中,我们都是对这些流进行的收发操作,简称IO(input and output);
流的读写,用程序和内核发生的系统调用来实现,read() write()。

socket

Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中

文件描述符

文件描述符就是fd文件,创建socket系统调用会生成一个文件描述符,文件描述符就是一个数字,程序对socket操作就会转化为对这个描述符的操作
在这里插入图片描述

阻塞

什么是程序的阻塞呢?想象这种情形,比如你等快递,但快递一直没来,你会怎么做?有两种方式:

  • 快递没来,我可以先去睡觉,然后快递来了给我打电话叫我去取就行了。
  • 快递没来,我就不停的给快递打电话说:擦,怎么还没来,给老子快点,直到快递来。

很显然,你无法忍受第二种方式,不仅耽搁自己的时间,也会让快递很想打你。
而在计算机世界,这两种情形就对应阻塞和非阻塞忙轮询。

  • 非阻塞忙轮询:数据没来,进程就不停的去检测数据,直到数据来。
  • 阻塞:数据没来,啥都不做,直到数据来了,才进行下一步的处理

IO多路复用

BIO

BIO就是阻塞io(blocking io),如下图,主线程阻塞接收新链接,clone子线程阻塞recv读数据:
在这里插入图片描述

BIO缺点:
  • 系统调用clone创建线程;
  • 线程栈消耗资源;
  • 线程上下文切换消耗cpu;
  • 主要是blocking。
NIO

NIO是非阻塞io,采用轮询内核的方式,如图:
NIO在调用系统内核后立即返回,然后采用主动轮询的方式访问内核,recv不再阻塞
在这里插入图片描述

NIO缺点
  • 并发大的时候每次轮询O(n)次内核;
多路复用器

多路复用器有select()、 poll()、 epoll()
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值