码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 3. 传统IO数据拷贝、同步阻塞IO在哪里阻塞、同步阻塞IO怎么解决、IO多路复用、多路复用的特点、常见多路复用方案


    3. 传统IO数据拷贝、同步阻塞IO在哪里阻塞、同步阻塞IO怎么解决、IO多路复用、多路复用的特点、常见多路复用方案

    • 传统IO数据拷贝
    • 同步阻塞IO在哪里阻塞
      • 同步阻塞IO怎么解决呢?
    • IO多路复用 multiplexing
    • 多路复用的特点
    • 常见多路复用方案
    • 相关联

    阅读顺序
    1. CPU查找物理寻址和虚拟寻址、虚拟内存优点、不同位数的操作系统虚拟内存大小关系、Linux虚拟内存用户空间和内核空间
    2. 进程切换、上下文及上下文切换、进程阻塞、文件描述符
    3. 传统IO数据拷贝、同步阻塞IO在哪里阻塞、同步阻塞IO怎么解决、IO多路复用、多路复用的特点、常见多路复用方案

    传统IO数据拷贝

    请添加图片描述
    比如一个Redis的读取操作,Redis的进程是在用户空间的,用户空间会通过系统调用去读取FD(文件描述符),通过系统调用比如通过 read/write去操作文件描述符 读取/写入数据,如果说这块文件的数据已经在用户空间缓存了,那就可以直接读到,如果数据是不存在的,那必须要先从磁盘硬件设备加载数据到内核的缓冲区里面,再从内核缓冲区复制数据到用户的缓冲区,那么在这个过程中,就发生了多次的数据拷贝,和上下文的切换

    同步阻塞IO在哪里阻塞

    请添加图片描述
    当通过系统调用比如通过 read/write去操作文件描述符 读取/写入数据,但这个文件描述符当前是不可读的,那么系统不会直接给响应,也就是说,阻塞的地方是两个过程:

    • ①从磁盘硬件设备加载数据到内核的缓冲区里面这个过程是阻塞的
    • ②从内核缓冲区复制数据到用户的缓冲区这个过程也是阻塞的

    直到从内核空间复制数据完毕,才会返回结果给到用户空间,然后阻塞的状态才会解除

    同步阻塞IO怎么解决呢?

    思路1:多线程处理阻塞的过程
    在服务端(内核空间)使用线程池去创建多个线程来处理阻塞的两个过程
    ①从磁盘硬件设备加载数据到内核的缓冲区里面
    ②从内核缓冲区复制数据到用户的缓冲区

    可以使用多线程,但不是一个很好的方案。
    如果并发比较大,就会需要创建很多线程,导致线程数很大,可能造成系统不能够承受,而且线程数太多,创建线程和释放线程会比较消耗资源。

    思路2:阻塞会造成用户空间傻等,让他不再傻等
    用户空间不再傻等,而是轮询问内核空间有没有准备好,直到准备好之后返回数据,轮询的这种方式就叫做非阻塞IO了,因为不需要客户端(用户空间)一直等待。
    这种方案,实时性不高,取决于轮询间隔,间隔大了,读取到的时间差就会很大,间隔太小,对于客户端(用户空间)也比较消耗性能。

    所以服务端有没有更好的解决方案: 服务端就用一个线程,去处理多个客户端的请求呢?可以,IO多路复用 multiplexing。

    IO多路复用 multiplexing

    请添加图片描述
    I/O: 指网络I/O
    多路: 多个TCP连接(Socket或Channel,可以理解为多个客户端的连接)
    复用: 复用服务端的一个或多个线程

    设计思想是: 在服务端由内核去帮助应用程序去监视 FD(文件描述符) 是否就绪(数据有没有准备好),不再由客户端监视连接,由服务端去监视连接。

    它是怎么做的呢?
    在客户端操作的时候会有一个Socket,这个Socket是由事件类型的,服务端会有一个程序,IO多路复用器(或者叫IO多路复用程序)会将这些Socket的请求放入一个队列中,然后通过文件时间分派器转发到不同的事件处理器(如命令请求处理器、命令回复处理器等)。

    多路复用是需要操作系统支持的,不同的操作系统有不同的实现。

    多路复用的特点

    请添加图片描述
    通过一种机制,一个进程能同时等待多个 FD(文件描述符) ,而这些 FD(文件描述符) 其中的任意一个进入读就绪(readable)状态,select()函数就可以返回,不需要你去做轮询。

    常见多路复用方案

    • evport是Solaris系统内核提供支持的
    • epoll是Linux系统内核提供支持的
    • kqueue是Mac系统内核提供支持的
    • select是POSIX提供的,一般的操作系统都有支撑(是一个保底方案,性能不如其它方案,基本上不会再使用)。

    不同的多路复用的方案有各自的特点,epoll用的是最多的(以Redis的多路复用方案为例,源码ae.c定义epoll优先级最高,kqueue次之,保底是select)。

    Redis多路复用
    Redis源码:Redis源码怎么查看入门、Redis外部数据结构到Redis内部数据结构查看源码顺序、Redis源码查看顺序
    Redis多路复用方案定义在ae.c文件
    ae.c源码文件在解压后的src目录下
    在这里插入图片描述

    /* Include the best multiplexing layer supported by this system. 包含该系统支持的最佳多路复用层
     * The following should be ordered by performances, descending. 以下应按顺序依次递减*/
    /*epoll优先级最高,kqueue次之,保底是select*/
    #ifdef HAVE_EVPORT
    #include "ae_evport.c"
    #else
        #ifdef HAVE_EPOLL
        #include "ae_epoll.c"
        #else
            #ifdef HAVE_KQUEUE
            #include "ae_kqueue.c"
            #else
            #include "ae_select.c"
            #endif
        #endif
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    相关联

    • 1. CPU查找物理寻址和虚拟寻址、虚拟内存优点、不同位数的操作系统虚拟内存大小关系、Linux虚拟内存用户空间和内核空间
    • 2. 进程切换、上下文及上下文切换、进程阻塞、文件描述符
    • 3. 传统IO数据拷贝、同步阻塞IO在哪里阻塞、同步阻塞IO怎么解决、IO多路复用、多路复用的特点、常见多路复用方案
  • 相关阅读:
    python列表
    Java ArrayList与顺序表
    Android改造CardView为圆形View,Kotlin
    无需公网IP教你如何外网远程访问管家婆ERP进销存
    Go语言strconv包
    机器人课程教师面对的困境有哪些(补充)
    Oracle Users表空间重命名
    浅谈双指针技巧(三)利用快慢指针,查找链表中指定位置节点
    【UML用户指南】-16-对高级结构建模-构件
    C#:计算汉明距离算法​(附完整源码)
  • 原文地址:https://blog.csdn.net/qq_41929714/article/details/127384110
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号