openGauss学习笔记-86 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署配置

news2024/11/30 10:47:11

文章目录

    • openGauss学习笔记-86 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署配置
      • 86.1 总体原则
      • 86.2 重做日志(MOT)
      • 86.3 检查点(MOT)
      • 86.4 恢复(MOT)
      • 86.5 统计(MOT)
      • 86.6 错误日志(MOT)
      • 86.7 内存(MOT)
      • 86.8 垃圾收集(MOT)
      • 86.9 JIT(MOT)
      • 86.10 默认MOT.conf文件

openGauss学习笔记-86 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT部署配置

预置MOT用于创建工作MOT。为了获得最佳效果,建议根据应用程序的特定要求和偏好自定义MOT配置(在mot.conf文件中定义)。

该文件在服务器启动时只读。如果在系统运行中编辑此文件,则必须重新加载服务器才能使修改内容生效。

mot.conf文件与postgresql.conf配置文件在同一文件夹下。

在主备部署模式下,主备节点的mot.conf文件需要完全相同,否则,系统行为不明确。

阅读总体原则,根据需要查看和配置mot.conf文件。

img 说明:

以上描述了mot.conf文件中的各个设置。除上述内容外,要了解特定MOT功能(如恢复),可参考本用户手册的相关章节。例如,MOT恢复说明了mot.conf文件的恢复,包含影响MOT恢复的设置。此外,有关恢复的完整说明,请参阅“MOT管理”章节的MOT恢复。下文各相关章节中还提供了参考链接。

以下介绍了mot.conf文件中的各个部分,其包含的设置以及默认值。

86.1 总体原则

以下是编辑mot.conf文件的总体原则。

  • 每个设置项都带有默认值,如下所示:

    # name = value
    
  • 可以接受空格或留空。

  • 在各行添加#号可进行注释。

  • 每个设置项的默认值将作为注释显示在整个文件中。

  • 如果参数没有注释并且置入了新值,则定义新设置。

  • 对mot.conf文件的更改仅在数据库服务器启动或重装时生效。

内存单元的表示如下:

  • KB:千字节
  • MB:兆字节
  • GB:吉字节
  • TB:太字节

如果未指定内存单元,则假定为字节。

某些内存单位为postgresql.conf中的max_process_memory的百分比值。例如,20%。

时间单位表示如下:

  • us:微秒
  • ms:毫秒
  • s:秒
  • min:分钟
  • h:小时
  • d:天

如果未指定时间单位,则假定为微秒。

86.2 重做日志(MOT)

  • enable_group_commit = false

    是否使用组提交。

    该选项仅在openGauss配置为使用同步提交时相关,即仅当postgresql.conf中的synchronization_commit设置为除off以外的任何值时相关。

    有关WAL重做日志的详细信息,请参阅MOT日志记录:WAL重做日志

  • group_commit_size = 16

  • group_commit_timeout = 10 ms

    只有当MOT引擎配置为同步组提交日志记录时,此选项才相关。即postgresql.conf中的synchronization_commit配置为true,mot.conf配置文件中的enable_group_commit配置为true。

    当一组事务记录在WAL重做日志中时,需确定以下设置项取值:

    group_commit_size:一组已提交的事务数。例如,16表示当同一组中的16个事务已由它们的客户端应用程序提交时,则针对16个事务中的每个事务,在磁盘的WAL重做日志中写入一个条目。

    group_commit_timeout:超时时间,单位为毫秒。例如,10表示在10毫秒之后,为同一组由客户端应用程序在最近10毫秒内提交的每个事务,在磁盘的WAL重做日志中写入一个条目。

    提交组在到达配置的事务数后或者在超时后关闭。组关闭后,组中的所有事务等待一个组落盘完成执行,然后通知客户端每个事务都已经结束。

    img说明: 有关同步组提交日志记录的详细信息,请参阅MOT日志类型

86.3 检查点(MOT)

  • checkpoint_dir =

    指定检查点数据存放目录。默认位置在每个数据节点的data文件夹中。

  • checkpoint_segsize = 16 MB

    指定检查点时使用的段大小。分段执行检查点。当一个段已满时,它将被序列化到磁盘,并为后续的检查点数据打开一个新的段。

  • checkpoint_workers = 3

    指定在检查点期间要使用的工作线程数。

    检查点由多个MOT引擎工作线程并行执行。工作线程的数量可能会大大影响整个检查点操作的整体性能,以及其它正在运行的事务的操作。为了实现较短的检查点持续时间,应使用更多线程,直至达到最佳数量(根据硬件和工作负载的不同而不同)。但请注意,如果这个数目太大,可能会对其他正在运行的事务的执行时间产生负面影响。尽可能低这个数字,以最小化对其他运行事务的运行时的影响。当此数目过高时,检查点持续时间会较长。

img 说明: 有关配置的更多信息,请参阅MOT检查点

86.4 恢复(MOT)

  • checkpoint_recovery_workers = 3

    指定在检查点数据恢复期间要使用的工作线程数。每个MOT引擎工作线程在自己的核上运行,通过将不同的表读入内存,可以并行处理不同的表。缺省值为3,可将此参数设置为可处理的核数。恢复后,将停止并杀死这些线程。

img 说明: 有关配置的详细信息,请参阅MOT恢复

  • parallel_recovery_workers = 5 指定在重做恢复/回放期间使用的工作线程数。
  • parallel_recovery_workers = 5 指定恢复期间用于保存重做日志段的队列大小。此参数还限制并行恢复期间处于活动状态(进行中)的最大事务数。如果达到此限制,重做回放将等待某些事务提交,然后再处理新事务的重做日志。

86.5 统计(MOT)

  • enable_stats = false

    设置周期性统计打印信息。

  • print_stats_period = 10 minute

    设置汇总统计报表打印的时间范围。

  • print_full_stats_period = 1 hours

    设置全量统计报表打印的时间范围。

    以下设置为周期性统计报表中的各个部分。如果没有配置,则抑制统计报表。

  • enable_log_recovery_stats = false

    日志恢复统计信息包含各种重做日志的恢复指标。

  • enable_db_session_stats = false

    数据库会话统计信息包含事务事件,如提交、回滚等。

  • enable_network_stats = false

    网络统计信息包括连接/断连事件。

  • enable_log_stats = false

    日志统计信息包含重做日志详情。

  • enable_memory_stats = false

    内存统计信息包含内存层详情。

  • enable_process_stats = false

    进程统计信息包含当前进程的内存和CPU消耗总量。

  • enable_system_stats = false

    系统统计信息包含整个系统的内存和CPU消耗总量。

  • enable_jit_stats = false

    JIT统计信息包含有关JIT查询编译和执行的信息。

86.6 错误日志(MOT)

  • log_level = INFO

    设置MOT引擎下发的消息在数据库服务器的错误日志中记录的日志级别。有效值为PANIC、ERROR、WARN、INFO、TRACE、DEBUG、DIAG1、DIAG2。

  • Log/COMPONENT/LOGGER=LOG_LEVEL

    使用以下语法设置特定的日志记录器。

    例如,要为系统组件中的ThreadIdPool日志记录器配置TRACE日志级别,请使用以下语法:

    Log.System.ThreadIdPool.log_level=TRACE
    

    要为某个组件下的所有记录器配置日志级别,请使用以下语法:

    Log.COMPONENT.log_level=LOG_LEVEL
    

    例如:

    Log.System.log_level=DEBUG
    

86.7 内存(MOT)

  • enable_numa = true

    指定是否使用可识别NUMA的内存。禁用时,所有亲和性配置也将被禁用。MOT引擎假定所有可用的NUMA节点都有内存。如果计算机具有某些特殊配置,其中某些NUMA节点没有内存,则MOT引擎初始化将因此失败,因此数据库服务器启动将失败。在此类计算机中,建议将此配置值设置为false,以防止启动失败并让MOT引擎在不使用可识别NUMA的内存分配的情况下正常运行。

  • affinity_mode = equal-per-socket

    设置用户会话和内部MOT任务的线程亲和模式。

    使用线程池时,用户会话将忽略此值,因为它们的亲和性由线程池控制。但内部MOT任务仍然使用。

    有效值为fill-socket-first、equal-per-socket、fill-physical-first、none。

    • Fill-socket-first将线程连接到同一个槽位的核上,直到槽位已满,然后移动到下一个槽位。
    • Equal-per-socket使线程均匀分布在所有槽位中。
    • Fill-physical-first将线程连接到同一个槽位中的物理核,直到用尽所有物理核,然后移动到下一个槽位。当所有物理核用尽时,该过程再次从超线程核开始。
    • None禁用任何亲和配置,并让系统调度程序确定每个线程调度在哪个核上运行。
  • lazy_load_chunk_directory = true

    设置块目录模式,用于内存块查找。

    Lazy模式将块目录设置为按需加载部分目录,从而减少初始内存占用(大约从1GB减少到1MB)。然而,这可能会导致轻微的性能损失和极端情况下的内存损坏。相反,使用non-lazy块目录会额外分配1GB的初始内存,产生略高的性能,并确保在内存损坏期间避免块目录错误。

  • reserve_memory_mode = virtual

    设置内存预留模式(取值为physical或virtual)。

    每当从内核分配内存时,都会参考此配置值来确定所分配的内存是常驻(physical)还是非常驻(virtual)。这主要与预分配有关,但也可能影响运行时分配。对于physical保留模式,通过强制内存区域所跨越的所有页出现页错误,使整个分配的内存区域常驻。配置virtual内存预留可加速内存分配(特别是在预分配期间),但可能在初始访问期间出现页错误(因此导致轻微的性能影响),并在物理内存不可用时出现更多服务器错误。相反,物理内存分配速度较慢,但后续访问速度更快且有保障。

  • store_memory_policy = compact

    设置内存存储策略(取值为compact或expanding)。

    当定义了compact策略时,未使用的内存会释放回内核,直到达到内存下限(请参见下面的min_mot_memory)。在expanding策略中,未使用的内存存储在MOT引擎中,以便后续再使用。compact存储策略可以减少MOT引擎的内存占用,但偶尔会导致性能轻微下降。此外,在内存损坏时,它还可能导致内存不可用。相反,expanding模式会占用更多的内存,但是会更快地分配内存,并且能够更好地保证在解分配后能够重新分配内存。

  • chunk_alloc_policy = auto

    设置全局内存的块分配策略。

    MOT内存以2MB的块为单位组织。源NUMA节点和每个块的内存布局会影响表数据在NUMA节点间的分布,因此对数据访问时间有很大影响。在特定NUMA节点上分配块时,会参考分配策略。

    可用值包括auto、local、page-interleaved、chunk-interleaved、native。

    • Auto策略根据当前硬件情况选择块分配策略。
    • Local策略在各自的NUMA节点上分配每个数据块。
    • Page-interleaved策略从所有NUMA节点分配由交插内存4千字节页组成的数据块。
    • Chunk-interleaved策略以轮循调度方式从所有NUMA节点分配数据块。
    • Native策略通过调用原生系统内存分配器来分配块。
  • chunk_prealloc_worker_count = 8

    设置每个NUMA节点参与内存预分配的工作线程数。

  • max_mot_global_memory = 80%

    设置MOT引擎全局内存的最大限制。

    指定百分比值与postgresql.conf中max_process_memory定义的总量有关。

    MOT引擎内存分为全局(长期)内存,主要用于存储用户数据,以及本地(短期)内存,主要用于用户会话,以满足本地需求。

    任何试图分配超出此限制的内存的尝试将被拒绝,并向用户报告错误。请确保max_mot_global_memory与max_mot_local_memory之和不超过postgresql.conf中配置的max_process_memory。

  • min_mot_global_memory = 0 MB

    设置MOT引擎全局内存的最小限制。

    指定百分比值与postgresql.conf中max_process_memory定义的总量有关。

    此值用于启动期间的内存预分配,以及确保MOT引擎在正常运行期间有最小的内存可用量。当使用compact存储策略时(参阅上文store_memory_policy),该值指定了下限,超过下限的内存不会释放回内核,而是保留在MOT引擎中以便后续重用。

  • max_mot_local_memory = 15%

    设置MOT引擎本地内存的最大限制。

    指定百分比值与postgresql.conf中max_process_memory定义的总量有关。

    MOT引擎内存分为全局(长期)内存,主要用于存储用户数据,以及本地(短期)内存,主要用于用户会话,以满足本地需求。

    任何试图分配超出此限制的内存的尝试将被拒绝,并向用户报告错误。请确保max_mot_global_memory与max_mot_local_memory之和不超过postgresql.conf中配置的max_process_memory。

  • min_mot_local_memory = 0 MB

    设置MOT引擎本地内存的最小限制。

    指定百分比值与postgresql.conf中max_process_memory定义的总量有关。

    此值用于在启动期间预分配内存,以及确保MOT引擎在正常运行期间有最小的可用内存。当使用compact存储策略时(参阅上文store_memory_policy),该值指定了下限,超过下限的内存不会释放回内核,而是保留在MOT引擎中以便后续重用。

  • max_mot_session_memory = 0 MB

    设置MOT引擎中单个会话的最大内存限制。

    指定百分比值与postgresql.conf中max_process_memory定义的总量有关。

    通常,MOT引擎中的会话可以根据需要分配尽可能多的本地内存,只要没有超出本地内存限制即可。为了避免单个会话占用过多的内存,从而拒绝其他会话的内存,通过该配置项限制小会话的本地内存分配(最大1022KB)。

    请确保该配置项不影响大会话的本地内存分配。

    0表示不会限制每个小会话的本地分配,除非是由max_mot_local_memory配置的本地内存分配限制引起的。

  • min_mot_session_memory = 0 MB

    设置MOT引擎中单个会话的最小内存预留。

    指定百分比值与postgresql.conf中max_process_memory定义的总量有关。

    此值用于在会话创建期间预分配内存,以及确保会话有最小的可用内存量来执行其正常操作。

  • session_large_buffer_store_size = 0 MB

    设置会话的大缓冲区存储。

    当用户会话执行需要大量内存的查询时(例如,使用许多行),大缓冲区存储用于增加此类内存可用的确定级别,并更快地为这个内存请求提供服务。对于超过1022KB的会话,任何内存分配都是大内存分配。如果未使用或耗尽了大缓冲区存储,则这些分配将被视为直接从内核提供的巨大分配。

  • session_large_buffer_store_max_object_size = 0 MB

    设置会话的大分配缓冲区存储中的最大对象大小。

    大缓冲区存储内部被划分为不同大小的对象。此值用于对源自大缓冲区存储的对象设置上限,以及确定缓冲区存储内部划分为不同大小的对象。

    此大小不能超过session_large_buffer_store_size的1/8。如果超过,则将其调整到最大可能。

  • session_max_huge_object_size = 1 GB

    设置会话单个大内存分配的最大尺寸。

    巨大分配直接从内核中提供,因此不能保证成功。

    此值也适用于全局(非会话相关)内存分配。

86.8 垃圾收集(MOT)

  • reclaim_threshold = 512 KB

    设置垃圾收集器的内存阈值。

    每个会话管理自己的待回收对象列表,并在事务提交时执行自己的垃圾回收。此值决定了等待回收的对象的总内存阈值,超过该阈值,会话将触发垃圾回收。

    一般来说,这里是在权衡未回收对象与垃圾收集频率。设置低值会使未回收的内存保持在较少的水平,但会导致频繁的垃圾回收,从而影响性能。设置高值可以减少触发垃圾回收的频率,但会导致未回收的内存过多。此设置取决于整体工作负载。

  • reclaim_batch_size = 8000

    设置垃圾回收的批次大小。

    垃圾收集器从对象中批量回收内存,以便限制在一次垃圾收集传递中回收的对象数量。此目的是最小化单个垃圾收集传递的操作时间。

  • high_reclaim_threshold = 8 MB

    设置垃圾回收的高内存阈值。

    由于垃圾收集是批量工作的,因此会话可能有许多可以回收的对象,但这些对象不能回收。在这种情况下,为了防止垃圾收集列表变得过于膨胀,尽管已经达到批处理大小限制,此值继续单独回收对象,直到待回收对象小于该阈值,或者没有更多符合回收条件的对象。

86.9 JIT(MOT)

  • enable_mot_codegen = false

    指定是否对计划查询使用JIT查询编译和执行。

    JIT查询执行为在计划阶段准备好的查询准备了JIT编译的代码。每当调用准备好的查询时,都会执行生成的JIT编译函数。JIT编译通常以LLVM的形式进行。

  • enable_mot_codegen_print = false

    是否为JIT编译的查询打印发出的LLVM代码。

  • mot_codegen_limit = 50000

    限制每个用户会话允许的JIT查询数量。

  • enable_mot_query_codegen = true

    计划查询是否使用JIT查询编译和执行。JIT查询执行允许在规划阶段为预处理查询提供即时编译代码。每当调用预处理查询时,就会执行生成的JIT编译函数。JIT编译以LLVM的形式进行。

  • enable_mot_sp_codegen = true

    存储过程是否使用JIT查询编译和执行。JIT查询执行允许在编译阶段为存储过程提供即时编译代码。每当调用存储过程时,就会执行生成的JIT编译函数。

  • enable_mot_codegen_profile = true

    是否使用JIT分析。使用此选项时,mot_jit_profile()函数可用于获取JIT存储过程和查询的运行时配置数据。

86.10 默认MOT.conf文件

最小设置和配置指定将postgresql.conf文件指向MOT.conf文件的位置:

postgresql.conf  
mot_config_file = '/tmp/gauss/ MOT.conf'

确保max_process_memory设置的值足够包含MOT的全局(数据和索引)和本地(会话)内存。

MOT.conf的默认内容满足开始使用的需求。设置内容后续可以优化。

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

image-20230625180252706

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

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

相关文章

【C++】unordered_set、unordered_map的介绍及使用

unordered_set、unordered_map的介绍及使用 一、unordered系列关联式容器二、unordered_map and unordered_multimap1、unordered_map的介绍2、unordered_map的使用(1)定义(2)接口使用 3、unordered_multimap 二、unordered_set a…

集合在多线程下安全问题

如果在多线程下,同时操作同一个数据源,就会出现数据安全问题: A线程取出值为10,准备加5. 同时B线程也取出来10,减了5 C取出的时候有可能时15,也有可能时5。产生了数据安全问题。 方法有很多例如&#xff1a…

消息队列-RabbitMQ(二)

接上文《消息队列-RabbitMQ&#xff08;一&#xff09;》 Configuration public class RabbitMqConfig {// 消息的消费方json数据的反序列化Beanpublic RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){Simple…

redis解压+windows安装+无法启动:1067

Redis下载安装图文教程&#xff08;Windows版_超详细&#xff09; 标题若遇到安装后无法启动&#xff1a;1067 排查方法如下&#xff1a; 1.查询是否有服务占用端口 查看6379的端口也没有被占用&#xff08;netstat -ano | findstr :6379&#xff09; 若有&#xff0c;kill掉…

盛最多水的容器 接雨水【基础算法精讲 02】

盛雨水最多的容器 链接 : 11 盛最多水的容器 思路 : 双指针 &#xff1a; 1.对于两条确定的边界&#xff0c;l和r,取中间的线m与r组成容器&#xff0c;如果m的高度>l的高度&#xff0c;那么整个容器的长度会减小&#xff0c;如果低于l的高度&#xff0c;那么不仅高度可…

54、数组--模拟

LCR 146. 螺旋遍历二维数组 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到提取完所有…

SpringBoot整合数据库连接

JDBC 1、数据库驱动 JDBC&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;即Java数据库连接。简而言之&#xff0c;就是通过Java语言来操作数据库。 JDBC是sun公司提供一套用于数据库操作的接口. java程序员只需要面向这套接口编程即可。不同的数据库厂商&…

C++八股

1、简述一下C中的多态 在面向对象中&#xff0c;多态是指通过基类的指针或引用&#xff0c;在运行时动态调用实际绑定对象函数的行为&#xff0c;与之相对应的编译时绑定函数称为静态绑定。 静态多态 静态多态是编译器在编译期间完成的&#xff0c;编译器会根据实参类型来选择…

国庆10.1

用select实现服务器并发 ser #include <myhead.h> #define ERR_MSG(msg) do{\fprintf(stderr, "__%d__", __LINE__);\perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.1.205" //本机…

ARMv7-A 那些事 - 5.CP15协处理器

By: Ailson Jack Date: 2023.10.01 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/157.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

14:STM32-----看门狗

目录 一:看门狗 1:WDG 2:独立看门狗 (IWDG) A:IWDG框图 B:IWDG_KR键寄存器 C:IWDG超时时间 3:窗口看门狗 (WWDG) A:WWDG框图 B:WWDG工作特性 C:WWDG超时时间 4:独立看门狗和窗口看门狗的区别 5:数据手册 二:案例 A:独立看门狗 1:连接图 2:步骤 3:函数介绍 3:代…

网络爬虫——urllib(2)

前言&#x1f36d; ❤️❤️❤️网络爬虫专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Python网络爬虫_热爱编程的林兮的博客-CSDN博客 前篇讲解了urllib的基本使用、一个类型六个方法与下载相关内容&#xff0…

《深入浅出OCR》第二章:OCR技术发展与分类

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨‍💻面向对象: 本篇前言知识主要介绍深度学习知识,全面总结知知识…

Python3数据科学包系列(一):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 认识下数据科学中数据处理基础包: (1)NumPy 俗话说: 要学会跑需先…

C++核心编程--多态篇

4.7、多态 4.7.1、多态的基本概念 多态是C面向对象三大特征之一 多态分为两类 静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数地址早…

Eclipse 主网即将上线迎空投预期,Zepoch 节点或成受益者?

目前&#xff0c;Zepoch 节点空投页面中&#xff0c;模块化 Layer2 Rollup 项目 Eclipse 出现在其空投列表中。 配合近期 Eclipse 宣布了其将由 SVM 提供支持的 Layer2 主网架构&#xff0c;并将在今年年底上线主网的消息后&#xff0c;不免引发两点猜测&#xff1a;一个是 Ecl…

springcloud:四、nacos介绍+启动+服务分级存储模型/集群+NacosRule负载均衡

nacos介绍 nacos是阿里巴巴提供的SpringCloud的一个组件&#xff0c;算是eureka的替代品。 nacos启动 安装过程这里不再赘述&#xff0c;相关安装或启动的问题可以见我的另一篇博客&#xff1a; http://t.csdn.cn/tcQ76 单价模式启动命令&#xff1a;进入bin目录&#xff0…

某房产网站登录RSA加密分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码4. 还原加密 1. 写在前面 今天是国庆节&#xff0c;首先祝福看到这篇文章的每一个人节日快乐&#xff01;假期会老的这些天一直在忙事情跟日常带娃&#xff0c;抽不出一点时间来写东西。夜深了、娃也睡了。最近湖南开始降温了&…

SimpleCG动画示例--汉诺塔动画演示

前言 SimpleCG的使用方法在前面已经介绍了许多&#xff0c;有兴趣的同学如果有去动手&#xff0c;制作一些简单动画应该没多大问题的。所以这次我们来演示一下简单动画。我们刚学习C语言的递归函数时&#xff0c;有一个经典例子相信很多同学都写过&#xff0c;那就是汉诺塔。那…

【算法优选】双指针专题——壹

文章目录 &#x1f60e;前言&#x1f334;[移动零](https://leetcode.cn/problems/move-zeroes/)&#x1f6a9;题⽬描述&#xff1a;&#x1f6a9;算法思路&#x1f6a9;算法流程&#x1f6a9;代码实现 &#x1f340;[复写零](https://leetcode.cn/problems/duplicate-zeros/)&…