什么是IO多路复用

前景概念

IO

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

socket

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

文件描述符

文件描述符就是fd文件,创建socket系统调用会生成一个文件描述符,文件描述符就是一个数字,程序对socket操作就会转化为对这个描述符的操作
什么是IO多路复用_第1张图片

阻塞

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

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

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

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

IO多路复用

BIO

BIO就是阻塞io(blocking io),如下图,主线程阻塞接收新链接,clone子线程阻塞recv读数据:
什么是IO多路复用_第2张图片

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

NIO是非阻塞io,采用轮询内核的方式,如图:
NIO在调用系统内核后立即返回,然后采用主动轮询的方式访问内核,recv不再阻塞
什么是IO多路复用_第3张图片

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

多路复用器有select()、 poll()、 epoll()
什么是IO多路复用_第4张图片

你可能感兴趣的:(网络编程,io,linux,网络,运维)