I/O多路复用


IO多路复用

同步和异步:指的是用户和内核的交互方式。

同步:调用某个东西时间,调用方得等待这个调用返回结果才能继续往后执行

异步: 调用方不会理解得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用
阻塞和非阻塞:强调的是程序在等待调用结果(消息,返回值)时的状态。

阻塞:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。

非阻塞:非阻塞等待,每隔一段时间就去检查IO事件是否就绪。没有就绪就可以做其他事情。
常见的IO模型:

  1. 同步阻塞IO:传统IO模型,默认创建的socket是阻塞的,
  2. 同步非阻塞IO:非阻塞IO要求socket被设置为NONBLOCK。
  3. IO多路复用:经典的Reactor设计模式,有时也叫异步阻塞IO
  4. 异步IO:经典的Proactor设计模式,称为异步非阻塞IO。

IO多路复用

I/O多路复用,I/O就是指的我们网络I/O,多路指多个TCP连接(或多个Channel),复用指复用一个或少量线程。

在linux中,关于多路复用的使用,有三种不同的API,select、poll和epoll

Select

将所有的socket放在文件描述符集合中,然后调用select函数将文件描述符集合拷贝到内核中,内核遍历是否有网络事件产生,并且标记对应的Socket,再将文件描述符拷贝到用户态,在进行一次遍历,找到对应的socket。
select使用固定大小的BitsMap通常的是1024.

Poll

整体逻辑和select相同,但使用链表来实现,突破了最大连接数的限制。

Epoll