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

FreeRTOS 基础知识

这个基础知识也是非常重要的,那我们要学好 FreeRTOS,这些都是必不可少的。

那么就来看一下本节有哪些内容:
首先呢就是介绍一下什么是任务调度器。接着呢就是任务它拥有哪一些状态了。那这里的内容不多,但是呢都是非常重要的。

那么首先呢就先来看一下第一部分:什么是任务调度器。

1. 任务调度简介

调度器:就是使用相关的调度算法来决定当前需要执行的哪个任务。

那我们说了,我们 RTOS 会创建很多个任务,那这个任务同一时刻只能执行一个,那要执行哪一个呢?就由这个调度算法来决定选择哪一个任务来执行。

FreeRTOS 一共支持三种任务调度方式:

  1. 抢占式调度。主要是针对优先级不同的任务,每个任务都有一个优先级(我们创建每一个任务都会分配一个优先级给它),优先级高的任务可以抢占优先级低的任务,然后去执行。

那这里要注意:FreeRTOS 是优先级的数值越大,它的任务优先级就越大。

  1. 时间片调度。主要针对优先级相同的任务,当多个任务的优先级相同时(多个任务可以挂载在同一个优先级下),任务调度器就会在每一次系统时钟节拍到的时候切换任务。

就比如说我这里创建了 3 个任务 t1、t2、t3,他们优先级是相同的。它一开始会执行 t1,执行一个系统时钟节拍,一个时钟之后,它就会切换到 t2,执行一个时钟,接着切换到 t3,执行一个时钟,接着它又回到 t1 执行一个时钟,这样轮流的执行下去。

  1. 协程式调度。当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。

所以它的实时性其实相对来说是比较差的,这种方式呢它是比较适合以前的那些 mcu、ram 这些非常小的芯片,现在我们的 mcu 其实都比较强大,所以这种方式也慢慢的在被淘汰。
那这个调度方式呢大家只要简单的了解一下就行了。因为 FreeRTOS 他虽然现在还是支持的,但是官方已经明确表态了,他是不会再更新协程式调度这一方面的了,所以我们只需要大概了解一下。

这 3 大调度方式,FreeRTOS 都是支持的。

那我们介绍完这些了,我们主要就是来了解前两种。那么下面呢也给大家举了两个例子。

1.1 抢占式调度

首先我们来看一下抢占式调度。
在这里插入图片描述
那这里有这么一个图,纵坐标是优先级,横坐标是时间。

那这里有几个运行条件:

  1. 创建三个任务:Task1、Task2、Task3
  2. Task1、Task2、Task3的优先级分别为1、2、3

那这里大家注意:在FreeRTOS中任务设置的数值越大,优先级越高,所以TASK3的优先级最高。跟中断是不一样的,中断是数值越小,优先级越高。

那此时呢大家看这个图。我们怎么去描述它这么一个过程?我们看一下。
运行过程如下:

  1. 首先 Task1 在运行中,在这个过程中 Task2 就绪了,在抢占式调度器的作用下 Task2 会抢占 Task1 的运行,所以此时就会执行 Task2 了。
  • Task1 它是先在运行,因为 Task2 和 Task3 还没就绪,就是还没准备好。
  • Task2 的优先级是 2,是比 Task1 大的。
  1. Task2 运行过程中,Task3 就绪了,在抢占式调度器的作用下 Task3 会抢占 Task2 的运行,所以此时就会执行 Task3 了。
  2. Task3 运行过程中,Task3 阻塞了(系统延时或等待信号量等),此时就绪态中,优先级最高的任务 Task2 执行

按理来说,Task3 是最高优先级了。那 Task3 一直运行是不可能有低优先级的可以去抢占 Task3 的 CPU 使用权。
但是阻塞的时候,那最高优先级的任务进入阻塞了,那此时就要释放 CPU 的使用权给 Task2。所以大家注意了,当 Task1 被 Task2 抢占的时候,我们执行 Task2,那 Task1 就从运行态变成了就绪态;然后 Task2 它从运行态被抢占之后就变成了就绪态了,所以这两个目前它都是处于就绪态中,那这两个优先级谁最高,Task2 最高,所以当 Task3 被阻塞的时候,那此时优先级最高的任务就会执行,所以 Task2 它就会执行了。

  1. Task3 阻塞解除了(延时到了或者接收到信号量),此时 Task3 恢复到就绪态中,抢占 Task2 的运行,所以此时就会执行 Task3 了。

整个过程就是这样。

那我们这里来总结一下,抢占式有几个特点:

  1. 高优先级任务,优先执行
  2. 高优先级任务不停止,低优先级任务无法执行。

除非高优先级任务阻塞了,或者挂起了,那此时高优先级任务才会释放 CPU 的使用权给下面相对来说较高的优先级去执行。

  1. 被抢占的任务将会进入就绪态。

那这个是抢占式调度也比较清晰明了了。

1.2 时间片调度

接着再来看一下时间片调度。那什么是时间片,我们先来了解一下。

同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片。在 FreeRTOS 中,一个时间片就等于 SysTick (滴答定时器) 中断周期。

那大家这里要注意:这里指的可设置,式子是中断周期。他不是说你可以设置一个时间片,两个时间片,三个时间片,不是这样;他只能一个时间片。在 FreeRTOS 中就是这样的;在 ucos 中你可以设置两个,三个,是可以的,在 FreeRTOS 中它是不支持的。也就是说比如我有三个任务,Task1,Task2,Task3,我执行 Task1 一次只能执行一个时间片,你不能说我执行两个时间片。那这一个时间片的大小由滴答定时器的中断周期决定,所以可设置是指滴答定时器的中断周期。在我们代码中,我们一个时间片设置是 1ms,也就是说滴答定时器它是 1ms 中断一次。

那么接着再来看一下这么一个图,纵坐标是优先级,横坐标是时间。
在这里插入图片描述
同样的,运行条件:

  1. 创建三个任务:Task1、Task2、Task3
  2. Task1、Task2、Task3 的优先级均为1;即 3 个任务同等优先级

那此时呢是怎么运行的呀?运行过程如下:

  1. 首先 Task1 运行完一个时间片后,切换至 Task2 运行

Task1 它会运行一个时间片。

  1. 同样的,Task2 运行完一个时间片后,切换至 Task3 运行。

  2. Task3 运行过程中(还不到一个时间片),Task3 阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务 Task1

Task3 按道理说也是执行一个时间片,但是天有不测风云,Task3 突然来了一个阻塞,此时 Task3 可能执行了 0.5 个时间片,还不到一个呢,就进入阻塞态了。那咋整,Task3 一直等么?不是,Task3 就直接让出 CPU 的使用权回到 Task1 运行了。

  1. Task1 运行完一个时间片后,切换至Task2运行

那大家肯定有疑问了,那 Task3 只运行了 0.5 个,那还有 0.5 个去哪了?就丢掉了。大家注意,它是直接就丢掉了,我不要了,它直接运行 Task1、Task2,下次运行 Task3 的时候,它还是只给它一个时间片的时间,而不是给它 1.5 个,这里大家要注意。

所以我们可以总结一下:

  1. 同等优先级任务,轮流执行;时间片流转。

它都是一个时间片,除非说你运行了什么阻塞态,挂起态这些。

  1. 一个时间片大小,取决为滴答定时器中断周期

  2. 注意没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照一个时间片的时钟节拍运行。

  • 注意:任务中途被打断或阻塞,没有用完的时间片不会再使用,下次该任务得到执行还是按照一个时间片的时钟节拍运行。

比如说 Task3 只执行了 0.5 个,那还剩 0.5 个它不会再使用了,它直接就运行到 Task1 了。

那这些是时间片调度的一个说明。

2. 任务状态

那么接着就到这个任务状态。那任务究竟有哪些状态呢?我们来了解一下。

FreeRTOS 中任务总共存在 4 种状态:

  1. 运行态。正在执行的任务,该任务就处于运行态,注意在 STM32 中,同一时间仅一个任务处于运行态。

注意:RTOS 实际上同一时刻只有一个任务在运行,那这个运行的任务它就是处于运行态。

  1. 就绪态。如果该任务什么都准备好了,已经能够被执行,但当前还未被执行,那么该任务处于就绪态。

任务调度器选择执行优先级最高的就绪态。

  1. 阻塞态。如果一个任务因延时或等待外部事件(信号量/互斥量等)发生,那么这个任务就处于阻塞态

也就是说任务一直在等待某一个东西。

  1. 挂起态。类似暂停,把任务给暂停下来,此时任务就进入挂起态。调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数 vTaskResume() 才可以进入就绪态。

注意:你挂起了要解挂,解挂之后是回到就绪态,而不是解挂之后直接到运行态。(阻塞态同理)

接着呢我们就来看一下,这 4 个任务状态它们之间的转换图:
在这里插入图片描述
看一下这个图。那我们说过,运行态它就是正在执行的一个任务,那我们看一下其他三种状态,它可以直接变为运行态吗?大家注意没有,只有就绪态它是可以直接变为运行态。像挂起态,它只能由运行态变为挂起,而不能由挂起态变为运行;阻塞也是同样的,它不能由阻塞态变为运行态,而只能由运行变为阻塞。

所以大家如果想要运行怎么办?你就必须就绪,就你必须什么都准备好了,你才有机会去运行。

所以总结一下:

  1. 仅就绪态可转变成运行态

那那么多任务那个要执行啊。取决于:

  1. 必须就绪态。
  2. 优先级最高。

优先级高了又就绪了,那比如说当前这个运行态阻塞了,那就给这个优先级高的就绪态的任务去运行。或者说当前这个就绪的任务比这个正在运行的任务它的优先级还高,那此时就会抢占 CPU 让当前正在运行的任务进入就绪态,然后这个更高优先级的任务就进入运行态。

  1. 其他状态的任务想运行,必须先转变成就绪态(唯一的途径)
  • 挂起态,要进入就绪态,就是调用 vTaskResume() 这个函数解挂,解挂之后才能进入就绪态。
  • 阻塞态,要么就延时时间到了,要么就等待信号量接收到了,此时才能退出阻塞,进入就绪态。

那这是这四种任务状态之间的一个关系图,接着我们再来看一下任务状态列表

FreeRTOS 中无非就四种状态,运行态,就绪态、阻塞态、挂起态。这四种状态中,除了运行态,其他三种任务状态的任务都有其各自对应的任务状态列表 。

这里我们又引出了一个知识点:列表。那这个列表在 FreeRTOS 中可以说是无处不在的,非常重要,学习 FreeRTOS 这是必须要掌握的。那这个其实跟链表差不多,其实就是一个链子把任务都串起来,就形成了一个列表,其实列表和链表它们是大同小异的,差不多的一个概念。在这里我们只是简单的先来了解,在后面我们还有一个专门的一个列表专题,到时候会进行一个详细的介绍。

那么就来看一下这 3 种任务状态它们对应的一个列表:

  1. 就绪列表。pxReadyTasksLists[x](FreeRTOS 的一个源码复制出来的),其中 x 代表任务优先级数值。
  • 如果是用软件的方式,那这个范围是无限的;
  • 如果是用硬件的方式(如 STM32),那它的取值范围就是 0~31。

那在我们代码中,我们使用的是这种硬件的方式,比较高效。也就是说 x 取值范围就是 0~31。

任务调度器就在就绪列表中去搜寻,找到任务优先级最高的,然后去优先执行。

  1. 阻塞列表。pxDelayedTaskList

还有一个溢出阻塞,那这两个就形成一个闭环交叉,那这个在后面也会继续一个详细的介绍。这些只要大概知道就行了。

  1. 挂起列表。xSuspendedTaskList

当然在 FreeRTOS 中,它不单单只有这三种,还有其他一些列表,那么这里主要是分为三大类来进行大概的简单的一个介绍。

如果是就绪的任务,此时它就会把任务挂载到相应的就绪列表;如果是阻塞的任务,此时它就会把任务挂载到阻塞列表;如果是挂起的任务,此时它就会把任务挂载到挂起列表。这个列表的作用是非常大的,我们要从那么多的任务挑选一个来执行,就是通过列表来挑选的。

那我们来看一下,我们前面说了,我们的运行态就是正在运行的任务,它只能由就绪态直接变为运行态,而不能由 阻塞态/挂起态 变为运行态,所以反映到我们的列表中也是同样的道理,只有我们的任务挂载到就绪列表中,我们的任务才能被变为运行态,像挂载到阻塞列表、挂起列表是不行的,它们想要变成运行态必须先转成就绪,才有机会变成运行。所以说呢我们要挑选最高优先级任务去执行,也就是挑选任务变成运行态,从哪里挑选?从就绪列表去挑选最高优先级的任务,然后去执行,执行之后就变成运行态了。所以说我们这里说了,x 代表优先级数目就是 0~31,总共 32 个,所以我们初始化我们的列表的时候,我们的就绪列表它就有 32 个,我们初始化时它有 0~31 就 32 个。
在这里插入图片描述
那此时假设我创建 3 个任务,三个任务分别是 task1、task2、task3,它们的优先级分别是 31、30、29。那怎么挂载呢?那我们要注意我们新创建的任务,它是直接挂载到就绪列表中的,所以 task1 挂载到 31 这个位置,因为它的优先级是 31,所以 task1 在这里;task2 挂载到 30 这个位置;task3 挂载到 29 这个位置。那此时我们的任务调度器它就会在这个就绪列表中去搜寻了,搜寻哪一个任务它的优先级最大,那这里很明显 task1 最大,那此时他就会将 task1 转入运行态去运行了,就这么一个过程。

那大家肯定有疑问了,它怎么知道这个 31 里面有任务的?它这里会定义一个变量,32 位的一个变量,那这 32 位它分别对应就是 32 个就绪列表,当比如 31 这个列表有任务,它就会将这个 31 这个位给置 1,当没任务的时候,它就是 0,那此时就判断这个变量哪一个位是 1,就知道这个优先级的就绪列表里有没有任务。所以它就通过这 32 位的一个变量,当某个位置 1 就代表它所对应的那个优先级的就绪列表有任务存在,这样我就知道哪一个优先级最高。那这是它的就绪列表的搜寻。

接着,我们再举一个例子。那假设我们创建三个任务分别是:task1、task2、task3,优先级分别是:1、2、3,那很明显,task3 的优先级是最大的,它是最高优先级。
在这里插入图片描述
就绪列表,x 就是 0~31,所以初始化之后它是有 32 个列表了,但我们这里只画了三个,其实它还有很多的,只是我们这里只用到这 1、2、3,所以我们只画出了 1、2、3,其实其他都是有的,没画出来而已。

然后我们的 task3 它放在哪,它优先级是 3,放在 pxReadyTasksLists[3] 这里,task2、task1 同理。

那此时我们的任务调度器就会搜寻了,怎么搜寻啊?从上往下找,找你前面的那个变量的某一位有没有被置 1,像这里前面都没有任务的,肯定都是 0,直到走到这个 pxReadyTasksLists[3] 这里才会置 1,pxReadyTasksLists[2] 置 1,pxReadyTasksLists[1] 置 1,pxReadyTasksLists[0] 是 0,它这里没任务,只有前面三个有任务。

所以此时优先级最高是哪个,其实就是 pxReadyTasksLists[3] 这个,所以它会把 task3 转成运行态,所以 task3 它就会开始运行了。

那么 task2、task1 什么时候能运行,就当 task3 进入阻塞态或者挂起态,此时假如 task3 阻塞了,它就会把 task3 丢到阻塞列表里去了,那此时 pxReadyTasksLists[3] 里就没有了,那任务调度搜寻,从上往下找,因为 pxReadyTasksLists[3] 里没任务了,所以它是 0,所以此时 pxReadyTasksLists[2] 和 pxReadyTasksLists[1] 这两个是 1,pxReadyTasksLists[2] 的优先级更高,所以此时 task2 就会转成运行态。

同样的,假如 task2 还挂起啊,进入挂起列表,那 pxReadyTasksLists[2] 这里它又没了,那此时就绪列表里只有 task1 这一个了,pxReadyTasksLists[2] 这里也是 0,所以任务调度器只搜寻到 pxReadyTasksLists[1] 这里,所以只有 task1 它进入运行态。

除非说阻塞列表里阻塞的 task3 它恢复阻塞了,就是说它从阻塞状态给恢复出去了,比如它阻塞时间到了,它就会又重新回到就绪列表,那么此时任务调度器又搜寻,首先 pxReadyTasksLists[3] 这里它又变成 1 了,此时 task3 它就去抢占这个 task1 了。

整个过程其实就这样。所以说:调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。

那相信大家肯定还有疑问:如果task1、task2、task3,优先级均为1呢,那任务调度器怎么处理的?相同优先级的任务会连接在同一个就绪列表上,首先 task1、task2、task3 它都会挂载到 pxReadyTasksLists[1] 这个就绪列表 1 中。那此时怎么运行呢?首先 task1 它会先运行一个时间片的时间,接着切换到 task2,运行一个时间片,接着切换到 task3,运行一个时间片,就这样又回到 task1 了,这样轮流的执行,这个就是相同优先级的一个处理情况,当然要你前面没有更高优先级的任务才行,比如说前面这个 pxReadyTasksLists[3] 列表有个 task4,那很明显,从上往下找,肯定是先找到 pxReadyTasksLists[3] 这个,那肯定是 task4 进入运行态,这下面的都没得运行,都在就绪态这里等着,除非 task4 挂起或者阻塞,那下面就能得以进行,就是这样。

那这就是我们任务状态的一个介绍了。

3. 总结

总结一下上面所学习的一个内容。
在这里插入图片描述
调度器作用:调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。

相关文章:

FreeRTOS 基础知识

这个基础知识也是非常重要的,那我们要学好 FreeRTOS,这些都是必不可少的。 那么就来看一下本节有哪些内容: 首先呢就是介绍一下什么是任务调度器。接着呢就是任务它拥有哪一些状态了。那这里的内容不多,但是呢都是非常重要的。 …...

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料: (误人子弟)《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频:(成功) https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…...

在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改

文章目录 一、Object.freeze()方法来冻结对象,防止对象被修改1、基本使用2、冻结数组2.1、浅冻结2.1、深冻结 3、应用场景4、Vue中使用Object.freeze 二、Object.assign()方法或展开语法(...)来合并对象1、Object.assign()1.1、语法1.2、参数…...

池化、线性、激活函数层

一、池化层 池化运算是深度学习中常用的一种操作,它可以对输入的特征图进行降采样,从而减少特征图的尺寸和参数数量。 池化运算的主要目的是通过“收集”和“总结”输入特征图的信息来提取出主要特征,并且减少对细节的敏感性。在池化运算中…...

ES-极客学习第二部分ES 入门

基本概念 索引、文档、节点、分片和API json 文档 文档的元数据 需要通过Kibana导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览” 索引 kibana 管理ES索引 在系统中找到kibana配置文件(我这里是etc/kibana/kibana.yml) vim /…...

Nodejs软件安装​

Nodejs软件安装​ 一、简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 官网:http://nodejs.cn/api/ 我们关注于 node.js 的 npm 功能,NPM 是随同 NodeJS 一起安装的包管理工具,JavaScript-NPM,Java-Maven&…...

Photoshop 2024 (PS2024) v25 直装版 支持win/mac版

Photoshop 2024 提供了多种创意工具,如画笔、铅笔、涂鸦和渐变等,用户可以通过这些工具来创建独特和令人印象深刻的设计效果。增强的云同步:通过 Adobe Creative Cloud,用户可以方便地将他们的工作从一个设备无缝同步到另一个设备…...

ChatGPT绘画生成软件MidTool:智能艺术的新纪元

在人工智能的黄金时代,创新技术不断涌现,改变着我们的生活和工作方式。其中,ChatGPT绘画生成软件MidTool无疑是这一变革浪潮中的佼佼者。它不仅是一个软件,更是一位艺术家,一位智能助手,它的出现预示着智能…...

linux安装MySQL5.7(安装、开机自启、定时备份)

一、安装步骤 我喜欢安装在/usr/local/mysql目录下 #切换目录 cd /usr/local/ #下载文件 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz #解压文件 tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local …...

openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态

文章目录 openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态195.1 分析查询语句运行状态195.1.1 问题现象195.1.2 处理办法 openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态 195.1 分析查询语句运行状态…...

Oracle篇—实例中和name相关参数的区别和作用

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…...

python + selenium 初步实现数据驱动

如果在进行自动化测试的时候将测试数据写在代码中,若测试数据有变,不利于数据的修改和维护。但可以尝试通过将测试数据放到excel文档中来实现测试数据的管理。 示例:本次涉及的项目使用的12306 selenium 重构------三层架构 excel文件数据如…...

数字孪生+可视化技术 构建智慧新能源汽车充电站监管平台

前言 充电基础设施为电动汽车提供充换电服务,是重要的交通能源融合类基础设施。近年来,随着新能源汽车产业快速发展,我国充电基础设施持续增长,已建成世界上数量最多、服务范围最广、品种类型最全的充电基础设施体系。着眼未来新…...

微信小程序开发学习笔记《11》导航传参

微信小程序开发学习笔记《11》导航传参 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。导航传参 官方文档 一、声明式导航传参 navigator组件的url属性用来指定将要跳转到的页面的路径。同时,路径的后面还可以携带参数…...

BikeDNA(七)外在分析:OSM 与参考数据的比较1

BikeDNA(七)外在分析:OSM 与参考数据的比较1 该笔记本将提供的参考自行车基础设施数据集与同一区域的 OSM 数据进行所谓的外部质量评估进行比较。 为了运行这部分分析,必须有一个参考数据集可用于比较。 该分析基于将参考数据集…...

KY43 全排列

全排列板子 ti #include<bits/stdc.h>using namespace std;string s; map<string, int>mp;void swap(char &a, char &b){char em a;a b;b em; }void dfs(int n){ //将s[n~l]的全排列转化成s[n]s[n1~l]的全排列 if(n s.length()){mp[s] 1;return ;}f…...

UltraScale 和 UltraScale+ 生成已加密文件和已经过身份验证的文件

注释 &#xff1a;如需了解更多信息&#xff0c;请参阅《使用加密和身份验证确保 UltraScale/UltraScale FPGA 比特流的安全》 (XAPP1267)。 要生成加密比特流&#xff0c;请在 Vivado IDE 中打开已实现的设计。在主工具栏中&#xff0c;依次选择“Flow” → “Bitstream Setti…...

2023年全国职业院校技能大赛软件测试赛题—单元测试卷②

单元测试 一、任务要求 题目1&#xff1a;任意输入2个正整数值分别存入x、y中&#xff0c;据此完成下述分析&#xff1a;若x≤0或y≤0&#xff0c;则提示&#xff1a;“输入不符合要求。”&#xff1b;若2值相同&#xff0c;则提示“可以构建圆形或正方形”&#xff1b;若2<…...

极兔单号查快递,极兔快递单号查询,筛选出途经指定城市的单号

随着电商的繁荣&#xff0c;快递单号已经成为我们生活中的一部分。然而&#xff0c;面对海量的快递信息&#xff0c;如何快速、准确地筛选出我们需要的单号&#xff0c;变成了许多人的痛点。今天&#xff0c;我要为你介绍一款强大的工具——快递批量查询高手&#xff0c;让你的…...

[redis] redis高可用之持久化

一、Redis 高可用的相关知识 1.1 什么是高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;…...

云原生 微服务 restapi devops相关的一些概念说明(持续更新中)

云原生&#xff1a; 定义 云原生是一种构建和运行应用程序的方法&#xff0c;是一套技术体系和方法论。它是一种在云计算环境中构建、部署和管理现代应用程序的软件方法。云原生应用程序是基于微服务架构的&#xff0c;采用开源堆栈&#xff08;K8SDocker&#xff09;进行容器…...

初学unity学习七天,经验收获总结

初学unity七天&#xff0c;经验收获总结 学习就是认识新观念和新想法的过程。 假如人们始终以同一种思维方式来考虑问题的话&#xff0c;那么始终只会得到同样的结果。 因为我对你讲述的许多内容是你以前从未接触过的&#xff0c;所以我建议你&#xff0c;在你还没有做之前&…...

hcip实验2

根据地址分配完成基础配置 先配置r1,r2,r3的ospf以及与isp通讯&#xff1a; 配置缺省路由&#xff1a; 完成nat配置&#xff1a; 完成r5,r6,r7,r8,r15的mgre以及整个网络的ospf配置 mgre&#xff1a; area 2 和3之间用多进程双向重发布技术完成&#xff1a; area4和5之间用虚…...

js:使用canvas画一个半圆

背景 需求需要画一个半圆&#xff0c;或者多半圆&#xff0c;其实一下子就能想到 canvas 中的圆弧&#xff0c;核心使用 context.arc context.arc(x,y,r,sAngle,eAngle,counterclockwise)接下来我们看看示例 例一 <!DOCTYPE html> <html lang"en"> &…...

1.框架介绍项目环境配置与项目启动!

目录 1.框架开发方向:2.项目启动与环境搭建 1.框架开发方向: 1.前后端分离项目 2.纯后端项目 3.移动端开发uni-app(ios、Android、H5、微信小程序) 4.内容管理系统2.项目启动与环境搭建 1.安装node.js 下载地址可以用nvm安装 便于运行前端项目https://juejin.cn/post/7094576…...

LeetCode算法题解:螺旋矩阵

LeetCode算法题解&#xff1a;螺旋矩阵 题目描述 给定一个 m x n 的矩阵&#xff0c;按照螺旋顺序返回矩阵中的所有元素。 解题思路 1. 初始化变量 我们首先定义四个边界变量来跟踪螺旋遍历的边界&#xff1a;top、bottom、left 和 right。 2. 螺旋遍历 开始从左到右遍历…...

【Java 设计模式】设计原则之开放封闭原则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中&#xff0c;设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针&#xff0c;帮助我们构建高质量、易理解的代码。 ✨单一职责原则&#xff08;SRP&#xff09; ✨开放/封闭原则&#xff08…...

数据分析求职-知识脑图

今天和大家聊聊数据分析求职常见面试题&#xff0c;这是这个系列的第一篇文章&#xff0c;但是我不想开始就直接罗列题目&#xff0c;因为这样的文章实在太多了&#xff0c;同学们的兴趣程度肯定一般。所以&#xff0c;我想先和大家聊聊在准备面试题时候通常遇到的困扰&#xf…...

SQL-修改数据

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…...

Rockchip | FIQ-Debugger调试工具

FIQ-Debugger fiq debugger是集成到内核中的一种系统调试手段。 FIQ在arm架构中相当于nmi中断&#xff0c;fiq debugger把串口注册成fiq中断&#xff0c;在串口fiq中断服务程序中集成了一些系统调试命令。 一般情况下串口是普通的console模式&#xff0c;在串口工具下键盘输入…...

光谷做网站推广/惠州seo代理计费

记得在一次面试中被问到ThreadLocal&#xff0c;答得马马虎虎&#xff0c;所以打算研究一下ThreadLocal的源码 面试官 &#xff1a; 用过ThreadLocal吗&#xff1f; 楼主答 &#xff1a; 用过&#xff0c;当时使用ThreadLocal的时候&#xff0c;使用Spring实现横切整个Contro…...

做网站和做app哪个更难/无锡谷歌推广

JDK环境变量的配置&#xff1a; 右击“计算机”或“我的电脑”&#xff0c;选择“属性”-->“高级”或“高级系统设置”&#xff08;例如以下图1&#xff09;-->“环境变量”&#xff08;例如以下图2&#xff09;&#xff0c;例如以下图&#xff1a; 图1 图2 单机“环境变…...

网上做牙刷上什么网站/dw如何制作网页

Nim游戏从一个问题进入。 描述 今天我们要认识一对新朋友&#xff0c;Alice与Bob。 Alice与Bob总是在进行各种各样的比试&#xff0c;今天他们在玩一个取石子的游戏。 在这个游戏中&#xff0c;Alice和Bob放置了N堆不同的石子&#xff0c;编号1..N&#xff0c;第i堆中有Ai个…...

修改网站版权/四川seo快速排名

操作系统&#xff1a; Windows 7 安装步骤 Step 1: 安装Tensorflow支持的Python版本&#xff0c;配置环境变量 目前,Tensorflow支持&#xff1a; Python 3.5.x 64-bit from python.orgPython 3.6.x 64-bit from python.org本次选择Python3.5.2版&#xff0c;系统上已安装过Pyth…...

用户关闭wordpress新闻/英雄联盟韩国

来源&#xff5c;新眸编辑&#xff5c;栖木文&#xff5c;祝一一就当下而言&#xff0c;社区团购本身并不存在多深的护城河&#xff0c;进入门槛并不高。社区团购在经过2019年的“集体性失声”后&#xff0c;没想到会在2020年春节后因为疫情的原因&#xff0c;一下子热闹起来。…...

wordpress 站内搜索/网站优化seo培

一、发展现状 我国医药行业发展水平和国民经济的发展速度息息相关&#xff0c;随着我国国民经济的快速持续增长&#xff0c;我国人民的生活水平也随着得到提升&#xff0c;我国医药行业也得到不断快速发展。在物质基础得到巩固后&#xff0c;人们越发关注自身的生活质量以及身体…...