IO多路复用 && Redis网络模型

1.阻塞与非阻塞都会造成cpu的浪费
image1

2.IO多路复用的实现思想

2.1 前置知识 文件描述符FD:
当一个进程在 Linux 中打开一个文件(比如 open(“a.txt”)),内核并不会直接把文件内容“交给你”。

1
2
内核会先在<span style='font-weight:bold;background:yellow;mso-highlight:yellow'>内核空间</span><span style='background:yellow;mso-highlight:yellow'>维护一个文件表(file table)</span>,
每个打开的文件对应一个<span style='background:yellow;mso-highlight:yellow'>结构体(struct file),里面记录了文件的状态、读写位置、权限</span>等信息。

然后,内核给你的进程返回一个整数(0、1、2、3、…)——这就是文件描述符

2.2
image2

3.常见的实现方法
image3

3.1 select实现
image4

3.2poll实现
image5

3.3 epoll
image6

3.4 总结select,poll,epoll
image7

  1. 事件通知机制

4.1 前置知识
惊群: 多个线程同时监听一个epoll实例.
当该epoll实例存在fd准备好时,内核会通知所有监听该实例的线程,
,但是只有一个线程能拿到该实例,其他线程白白被唤醒,造成资源浪费.

而LT会反复通知,惊群发生概率高,ET只通知一次, 概率小

image8

5.
image9

6.

6.1 信号驱动IO : 发送sigio等待数据,好了就recvfrom拷贝
此处recvfrom是数据拷贝函数
image10
6.2 异步IO: 发送read, 等待数据并且copy好, 直接一条龙返回
image11

6.3 判断异步还是同步
image12

阻塞和非阻塞, 同步和异步
image13