跳表的实现原理
单线程的redis为什么速度那么快?
a. 单线程避免上下文的切换
b. 纯内存操作
c. 采用基于事件驱动的IO多路复用网络模型
什么是IO多路复用(IO Multiplexing)?
先提常见的IO模型
1. 同步阻塞BIO
应用程序读取数据的流程
1. 用户线程一直阻塞等待
2. 内核等待数据就绪
3. 内核空间将数据拷贝到用户空间
2. 同步非阻塞NIO
应用程序读取数据的流程
1. 用户线程非阻塞但是需要频繁的询问内核数据是否准备好
2. 内核等待数据就绪
3. 内核空间将数据拷贝到用户空间
异步非阻塞AIO
后续补充
IO多路复用一种同步IO模型
IO多路复用一种同步IO模型,单个进程/线程就可以同时处理多个IO请求。
1. 一个线程通过select可以管理多个IO事件
2. select返回的是就绪的IO事件
3. recfrom让就绪的IO事件通知内核复制数据到用户空间
Linux实现IO多路复用技术的三种方式,默认是epoll
select
1. 轮询数组,判断是否就绪
2. 1024限制
poll
1. 采用链表的方式,其他与select一样
epoll
(返回哪个Socket就绪不用重新遍历判断是否就绪)
- epoll将文件描述符拷贝到内核空间后使用红黑树进行维护,同时向内核注册每个文件描述符的回调函数,当某个文件描述符可读可写的时候,