当前位置: 首页 > news >正文

React18原理: Fiber架构下的单线程CPU调度策略

概述

  • React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略
  • CPU现在都是多核多进程的,重点研究的是
    • CPU是单核单线程,它是如何调度的?
    • 为什么要去研究单线程的CPU?
  • 浏览器中的JS它是单线程的
  • JS 的执行线程和浏览器的渲染GUI 是互斥的
  • 渲染和JS的执行都用同一个线程,因为一次只能做一件事情,所以互斥
  • 所以,React整个架构的整个调度都是去参考 CPU 的

单线程CPU调度策略


单处理器进程调度策略

  • 1 ) 先到先得(First-Come-First-Served,FCFS)

    • 可以把 CPU 理解为一个办事窗口, 比如说排队,有的人办的慢,有的人办的快
    • 比如,有人办事只需要一分钟,有的人却很墨迹,办事要半个小时
    • 办事墨迹的人,后面的人都一直在等着,所以这个先到先得的策略
    • 对于CPU来讲,其实就是不合理的,不能谁先来就先执行
    • 因为有的人比较着急(优先级高),放在后面不适合
    • 这是最简单的调度策略,简单说就是没有调度,谁先来谁就先执行
    • 执行完毕后就执行下一个,不过如果中间某些进程因为I/O阻塞了
    • 这些进程可能会重新排队了,需要留意的事:
    • FCFS对短进程不利
      • 短进程即执行时间非常短的进程
      • 可以用饭堂排队来比喻:
        • 在饭堂排队打饭的时候,一个人打包好几份
        • 这些人就像长进程一样,霸占着CPU资源
        • 后面排队只打一份的人会觉得很吃亏
        • 打一份的人会觉得它们优先级应该更高,毕竟它们花的时间很短
        • 反正你打包那么多份再等一会也是可以的,何必让后面那么多人等这么久…
    • FCFS对I/0密集不利
      • I/O密集型进程(这里特指同步I/O)在进行I/O操作时
      • 会阻塞休眠,这会导致进程重新被放入就绪队列,等待下一次
      • 可以类比银行部门办业务:假设CPU一个窗口、I/O一个窗口
      • 在CPU窗口好不容易排到你了,这时候发现一个不符合条件或者漏办了
      • 需要去 I/O 搞一下,要去I/O窗口排队,I/O执行完了
      • 到CPU窗口又得重新排队,这样,似乎也是不合理的
    • 所以FCFS这种原始的策略在单处理器进程调度中并不受欢迎

  • 2 )轮转调度

    • 轮转调度它是基于时钟的一种抢占策略
    • CPU的时钟其实就是根据它的这个帧幅周期
    • 这个就跟吃大锅饭一样,也没有体现一种权重
    • 最后, 比如说有人有急事,那这个时候搞轮转,也是不合适的
    • 它属于抢占策略中最简单的一种:
      • 公平地给每一个进程一定的执行时间,当时间消耗完毕或阻塞
      • 操作系统就会调度其他进程,将执行权抢占过来
    • 决策模式:
      • 抢占策略相对应的有非抢占策略
      • 非抢占策略指的是让进程运行直到结束、阻塞(如I/O或睡眠)
      • 或者主动让出控制权,抢占策略支持中断正在运行的进程
      • 将主动权掌握在操作系统这里,不过通常开销会比较大
    • 这种调度策略的要点是
      • 确定合适的时间片长度:太长了,长进程霸占太久资源
      • 其他进程会得不到响应(等待执行时间过长)
      • 这时候就跟上述的FCFS没什么区别了
      • 太短了也不好,因为进程抢占和切换都是需要成本的
      • 而且成本不低,时间片太短,时间可能都浪费在上下文切换上了
      • 导致进程干不了什么实事
    • 因此时间片的长度最好符合大部分进程完成一次典型交互所需的时间
    • 轮转策略非常容易理解,只不过确定时间片长度需要伤点脑筋
    • 另外和FCFS一样,轮转策略对I/O进程还是不公平

  • 3 )最短进程优先(Shortest Process Next,SPN)

    • 什么是短进程呢?
    • 短进程就跟排队一样,比如,我办事一分钟,我就是短进程
    • 你墨迹半个小时,你就是长进程
    • 所以,可以设计一种调度策略叫短进程优先
    • 如果说,我办的快,我就优先,那慢的一直在后面等着
    • 这样好像也有点不对劲,所以这个也有缺陷
    • 长进程就会饥饿,可能永远得不到响应,没法去执行, 所以,这个也不行
    • 上面说了先到先得策略对短进程不公平
    • 最短进程优先索性就让最短的进程优先执行
    • 也就是说:按照进程的预估执行时间对进程进行优先级排序
    • 先执行完短进程,后执行长进程,这是一种非抢占策略
    • 这样可以让短进程能得到较快的响应
    • 但怎么获取或者评估进程执行时间呢?
      • 一是让程序的提供者提供,这不太靠谱
      • 二是由操作系统来收集进程运行数据,并对它们进程统计分析
    • 例如最简单的是计算它们的平均运行时间
    • 不管怎么说都比上面两种策略要复杂一点
    • SPN的缺陷是:
      • 如果系统有大量的短进程,那么长进程可能会饥饿得不到响应
      • 另外因为它不是抢占性策略,尽管现在短进程可以得到更多的执行机会
      • 但是还是没有解决FCFS的问题:一旦长进程得到CPU资源
      • 得等它执行完,导致后面的进程得不到响应
  • 其他策略

    • 最短余(Shortest Remaining Time,SRT)
    • 最高响应比优先(HRRN)
    • 反馈法
    • 这里不再举例

前端框架解决上述问题的方向

  • 对于前端框架来说,解决这种问题有三个方向:
    • 1 )优化每个任务,让它有多快就多快。挤压CPU运算量
      • Vue 选择的是这一种,对于Vue来说,使用模板让它有了很多优化的空间
      • Vue使用依赖收集,基于Proxy来监听数据的变化,在get时收集依赖,在set时
      • 触发依赖渲染页面,配合响应式机制可以让Vue精确地进行节点更新
    • 2 )快速响应用户,让用户觉得够快,不能阻塞用户的交互(React分片)
      • React选择了这一种,一个任务,假如说要运行1秒钟
      • 那React通过分片之后,可能用了1.2秒,但是它却让你感觉很快
      • 实际上它的执行时间是没有降低的,但是它会让你感觉快
      • React 的 Reconcilatin 是 CPU 密集型的操作,它就相当于我们上面讲的
      • 长进程,所以初衷和进程调度一样,要让高优先级的进程或短进程优先运行
      • 不能让长进程长期霸占资源
    • 3 )尝试Worker多线程
      • 要保证状态和视图的一致性相当麻烦,这里不再赘述

React 不同模式的效果对比

1 )同步模式下的 React, 可以看到,阻塞比较严重

2 ) 异步 Concurrent 模式下的 React, 可以看到,非常流畅

React是怎么优化的

  • 为了给用户制造一种应用很快的假象,不能让一个程序长期霸占着资源
  • 可以将浏览器的渲染、布局、绘制、资源加载(例如HTML解析)、事件响应、脚本执行视作操作系统的进程
  • 需要通过某些调度策略合理地分配CPU资源,从而提高浏览器的用户响应速率,同时兼顾任务执行效率
  • 所以React通过Fiber架构,让 Reconcilation 过程变成可被中断
  • 适时地让出CPU执行权,让浏览器及时地响应用户的交互

相关文章:

React18原理: Fiber架构下的单线程CPU调度策略

概述 React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略CPU现在都是多核多进程的,重点研究的是 CPU是单核单线程,它是如何调度的?为什么要去研究单线程的CPU? 浏览器中的JS它是单线程的JS 的执行线程和浏览器的渲染GUI 是互斥…...

个人搜集的gstreamer学习链接

gstreamer资源: GStreamer: 官方英文官网 GStreamer C开发教程 (gstreamer安装包下载目录) GStreamer GitLab源码 gstreamer 插件列表) gstreamer官方文档: https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-languagec …...

Blazor Wasm Gitee 码云登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…...

Android 自定义BaseActivity

直接上代码: BaseActivity代码: package com.example.custom.activity;import android.annotation.SuppressLint; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Looper; impor…...

基于鲲鹏服务器的LNMP配置

基于鲲鹏服务器的LNMP配置 系统 Centos8 # cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core) 卸载已经存在的旧版本的安装包 # rpm -qa | grep php #查看已经安装的PHP旧版本# rpm -qa | grep php | xargs rpm -e #卸载已经安装的旧版,如果提示有…...

MIT-Missing Semester_Topic 6:Version Control (Git) 练习题

文章目录 练习一练习二练习三练习四练习五练习六练习七 练习一 若还没有 Git 的相关经验,阅读 Pro Git 的前几章或诸如 Learn Git Branching 的相关教程,并在学习的同时从 Git 的数据模型(data model)的角度思考各 Git 命令。 老师…...

OpenHarmony轻量级内核-LiteOS-M

OpenHarmony轻量级内核 思维导图 https://download.csdn.net/download/lanlingxueyu/88816723 概述 内核是一人操作系统的运算核心,决定着系统的性能和稳定性。它是基于硬件的第一层软件扩充,提供操作系统的基本功能,是操作系统工作的基础。它负责管理系统的进程、内存、…...

TCP 传输控制协议——详细

目录 1 TCP 1.1 TCP 最主要的特点 1.2 TCP 的连接 TCP 连接,IP 地址,套接字 1.3 可靠传输的工作原理 1.3.1 停止等待协议 (1)无差错情况 (2)出现差错 (3)确认丢失和确认迟到…...

ArcGIS学习(六)地理数据库

ArcGIS学习(六)地理数据库 上个任务我们讲了一个非常重要的知识点一一坐标系。这个任务我们带来另外一个很重要的知识点一一地理数据库。 地理数据库的内容相比于坐标系简单很多! 首先,先让我们来学习下地理数据库的理论。 ArcGIS 中的地理数据库(Geodatabase)是一个用…...

保研机试算法训练个人记录笔记(四)——哈希算法

目录 两数之和 字母异位词分组 最长连续序列 力扣热题100——哈希算法 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答…...

ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot

文章目录 ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot一、Code Copilot AI编程助手二、制作代码生成器2.1 定义生成器框架2.2 从现有代码提取代码模板三、进行代码优化ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot 一、Code Copilot AI编程助手 Code Copi…...

表单标记(html)

前言 发现input的type属性还是有挺多的,这里把一些常用的总结一下。 HTML 输入类型 (w3school.com.cn)https://www.w3school.com.cn/html/html_form_input_types.asp text-文本 文本输入,如果文字太长,超出的部分就不会显示。 定义供文本输入的单行…...

Linux文件和目录管理

目录基础 Linux操作系统以目录的方式来组织和管理系统中的所有文件。所谓的目录,就是将所有文件的说明信息采用树状结构组织起来。每个目录节点之下会有文件和子目录。 所有一切都从 ‘根’ 开始,用 ‘/’ 代表, 并且延伸到子目录。 bin:B…...

【go】gorm\xorm\ent事务处理

文章目录 1 gorm1.1 开启事务1.2 执行操作1.3 提交或回滚 2 xorm2.1 开启事务2.2 执行操作2.3 提交或回滚 3 ent3.1 开启事务3.2 执行操作3.3 提交或回滚 前言:本文介绍golang三种orm框架对数据库事务的操作 1 gorm Begin开启事务 tx *gorm.DB 1.1 开启事务 tx :…...

【数据分享】1929-2023年全球站点的逐月平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…...

IP地址详解

IP地址是互联网协议(Internet Protocol)用于标识并定位网络中主机(如计算机、服务器、路由器等)的一串数字。它是一个32位的二进制数,通常以四个数字(每个数字范围为0-255)的形式显示&#xff0…...

Python爬虫http基本原理#2

Python爬虫逆向系列(更新中):http://t.csdnimg.cn/5gvI3 HTTP 基本原理 在本节中,我们会详细了解 HTTP 的基本原理,了解在浏览器中敲入 URL 到获取网页内容之间发生了什么。了解了这些内容,有助于我们进一…...

Web Services 服务 是不是过时了?创建 Web Services 服务实例

Web Services 是不是过时了? 今天是兔年最后一天,先给大家拜个早年 。 昨天上午视频面试一家公司需要开发Web Services 服务,这个也没有什么,但还需要用 VB.net 开发。这个是多古老的语言了,让我想起来了 10年 前 写 …...

redis单线程还快的原因

1. 内存存储和高效数据结构: 内存存储: Redis将数据存储在内存中,因此可以实现非常高的读写速度,而无需频繁的磁盘I/O操作。 高效数据结构: Redis内置了丰富且高效的数据结构,如字符串、哈希表、列表、集合…...

【flutter】报错 cmdline-tools component is missing

在flutterSDK目录下,双击flutter_console.bat,调出命令行。 输入flutter doctor,如果第三个诊断为[x],报cmdline-tools component is missing错(我这已经修改好了,所以是勾了),那就可…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...