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

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

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
39a08c3c72edf47aeeddbcccb4289be552710114

3.常见的实现方法
49e059bfe00c7e7e258b5ee10d3efe54be42db67

3.1 select实现
ce41d609e5edf43cdad3ab4c1094162d9d9296ee

3.2poll实现
18e53c508702dae6721a2626a25b0949309b0f94

3.3 epoll
a5f4eed2d1983473728fa51f4798404218e9cb3f

3.4 总结select,poll,epoll
6e823793d13d99a368eb7752c10e65b73874089f

  1. 事件通知机制

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

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

83d8ed74ec8ef476413605c0094386a619b2e62a

5.
2376b21ae985ac9281a669c63c70935c35d71562

6.

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

6.3 判断异步还是同步
6fa1992af8fa6e61fa8569e8dacb7a0c0f9ab4b5

阻塞和非阻塞, 同步和异步
0fe22717db124817b5652586aef8fee95991771a