文章目录

  • I/O模型:
    • BlockingIO(BIO)
    • Non-blocking I/O(NIO)
  • redis epoll
    • 为什么epoll快?
    • 就绪链表怎么维护?

redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统。 redis 采用 网络IO多路复用技术来保证在多连接的时候, 提高系统的高吞吐量。
Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。
下边就聊一聊网络IO模型:

I/O模型:

当客户端和服务端之间交互的时候,会在内核空间形成一个socket,通过socket来进行交互,可以把socket理解为一个文件。内核会给socket生成一个类似资源的句柄FD(文件描述符),调用底层api传入fd来进行读写。

BlockingIO(BIO)

同步并阻塞(传统阻塞型IO),当用户线程发起一个IO请求操作,内核会去查看要读取的数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪;当数据就绪之后,便将数据拷贝到用户线程,这样才完成了一个完整的IO读请求操作。
服务器实现模式为一个连接一个线程,就是客户端发送连接请求时候,服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的线程开销,比如socket阻塞在 accept 等待连接。BIO可以通过多线程的方式来改善并发性能,不过底层还是一个线程对应一个连接。
如下图:一个连接过来再内核中就会创建个线程,通过fd文件描述符来进行读写。

Non-blocking I/O(NIO)

同步非阻塞的I/O模型,当用户线程发起一个IO请求操作,内核会去查看要读取的数据是否就绪,对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪。当数据就绪之后,便将数据拷贝到用户线程,这样才完成了一个完整的IO读请求操作。
NIO也是epoll的基础,服务器实现模式为一个线程处理多个请求(连接),就是客户端发送的连接请求都会注册到多路复用器上,多路复用器轮训到连接有I/O请求就进行处理。
缺点:每次调用都需要把fd集合从用户态拷贝到内核态,用户态和内核态切换,fd数据不断传递,这个开销很多时会很大

redis epoll

为了解决nio中用户态和内核态切换,fd数据不断传递问题,epoll采用了内存映射mmap,共享空间来解决。
共享空间里创建的红黑树保存所有socket fd,没有大小限制,且增删查的复杂度O(logN),创建双线链表存储就绪事件,时间复杂度O(1)。

为什么epoll快?

这是由于我们在调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点,在共享空间里建了个红黑树用于存储以后epoll_ctl传来的socket外,还会再建立一个链表,用于存储准备就绪的事件,当epoll_wait调用时,仅仅观察这个链表里有没有数据即可。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。所以非常高效。

就绪链表怎么维护?

当我们执行epoll_ctl时,除了把socket放到epoll文件系统里file对象对应的红黑树上之外,还会给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。所以,当一个socket上有数据到了,内核在把网卡上的数据copy到内核中后就来把socket插入到准备就绪链表里了。(注:好好理解这句话!)
从上面这句可以看出,epoll的基础就是回调呀!

如此,一颗红黑树,一张准备就绪句柄链表,少量的内核共享空间,就帮我们解决了大并发下的socket处理问题。

  1. 执行epoll_create时,创建了红黑树和就绪链表,
  2. 执行epoll_ctl时,如果增加socket句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,用于当中断事件来临时向准备就绪链表中插入数据。
  3. 执行epoll_wait时立刻返回准备就绪链表里的数据即可。

epoll_create:创建一个epoll文件描述符,创建eventpoll,其中包含红黑树cache和双向链表
epollctl:对指定描述符fd执行op的绑定操作,把fd写入红黑树,同时在内核注册回调函数
epollwait:获取epfd上的io事件

简单理解redis epoll运行原理相关推荐

  1. 理解PHP网页运行原理

    理解php网页运行原理: 浏览器〉输入网址〉找到对应服务器 〉apache提供服务开始 -->如果是html文件〉从文件夹中拿出文件 > 发出去(经过互联网)给浏览器 -->如果是p ...

  2. 十个问题理解Linux epoll工作原理

    作者:dustinzhou,腾讯 IEG 运营开发工程师 epoll 是 linux 特有的一个 I/O 事件通知机制.很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣.近期学习 ...

  3. 十个问题理解Linux epoll工作原理:惊群,

    目录 Question 1:是否所有的文件类型都可以被 epoll 监视?不是 Question 2:ep->wq 的作用是什么? Question 3:什么是 epoll 惊群? Questi ...

  4. 一文理解 Redis 的核心原理与技术

    文章作者:何永康,腾讯 CSIG 后台研发工程师. 一.Redis 基础数据结构 1. String Redis 里的字符串是动态字符串,会根据实际情况动态调整.类似于 Go 里面的切片-slice, ...

  5. redis缓存运行原理

    首先添加pom.xml文件所需的依赖, 接着就是application.properties,这里使用的是yum格式的配置文件. 然后就可以使用redis进行缓存,一般是通过key值来做值进行缓存.

  6. 3分钟通过一个App的演示深入理解区块链运行原理

    作者:黎跃春,资深讲师,全栈工程师:专注于「区块链+内容」产品的开发以及区块链技术培训. 公众号:区块链部落 QQ群:348924182 微信:liyc1215 区块链技术部落阁:http://liy ...

  7. 通过一个App Demo的演示深入理解区块链运行原理

    什么是区块链? 从字面上看:区块链是由一个个记录着各种信息的小区块链接起来组成的一个链条,类似于我们将一块块砖头叠起来,而且叠起来后是没办法拆掉的,每个砖头上面还写着各种信息,包括:谁叠的,什么时候叠 ...

  8. 入门启发:音视频的简单理解

    算机技术领域中,『音视频技术』应该说算是较复杂的小门类.较复杂的东西有个简单的入门指引,或者有前辈带路是很重要的. 前阵子,因为项目中急需音视频技术,虽然网上资料看似很丰富,但对初学者来说,很多资料都 ...

  9. 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld...

    <深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...

最新文章

  1. Android LayoutInflater详解(转)
  2. Git『Everything up-to-date』问题解决
  3. Tomcat下项目调整Log4J的console输出级别,减少输出信息
  4. 解决执行 df -h 卡住,yum和rpm都无法安装软件问题
  5. 字符设备驱动基础篇1——简单的驱动源码分析
  6. JavaScript 模块化编程(二):AMD规范
  7. hihocoder1033交错和
  8. Object类的用法(二)
  9. CentOS7安装PostgreSQL10,pgadmin4
  10. python把字典转换成json字符串
  11. STL中的所有算法(70个)
  12. 最简单的P2P加密聊天软件开发完成
  13. Python-打印乘法口诀表
  14. ogg 登录mysql报字符集_GOLDENGATE ORACLE TO MYSQL 字符集出错
  15. TabLayout的指示器和文字的边距
  16. 用JS获得QQ号码的昵称,头像,生日
  17. Syncfusion Essential Studio Enterprise 2023.1 Crack
  18. 搭建微服务架构的电商平台系统
  19. JanusGraph服务器
  20. 赠书五本《数据分析咖哥十话》

热门文章

  1. encodeURI之URL中文参数问题
  2. 使用filter过滤器实现简单用户登录验证(不用配置web.xml文件)
  3. FSCapture 取色工具(绿色版 )
  4. NAT(网路地址转换)
  5. Python爬虫脚本,利用Beautifulfly爬取动态网页网页(源码)
  6. Form表单实现异步的提交
  7. BlackBerry签名申请与安装介绍
  8. int2 int4 int8
  9. JAVA概述(枚举实例以及应用)
  10. TemplateInputException: Error resolving template 无法解析页面原因记录