freeRTOS总结(十四)任务通知

1、任务通知

任务通知: 用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值
使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信!
在这里插入图片描述
使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的"通知"
在这里插入图片描述
也就是说任务通知实现任务之间不同过中间结构体完成消息通讯

任务通知值的更新方式
不覆盖接受任务的通知值
覆盖接受任务的通知值
更新接受任务通知值的一个或多个bit
增加接受任务的通知值
只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组!

任务通知的优势及劣势
任务通知的优势:
效率更高:使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多
使用内存更小 使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体
任务通知的劣势:
无法发送数据给ISR:ISR没有任务结构体,所以无法给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务。
无法广播给多个任务 :任务通知只能是被指定的一个任务接收并处理
无法缓存多个数据:任务通知是通过更新任务通知值来发送数据的,任务结构体中只有一个任务通知值,只能保持一个数据。
发送受阻不支持阻塞:发送方无法进入阻塞状态等待

2,任务通知值和通知状态

任务都有一个结构体:任务控制块TCB,它里边有两个结构体成员变量:
在这里插入图片描述

任务通知值
任务通知值的更新方式有多种类型:
计数值(数值累加,类似信号量)
相应位置一(类似事件标志组)
任意数值(支持覆写和不覆写,类似队列)

任务通知状态
其中任务通知状态共有3种取值:
在这里插入图片描述

任务未等待通知 :任务通知默认的初始化状态
等待通知:接收方已经准备好了(调用了接收任务通知函数),等待发送方给个通知
等待接收:发送方已经发送出去(调用了发送任务通知函数),等待接收方接收

3,任务通知相关API函数介绍(熟悉)

任务通知API函数主要有两类:①发送通知 ,②接收通知。
注意:发送通知API函数可以用于任务和中断服务函数中;接收通知API函数只能用在任务中。
①发送通知相关API函数:
在这里插入图片描述

#define   	xTaskNotifyAndQuery( xTaskToNotify ,  ulValue ,  eAction ,  pulPreviousNotifyValue  )	 \   xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ),( pulPreviousNotifyValue ) )
#define	xTaskNotify  (  xTaskToNotify ,  ulValue ,  eAction  ) 							\   xTaskGenericNotify(  ( xTaskToNotify ) ,  ( tskDEFAULT_INDEX_TO_NOTIFY ) ,  ( ulValue ) ,  ( eAction ) ,  NULL  )
#define 	xTaskNotifyGive(  xTaskToNotify  )									 \   xTaskGenericNotify(  ( xTaskToNotify ) ,  ( tskDEFAULT_INDEX_TO_NOTIFY ) ,  ( 0 ) ,   eIncrement ,  NULL )
BaseType_t	 xTaskGenericNotify(  TaskHandle_t 	xTaskToNotify,UBaseType_t 	uxIndexToNotify,uint32_t 		ulValue,eNotifyAction 	eAction,uint32_t * 		pulPreviousNotificationValue  )

在这里插入图片描述
任务通知方式共有以下几种:

typedef  enum
{    eNoAction = 0, 			/* 无操作 */eSetBits				/* 更新指定bit */eIncrement				/* 通知值加一 */eSetValueWithOverwrite		/* 覆写的方式更新通知值 */eSetValueWithoutOverwrite	/* 不覆写通知值 */
} eNotifyAction;

在这里插入图片描述
当任务通知用作于信号量时,使用函数获取信号量:ulTaskNotifyTake()
当任务通知用作于事件标志组或队列时,使用此函数来获取: xTaskNotifyWait()

#define ulTaskNotifyTake( xClearCountOnExit  ,   xTicksToWait ) 			\
ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ),			\				( xClearCountOnExit ), 					\				( xTicksToWait ) ) 

此函数用于接收任务通知值,可以设置在退出此函数的时候将任务通知值清零或者减一
在这里插入图片描述
在这里插入图片描述

#define xTaskNotifyWait(	ulBitsToClearOnEntry, 			\				ulBitsToClearOnExit, 			\				pulNotificationValue, 			\				xTicksToWait) 				\
xTaskGenericNotifyWait( 	tskDEFAULT_INDEX_TO_NOTIFY, 	\				( ulBitsToClearOnEntry ), 			\				( ulBitsToClearOnExit ), 			\				( pulNotificationValue ), 			\				( xTicksToWait )               ) 

此函数用于获取通知值和清除通知值的指定位值,适用于模拟队列和事件标志组,使用该函数来获取任务通知 。

BaseType_t    xTaskGenericNotifyWait( 	UBaseType_t 	uxIndexToWaitOn,						uint32_t 		ulBitsToClearOnEntry,						uint32_t 		ulBitsToClearOnExit,						uint32_t * 		pulNotificationValue,						TickType_t 		xTicksToWait	    ); 

在这里插入图片描述
在这里插入图片描述

4,任务通知模拟信号量实验(掌握)

1、实验目的:学习使用 FreeRTOS 中的任务通知功能模拟二值信号量和计数型信号量
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
start_task 用来创建task1和task2任务
task1 用于按键扫描,当检测到按键KEY0被按下时,将发送任务通知
task2 用于接收任务通知,并打印相关提示信息


#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t  task1_handler;
void task1( void * pvParameters );/* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );/*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/void freertos_demo(void)
{ xTaskCreate((TaskFunction_t) start_task,(char *)	"start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t *)&start_task_handler);//开启任务调度vTaskStartScheduler();}
void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);xTaskCreate((TaskFunction_t) task2,(char *)	"task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *)&task2_handler	);vTaskDelete(NULL);//删除当前任务也就是开始任务taskEXIT_CRITICAL();}
/* 任务一,用于扫描按键,当KEY0按下,发送任务通知值 */
void task1( void * pvParameters )
{uint8_t key;while(1){key=key_scan(0);if(key==KEY0_PRES){printf("任务通知模拟二值信号量释放!\r\n");//发送通知不带通知值 参数为通知的任务句柄xTaskNotifyGive(task2_handler);}vTaskDelay(10);}}
/* 任务二,读取队列集中的消息并打印*/
void task2( void * pvParameters )
{uint32_t rev =0 ;while(1){//返回值为任务调用期间接收到的任务通知次数rev=ulTaskNotifyTake(pdTRUE,portMAX_DELAY);if(rev!=0){printf("接收任务通知成功,模拟获取二值信号量!\r\n");printf("rev val is %ld\r\n",rev);}}
}

5,任务通知模拟消息邮箱实验(掌握)

1、实验目的:学习使用 FreeRTOS 中的任务通知功能模拟消息邮箱
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
start_task 用于按键扫描,将按下的按键键值通过任务通知发送给指定任务
task2 用于接收任务通知,并根据接收到的数据做相应动作


#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );/* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );/******************************************************************************************************/
/*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{    xTaskCreate((TaskFunction_t         )   start_task,(char *                 )   "start_task",(configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,(void *                 )   NULL,(UBaseType_t            )   START_TASK_PRIO,(TaskHandle_t *         )   &start_task_handler );vTaskStartScheduler();
}void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区 */xTaskCreate((TaskFunction_t         )   task1,(char *                 )   "task1",(configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,(void *                 )   NULL,(UBaseType_t            )   TASK1_PRIO,(TaskHandle_t *         )   &task1_handler );xTaskCreate((TaskFunction_t         )   task2,(char *                 )   "task2",(configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,(void *                 )   NULL,(UBaseType_t            )   TASK2_PRIO,(TaskHandle_t *         )   &task2_handler );vTaskDelete(NULL);taskEXIT_CRITICAL();                /* 退出临界区 */
}/* 任务一,发送任务通知值 */
void task1( void * pvParameters )
{uint8_t key = 0;while(1) {key = key_scan(0);if((key != 0) && (task2_handler != NULL)){printf("任务通知模拟消息邮箱发送,发送的键值为:%d\r\n",key);xTaskNotify( task2_handler, key, eSetValueWithOverwrite );}vTaskDelay(10);}
}/* 任务二,接收任务通知值 */
void task2( void * pvParameters )
{uint32_t noyify_val = 0;while(1){xTaskNotifyWait( 0, 0xFFFFFFFF, &noyify_val, portMAX_DELAY );switch(noyify_val){case KEY0_PRES:{printf("接收到的通知值为:%d\r\n",noyify_val);LED0_TOGGLE();break;}case KEY1_PRES:{printf("接收到的通知值为:%d\r\n",noyify_val);LED1_TOGGLE();break;}default : break;}}
}

任务通知模拟事件标志组实验(掌握)

1、实验目的:学习使用 FreeRTOS 中的任务通知功能模拟事件标志组
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
start_task 用来创建task1和task2任务
task1 用于按键扫描,当检测到按键按下时,发送任务通知设置不同标志位
task2 用于接收任务通知,并打印相关提示信息

#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t  task1_handler;
void task1( void * pvParameters );/* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );#define EVENTBIT_0  (1 << 0)
#define EVENTBIT_1  (1 << 1)/*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/void freertos_demo(void)
{ xTaskCreate((TaskFunction_t) start_task,(char *)	"start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t *)&start_task_handler);//开启任务调度vTaskStartScheduler();}
void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);xTaskCreate((TaskFunction_t) task2,(char *)	"task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *)&task2_handler	);vTaskDelete(NULL);//删除当前任务也就是开始任务taskEXIT_CRITICAL();}
/* 任务一,用于扫描按键,当KEY0按下,发送任务通知值 */
void task1( void * pvParameters )
{uint8_t key;while(1){key=key_scan(0);if(key==KEY0_PRES){printf("将bit0位置为1\r\n");xTaskNotify(task2_handler,EVENTBIT_0,eSetBits);}else if(key==KEY1_PRES){printf("将bit1位置为1\r\n");xTaskNotify(task2_handler,EVENTBIT_1,eSetBits);}vTaskDelay(10);}}
/* 任务二,读取队列集中的消息并打印*/
void task2( void * pvParameters )
{uint32_t rev =0 ;uint32_t event_bit =0;while(1){//接收前通知值不清零,接收后通知值全部清零,通知值给到revxTaskNotifyWait(0,0xFFFFFFFF,&rev,portMAX_DELAY);if(rev&EVENTBIT_0){event_bit|=EVENTBIT_0;}if(rev&EVENTBIT_1){event_bit|=EVENTBIT_1;}if(event_bit==(EVENTBIT_0|EVENTBIT_1)){printf("任务通知模拟事件标志组接收成功!!\r\n");event_bit=0;}}
}

7、模拟计数信号量

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t  task1_handler;
void task1( void * pvParameters );/* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );/*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/void freertos_demo(void)
{ xTaskCreate((TaskFunction_t) start_task,(char *)	"start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t *)&start_task_handler);//开启任务调度vTaskStartScheduler();}
void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);xTaskCreate((TaskFunction_t) task2,(char *)	"task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *)&task2_handler	);vTaskDelete(NULL);//删除当前任务也就是开始任务taskEXIT_CRITICAL();}
/* 任务一,用于扫描按键,当KEY0按下,发送任务通知值 */
void task1( void * pvParameters )
{uint8_t key;while(1){key=key_scan(0);if(key==KEY0_PRES){printf("任务通知模拟计数信号量被释放\r\n");xTaskNotifyGive(task2_handler);}vTaskDelay(10);}}
/* 任务二,读取队列集中的消息并打印*/
void task2( void * pvParameters )
{uint32_t rev =0 ;while(1){rev=ulTaskNotifyTake(pdFALSE,portMAX_DELAY);if(rev!=0){printf("rev:%d\r\n",rev);}vTaskDelay(1000);}
}

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

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

相关文章

Flink流式数据倾斜

1. 流式数据倾斜 流式处理的数据倾斜和 Spark 的离线或者微批处理都是某一个 SubTask 数据过多这种数据不均匀导致的&#xff0c;但是因为流式处理的特性其中又有些许不同 2. 如何解决 2.1 窗口有界流倾斜 窗口操作类似Spark的微批处理&#xff0c;直接两阶段聚合的方式来解决…

leetcode - 408. Valid Word Abbreviation

Description A string can be abbreviated by replacing any number of non-adjacent, non-empty substrings with their lengths. The lengths should not have leading zeros. For example, a string such as “substitution” could be abbreviated as (but not limited t…

详细分析python中的from waitress import serve(附Demo)

目录 前言1. 基本知识2. serve源码分析3. 基本操作 前言 以前玩python 开发的时候写过一些见解&#xff0c;推荐阅读&#xff1a; uwsgi启动django以及uwsgi.ini的配置参数详解Django框架零基础入门 部署服务器除了Flask还有serve 在讲述serve之前&#xff0c;先讲述两者的…

安全名词解析-社工、0day、DDos攻击

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 社工02 0day漏洞03 DDoS攻击 01 社工 社工&#xff08;Social Engineering&#xff09;&#xff0c;一般指社会工程攻击的简称&#xff0c;是一种通过与人的交互来获取信息、获取访问权限或进行欺骗…

shell 脚本输出java版本到日志文件中

要将Java版本输出到日志文件中&#xff0c;你可以使用Shell脚本调用java -version命令&#xff0c;并将输出重定向到一个日志文件中。下面是一个简单的示例脚本&#xff0c;展示了如何实现这一功能&#xff1a; #!/bin/bash# 指定日志文件路径 log_file"/path/to/your/log…

前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

一、仅需实现在线预览&#xff0c;且文件地址公网可访问 &#xff08;一&#xff09;微软office免费预览&#xff08;推荐&#xff09; 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…

【Qt】Android上运行keeps stopping, Desktop上正常

文章目录 问题 & 背景背景问题 解决方案One More ThingTake Away 问题 & 背景 背景 在文章【Qt】最详细教程&#xff0c;如何从零配置Qt Android安卓环境中&#xff0c;我们在Qt中配置了安卓开发环境&#xff0c;并且能够正常运行。 但笔者在成功配置并完成上述文章…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第10章 项目进度管理(三)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

2024/2/7总结

Node.js 什么是node.js node.js是一个基于chrome v8 引擎的 JavaScript 运行环境。 浏览器是JavaScript的前端运行环境node.js是JavaScript的后端运行环境 node.js中无法调用DOM和BOM等浏览器内置API fs模块 是node.js官方提供的、用来操作文件的模块&#xff0c;它提供了一系…

初识 Protobuf 和 gRpc

初步了解 Protobuf 和 gRpc Protocol Buffers Protocol Buffers&#xff08;又称protobuf&#xff09;是谷歌的语言无关、平台无关、可扩展的机制&#xff0c;用于序列化结构化数据。您可以在protobuf的文档中了解更多关于它的信息。 ProtoBuf 的定义 ProtoBuf是将类的定义…

PostgreSql与Postgis安装

POstgresql安装 1.登录官网 PostgreSQL: Linux downloads (Red Hat family) 2.选择版本 3.安装 ### 源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm ### 客户端 yum install postgresql14 ###…

Python使用zdppy_es国产框架操作Elasticsearch实现增删改查

Python使用zdppy_es国产框架操作Elasticsearch实现增删改查 本套教程配套有录播课程和私教课程&#xff0c;欢迎私信我。 Docker部署ElasticSearch7 创建基本容器 docker run -itd --name elasticsearch -p 9200:9200 -e "discovery.typesingle-node" -e ES_JAVA_…

获取目标进程导入DLL模块地址的方法

以下是一些常用的方法&#xff0c;可以用于获取目标进程导入DLL模块的地址。根据具体情况选择合适的方法&#xff0c;并注意安全性和稳定性&#xff1a; 1、使用 LoadLibrary 函数和 GetModuleHandle 函数&#xff1a; #include <Windows.h>// 获取目标进程中某个 DLL …

MySQL基础查询篇(10)-正则表达式的基础使用

正则表达式在MySQL数据库中是非常强大且常用的功能&#xff0c;它可以帮助我们快速的匹配和处理文本数据。在MySQL中&#xff0c;正则表达式的使用可以通过正则表达式函数来实现。 MySQL中常用的正则表达式函数有&#xff1a; REGEXP/RLIKE&#xff1a;通过正则表达式进行模式…

java Map集合相关介绍和方法使用操作

Java的Map集合是存储键值对的一种数据结构。在Map中&#xff0c;每个键都是唯一的&#xff0c;用来标识该键值对。 Map接口是java.util包中的一部分&#xff0c;它有多个实现类&#xff0c;包括HashMap&#xff0c;TreeMap&#xff0c;LinkedHashMap等。 下面是Map接口的一些…

Docker的镜像和容器的区别

1 Docker镜像 假设Linux内核是第0层&#xff0c;那么无论怎么运行Docker&#xff0c;它都是运行于内核层之上的。这个Docker镜像&#xff0c;是一个只读的镜像&#xff0c;位于第1层&#xff0c;它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…

P2957

题目描述 The cows enjoy mooing at the barn because their moos echo back, although sometimes not completely. Bessie, ever the excellent secretary, has been recording the exact wording of the moo as it goes out and returns. She is curious as to just how mu…

numa网卡绑定

#概念 参考&#xff1a;https://www.jianshu.com/p/0f3b39a125eb(opens new window) chip&#xff1a;芯片&#xff0c;一个cpu芯片上可以包含多个cpu core&#xff0c;比如四核&#xff0c;表示一个chip里4个core。 socket&#xff1a;芯片插槽&#xff0c;颗&#xff0c;跟…

Sping Cloud Hystrix 参数配置、简单使用、DashBoard

Sping Cloud Hystrix 文章目录 Sping Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数C…

Docker容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…