IO 多路复用是什么意思?Redis中的IO又是什么?

news2024/11/26 8:49:30

点击上方关注 “终端研发部

设为“星标”,和你一起掌握更多数据库知识

本文首发于我的知乎:https://zhuanlan.zhihu.com/p/632776455

当你打开电脑,任何时候都在进行着IO的操作!

比如一次 API 接口调用、向磁盘写入日志信息,其实就是在跟 I/O 打交道。

一次 IO 操作分为等待资源、使用资源两个阶段,以下分别进行介绍。

先补充一下什么是阻塞与非阻塞 和同步与异步

  1. 同步阻塞IO(Blocking IO):即传统的IO模型

  2. 同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。在Java领域,也称为New I/O

  3. IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型

  4. 异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO

具体展开来讲一下:

阻塞与非阻塞 I/O

阻塞与非阻塞 I/O 是对于操作系统内核而言的,发生在等待资源阶段,根据发起 I/O 请求是否阻塞来判断。

阻塞 I/O:这种模式下一个用户进程在发起一个 I/O 操作之后,只有收到响应或者超时才可进行处理其它事情,否则 I/O 将会一直阻塞。以读取磁盘上的一段文件为例,系统内核在完成磁盘寻道、读取数据、复制数据到内存中之后,这个调用才算完成。阻塞的这段时间对 CPU 资源是浪费的。

76c4eb1b8146721f925d67c9f3d18034.gif

非阻塞 I/O:这种模式下一个用户进程发起一个 I/O 操作之后,如果数据没有就绪,会立刻返回(标志数据资源不可用),此时 CPU 时间片可以用来做一些其它事情。

771d0d9ee42be90e002c21222947a945.gif


同步与异步 I/O

同步与异步 I/O 发生在使用资源阶段,根据实际 I/O 操作来判断。

同步 I/O:应用发送或接收数据后,如果不返回,继续等待(此处发生阻塞),直到数据成功或失败返回。

异步 I/O:应用发送或接收数据后立刻返回,数据写入 OS 缓存,由 OS 完成数据发送或接收,并返回成功或失败的信息给应用。Node.js 就是典型的异步编程例子。

什么是IO多路复用

IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路是指网络连接,复用指的是同一个线程

1dfa6f33cc6023f4c6579e448bd11df3.png

IO多路复用使用的模型

  1. select模型

  2. poll模型

  3. epoll

具体展开来讲一下

select模型

select模型是最古老的IO多路复用机制之一,使用fd_set数据结构来保存文件描述符集合,并提供了select()函数来等待文件描述符的就绪状态。它有一个限制,即所监视的文件描述符数量有一个上限,通常是1024。

5fc65f1b4534f5f6ec2b31745c34b315.png

每次调用select()时,都需要将整个文件描述符集合从用户空间复制到内核空间,这可能带来性能问题。

poll模型

是对select的改进,它使用pollfd结构体数组来保存文件描述符和事件信息,并提供了poll()函数来等待文件描述符的就绪状态。相对于select,poll没有文件描述符数量的限制,因为它使用动态分配的数组来保存文件描述符信息。

f566c27243113ce2dab04818ea642f24.png

但与select类似,每次调用poll()时,也需要将整个结构体数组从用户空间复制到内核空间。

epoll模型

是Linux特有的IO多路复用机制,自从2.5.44内核版本引入后成为主流。它使用基于事件的方式来管理文件描述符,使用一个事件表(event table)来保存文件描述符和事件信息,并提供了epoll_create()、epoll_ctl()和epoll_wait()等函数来操作事件表。

765ba94f6e337439310be9a137558914.png

相对于select和poll,epoll具有更好的性能,因为它采用了事件驱动的方式,不需要在每次调用时复制整个事件表。

PS:很多文章在谈论到BIO、NIO、AIO的时候仅仅是抛出一堆定义,以及一些生动的例子。看似很好理解。但是并没有将最基础的本质原理显现出来,如果没有没有从IO的原理出发的话是很难理解这三者之间的区别的。所以本篇文章从Java是如何进行IO操作为开头进行分析。

终端研发部:这是我看过对bio,nio,aio解释的最透彻的文章!!!151 赞同 · 6 评论文章003f607f066de866a24dddeeea33caf0.png

IO多路复用解决的问题

阻塞与非阻塞

解决接收数据前的耗时问题

  1. 客户端向服务端发起请求,建立连接

  2. 双方会收发数据,但是如果一方没有成功发送数据,另一方的线程就会阻塞。

  3. 采用select()等多路复用模式,集中到一个线程去监听多个连接上对方的数据是否准备完毕,

  4. 如果select收到对方线程准备发送数据的信号,就会通知用户进程调用recv方法去接收连接上输送的数据

  5. recv本身也可长期监听连接对方的数据是否有发送,但是recv的资源开销比较大只能一对一监听,select多路复用开销小,可以一对多监听

d0d6069191661e4db1fd50f9d346433a.png

同步与异步

解决接收数据时的耗时问题

IO多路复用可以在一定程度上解决阻塞IO和同步IO的问题。通过使用IO多路复用,程序可以同时监视多个IO流,而不会阻塞在单个IO操作上。当某个IO流就绪时,程序可以立即进行处理,而不需要等待其他IO操作的完成。通过将IO流设置为非阻塞模式,程序可以立即返回并继续执行其他任务,而不必等待IO操作的完成。

多路复用的优点

多路复用可以在一个连接上同时处理多个请求响应,这样可以大大的减少连接的数量,并提高了网络的处理能力。

由于是共享连接不同请求响应数据包可以合并到一个IO上处理,这样可以大大降低IO的处理量,让性能表现得更出色。

多路复用的基本原则,就是尽量减少因IO读取而造成的频繁系统调用。所谓多路复用,是指通过一次系统调用,获得IO状态,获取到IO状态之后,由APP自己对符合状态的IO进行读写操作。

无论是BIO,NIO还是多路复用,都是同步IO模型,其中BIO是同步阻塞模型,NIO和多路复用是同步非阻塞模型。

补充:

redis的网咯IO

Redis 使用 epoll 作为 I/O 多路复用技术的实现;Redis 自身的事件处理模型将 epoll 中的连接、读写、关闭都转为时间,从而避免了在网络 I/O 上时间的浪费。

513e817baa6b276527ffd28c89cde56e.png

避免了线程切换和竞态产生的消耗。

影响Redis耗时的操作

  1. 对bigkey的写入删除操作;

  2. sql语句复杂(Redis使用的是同步IO,高并发时此处会阻塞主线程,6.0后使用多线程机制执行sql语句);

  3. 同时删除大量key;

  4. AOF设置为高频率写入磁盘;

  5. 不合理的key淘汰机制(内存满了后要先删除部分旧的key才能写入新的key,高版本Redis优化后采用了异步线程来执行淘汰)。

Redis 6.0多线程模型思想上类似单reactor多线程和多reactor多线程,但不完全一样,这两者handler对于逻辑处理这一块都是使用线程池,而redis命令执行依旧保持单线程。如下:

caa565dfd346cf13441435adc9dbf691.png

Redis的优化

Redis 基于的底层 I/O 多路复用库有多套。包括select、epoll、evport和kqueue等。

每个IO多路复用函数库在 Redis 源码中都对应一个单独的文件,比如ae_select.c,ae_epoll.c, ae_kqueue.c等。调用 epoll 机制,让内核监听这些套接字。Redis 线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。

正因为此,Redis 可以同时和多个客户端连接并处理请求,从而提升并发性。

补充:

BIO、NIO、AIO适用场景分析:

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

我是程序员小于哥

@终端研发部

每天专注于Java面试,技术编程技巧,互联网科技的分享,关注我职场技术不迷路,笔芯哦~

如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。

b9939b17232d2777d95c2117f11df3e6.jpeg

回复 【idea激活】即可获得idea的激活方式

回复 【Java】获取java相关的视频教程和资料

回复 【SpringCloud】获取SpringCloud相关多的学习资料

回复 【python】获取全套0基础Python知识手册

回复 【2020】获取2020java相关面试题教程

回复 【加群】即可加入终端研发部相关的技术交流群

用 Spring 的 BeanUtils 前,建议你先了解这几个坑!

lazy-mock ,一个生成后端模拟数据的懒人工具

在华为鸿蒙 OS 上尝鲜,我的第一个“hello world”,起飞!

字节跳动一面:i++ 是线程安全的吗?

一条 SQL 引发的事故,同事直接被开除!!

太扎心!排查阿里云 ECS 的 CPU 居然达100%

一款vue编写的功能强大的swagger-ui,有点秀(附开源地址)

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!

a551c90b6bc97ded0879e22ca890375d.png

0fddd33addbfccfd978c3cbc023428b4.gif

喜欢就给个“在看b1a8424436dd532e486420b4ffa5e213.gif 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据结构习题]栈——中心对称链

[数据结构习题]栈——中心对称链 👉知识点导航💎:【数据结构】栈和队列 👉[王道数据结构]习题导航💎: p a g e 70.4 page70.4 page70.4 本节为栈和链表综合练习题 题目描述: 🎇思路…

Semaphore线程信号量

文章目录 前言一、Semaphore 是什么?定义对比 二、使用步骤1. 场景分析2. 编码如下 总结 前言 Semaphore 也是juc中的一个关键类,他与之前的lock 类似,也有公平和非公平两种,它与他们应用含义,引用场景有很大的不同; 与阻塞队列类似,但是也不一样;听我细细道来~ 一…

MTK capture 拍照流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、多帧拍照请求概览二、多帧拍照回帧概览 一、多帧拍照请求概览 多帧拍照请求概览如下: 多帧拍照请求 1.1 APP 下发拍照请求到 Camera Fr…

新Linux服务器安装Java环境[JDK、Tomcat、MySQL、Nacos、Redis、Nginx]

文章目录 JDK服务Tomcat服务MySQL服务Nacos服务Redis服务Nginx服务 说明:本文不使用宝塔安装 温馨提示宝塔安装命令:yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh JDK服务…

vitepress从0到1,让每个前后端小伙伴都拥有一个属于自己的博客

📸前言 之前周一的个人博客是用vuepress来搭建,但随着文章的数量越来越多,导致每回在启动的时候构建都特别慢,于是周一有了改构建工具的想法。这不,vitepress工具自发布后,在技术圈内一直有些火热&#xf…

数据库新闻速递 亚马逊Cosmos DB 添加了AI toolchain (译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

chatgpt赋能python:如何将Python代码打包成软件

如何将Python代码打包成软件 Python是一种直译式、交互式、面向对象的高级编程语言。由于其简洁明了的语法,Python在科学计算、Web开发、人工智能等领域得到了广泛的应用。但是,Python程序通常需要运行在特定的环境中,这限制了Python程序的移…

NodeJs之同源限制问题

1. 说明 app1是基于3001端口的服务器, app2是基于3002端口的服务器。 gitee地址:https://gitee.com/studyCodingEx/studys/ 2. app1 2.0 app1.js const express require(express); const path require(path); // 向其他服务器端请求数据的模块 const request …

Linux常用命令——gunzip命令

在线Linux命令查询工具 gunzip 用来解压缩文件 补充说明 gunzip命令用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或…

NodeJs之模板引擎及综合案例

0. 数据源 ./views/addtional.art {{ if age > 18 }}age > 18; {{ else if age < 15 }}age < 15; {{ else }}age!!!!!!!! {{/if}}<% if(age > 18){ %> 年龄大于18岁 <% } else if(age < 15) { %> 年龄小于15岁 <% } else { %> 其他年龄段…

Linux驱动开发(I2C系统的重要结构体)

文章目录 前言一、I2C硬件框架二、i2c_adapter三、i2c_client四、i2c_msg总结 前言 本篇文章来讲解I2C系统的重要结构体&#xff0c;了解这些结构体对于编写I2C驱动来说是至关重要的&#xff0c;所以要想编写好一个I2C驱动程序那么就必须先了解这些结构体。 一、I2C硬件框架 …

图片识别工具Tesseract与使用

Tesseract工具是一个图片识别工具&#xff0c; 由HP实验室开发 由Google维护的开源的光学字符识别&#xff08;OCR&#xff09;引擎。它可以直接使用&#xff0c;或者&#xff08;对于程序员&#xff09;使用 API​​ 从图像中提取输入&#xff0c;包括手写的或打印的文本。与M…

KCC@上海正式成立啦!

5月28号下午&#xff0c;开源社区的朋友共聚于上海的一间茶室中&#xff0c;组织召开了 KCC上海第一次线下见面会&#xff0c;并正式成立了 KCC上海。 KCC&#xff08;KAIYUANSHE City Community&#xff09;是由开源社理事兼执行长庄表伟老师号召发起&#xff0c;旨在让开源社…

关于职场中的面试,要是遇到这些问题时,应该怎么回

(点击即可收听) 关于职场中的面试,要是遇到这些问题时,应该怎么回 平常多学一点,面试入职时就少踩一点坑,无论是去面试还是换工作,怎么样去回答面试官,遇到此类的问题,能够应付自如 1. 你觉得这份工作你能胜任? 首先,无论你在面试过程当中表现怎么样,一定要非常坚定,一定可以 …

让身份验证更简单:OAuth2基于令牌方式为第三方应用提供认证和授权方案

随着互联网应用的发展&#xff0c;跨系统身份认证解决方案也在不断演化和改进。下面是它的发展史&#xff1a; 早期的 Web 应用程序使用基于表单的身份验证方式&#xff1b;随着 Web 应用程序数量的增加&#xff0c;需求跨应用程序身份验证的呼声也越来越高&#xff0c;从而出…

行胜于言

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 最近在给我女儿辅导作业的过程中&#xff0c;发现了许多小问题&#xff0c;自己偶尔也会因此而焦躁&#xff0c;同时也在反思作为父母应该更好的帮助孩子成长&#xff0c;而AI能力的增强和孩子的成长有什么相似…

【Python】Python系列教程--Python3 VScode(三)

文章目录 前言安装 VS Code 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09; 准备工作&#xff1a; 安装 VS Code安装 VS Code Python 扩展安装 Python 3 安装 VS Code VS…

Maven仓库(本地仓库+远程仓库)

在 Maven 中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称为构件。 Maven 在某个统一的位置存储所有项目的构件&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。换言之&#xff0c;仓库就是存放依赖和插件的地方。 任何的构件都有唯一的坐标…

VUE代码批量格式化

1、下载安装Visual Studio Code 2、安装插件 Vetur和Format Files 3、配置格式化&#xff0c;点击右下角设置 4、自定义格式化规则 复制下面的配置信息&#xff0c;覆盖原始配置&#xff0c;保存配置。 {"vetur.format.defaultFormatter.html": "js-beauti…

MySQL数据库 6.DDL操作 表

目录 &#x1f914;前景知识&#xff1a; 数据类型&#xff1a; 1. 数值类型 2. 字符串类型 3. 日期时间类型 &#x1f914;DDL操作表&#xff1a; 1.创建 示例&#xff1a;尝试创建把以下实例创建到表里 2.查询 1.查询当前数据库的所有表&#xff1a; &#x1f50…