开源数据库 - mysql - innodb源码阅读 - master线程(一)

master struct

/** The master thread controlling the server. */void srv_master_thread() {DBUG_TRACE;srv_slot_t *slot; // 槽位THD *thd = create_internal_thd(); // 创建内部线程ut_ad(!srv_read_only_mode); //断言 srv_read_only_mode 为 falsesrv_main_thread_process_no = os_proc_get_number(); // 进程号srv_main_thread_id = std::this_thread::get_id(); // 线程号slot = srv_reserve_slot(SRV_MASTER); // 保留槽位ut_a(slot == srv_sys->sys_threads); // 断言 srv_sys->sys_threads 为 slotsrv_master_main_loop(slot); // 主循环srv_master_pre_dd_shutdown_loop(); // 执行 pre_dd_shutdown 任务os_event_set(srv_threads.m_master_ready_for_dd_shutdown); // 设置事件/* This is just for test scenarios. */srv_thread_delay_cleanup_if_needed(true); // 延迟清理线程while (srv_shutdown_state.load() < SRV_SHUTDOWN_MASTER_STOP) { // 等待srv_shutdown_state 为 SRV_SHUTDOWN_MASTER_STOPsrv_master_wait(slot); // 等待事件}srv_master_shutdown_loop(); // 执行 shutdown 任务srv_main_thread_op_info = "exiting"; // 操作信息destroy_internal_thd(thd); // 销毁内部线程}

当前代码是InnoDB存储引擎中主(master)线程的实现部分。主线程负责控制和管理整个InnoDB存储引擎的运行。以下是对代码的详细解释:

  1. 函数声明和初始化

    void srv_master_thread() {DBUG_TRACE;srv_slot_t *slot;THD *thd = create_internal_thd();ut_ad(!srv_read_only_mode);srv_main_thread_process_no = os_proc_get_number();srv_main_thread_id = std::this_thread::get_id();slot = srv_reserve_slot(SRV_MASTER);ut_a(slot == srv_sys->sys_threads);
    
    • DBUG_TRACE:这是一个调试宏,用于在调试模式下输出跟踪信息。
    • create_internal_thd():创建一个内部线程句柄(THD)。
    • ut_ad(!srv_read_only_mode):断言服务器不是只读模式。
    • srv_main_thread_process_nosrv_main_thread_id:获取并设置主线程的进程号和线程ID。
    • srv_reserve_slot(SRV_MASTER):为主线程保留一个槽位(slot)。
    • ut_a(slot == srv_sys->sys_threads):断言保留的槽位是系统线程。
  2. 主循环

      srv_master_main_loop(slot);srv_master_pre_dd_shutdown_loop();os_event_set(srv_threads.m_master_ready_for_dd_shutdown);srv_thread_delay_cleanup_if_needed(true);while (srv_shutdown_state.load() < SRV_SHUTDOWN_MASTER_STOP) {srv_master_wait(slot);}srv_master_shutdown_loop();
    
    • srv_master_main_loop(slot):执行主循环,处理各种任务和检查点。
    • srv_master_pre_dd_shutdown_loop():在DD(数据字典)操作前执行关闭任务。
    • os_event_set(srv_threads.m_master_ready_for_dd_shutdown):设置事件,表示主线程准备好进行DD操作。
    • srv_thread_delay_cleanup_if_needed(true):延迟清理线程,如果需要的话。
    • while (srv_shutdown_state.load() < SRV_SHUTDOWN_MASTER_STOP)... srv_master_wait(slot):等待直到关闭状态达到SRV_SHUTDOWN_MASTER_STOP
    • srv_master_shutdown_loop():执行关闭循环,处理最后的关闭任务。
  3. 线程清理

      srv_main_thread_op_info = "exiting";destroy_internal_thd(thd);
    }
    
    • srv_main_thread_op_info = "exiting":设置主线程操作信息为“exiting”。
    • destroy_internal_thd(thd):销毁内部线程句柄,释放资源。

总结来说,这段代码实现了InnoDB存储引擎的主线程,负责管理和控制整个存储引擎的运行,包括处理任务、执行检查点、关闭操作等。

master main_loop

/** Executes the main loop of the master thread.@param[in]   slot     slot reserved as SRV_MASTER */static void srv_master_main_loop(srv_slot_t *slot) {if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) {/* When innodb_force_recovery is at least SRV_FORCE_NO_BACKGROUND,we avoid performing active/idle master's tasks. However, we stillneed to ensure that:srv_shutdown_state >= SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS,after we exited srv_master_main_loop(). Keep waiting until thatis satisfied and then exit. */while (srv_shutdown_state.load() <SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS) {srv_master_wait(slot);}return;}ulint old_activity_count = srv_get_activity_count();while (srv_shutdown_state.load() <SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS) {srv_master_sleep();MONITOR_INC(MONITOR_MASTER_THREAD_SLEEP);/* Just in case - if there is not much free space in redo,try to avoid asking for troubles because of extra workperformed in such background thread. */srv_main_thread_op_info = "checking free log space";log_free_check();if (srv_check_activity(old_activity_count)) {old_activity_count = srv_get_activity_count();srv_master_do_active_tasks();} else {srv_master_do_idle_tasks();}/* Purge any deleted tablespace pages. */fil_purge();}}

这段代码定义了一个名为 srv_master_main_loop 的静态函数,它是 InnoDB 存储引擎中主循环的一部分。这个函数在主线程中执行,负责处理各种任务,包括检查和处理活动、执行空闲任务、检查日志空间以及清理删除的表空间页面。

函数的参数是一个指向 srv_slot_t 类型的指针 slot,这个指针指向一个预留的槽位,通常用于线程间的通信。

函数的逻辑如下:

  1. 首先,函数检查 srv_force_recovery 变量的值。如果这个值大于等于 SRV_FORCE_NO_BACKGROUND,则表示 InnoDB 处于强制恢复模式,此时主循环不会执行任何后台任务。相反,它会等待 srv_shutdown_state 变量的值达到 SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS,然后退出循环。

  2. 如果没有处于强制恢复模式,函数会进入一个无限循环,直到 srv_shutdown_state 变量的值达到 SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS

  3. 在循环内部,函数首先调用 srv_master_sleep 函数,让主线程休眠 1 秒。

  4. 然后,函数增加 MONITOR_MASTER_THREAD_SLEEP 监控计数器的值,表示主线程已经休眠。

  5. 接着,函数检查日志空间的可用情况,如果可用空间不足,它会尝试避免执行额外的工作,以防止出现问题。

  6. 之后,函数检查活动计数,如果活动计数发生变化,它会调用 srv_master_do_active_tasks 函数执行活跃任务;如果活动计数没有变化,它会调用 srv_master_do_idle_tasks 函数执行空闲任务。

  7. 最后,函数调用 fil_purge 函数,清理删除的表空间页面。

总的来说,这个函数负责管理主线程的活动,确保在适当的时候执行必要的任务,同时避免在不必要的时候执行过多的工作,以保持系统的稳定性和性能。

srv_master_main_loop 的静态函数,它是 InnoDB 存储引擎中主(master)线程的主要循环。这个函数负责处理服务器的各种活动,包括检查点、日志管理、线程调度等。以下是对代码的详细解释:

  1. 函数声明和参数

    static void srv_master_main_loop(srv_slot_t *slot) {
    
    • srv_slot_t *slot:这是一个指向 srv_slot_t 类型的指针,用于标识线程的槽位。
  2. 强制恢复级别检查

    if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) {/* When innodb_force_recovery is at least SRV_FORCE_NO_BACKGROUND,we avoid performing active/idle master's tasks. However, we stillneed to ensure that:srv_shutdown_state >= SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS,after we exited srv_master_main_loop(). Keep waiting until thatis satisfied and then exit. */while (srv_shutdown_state.load() <SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS) {srv_master_wait(slot);}return;
    }
    
    • 这段代码检查 srv_force_recovery 的值,如果它大于等于 SRV_FORCE_NO_BACKGROUND,则主循环会等待直到 srv_shutdown_state 大于等于 SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS,然后退出循环。
  3. 主循环

    ulint old_activity_count = srv_get_activity_count();while (srv_shutdown_state.load() <SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS) {srv_master_sleep();MONITOR_INC(MONITOR_MASTER_THREAD_SLEEP);/* Just in case - if there is not much free space in redo,try to avoid asking for troubles because of extra workperformed in such background thread. */srv_main_thread_op_info = "checking free log space";log_free_check();if (srv_check_activity(old_activity_count)) {old_activity_count = srv_get_activity_count();srv_master_do_active_tasks();} else {srv_master_do_idle_tasks();}/* Purge any deleted tablespace pages. */fil_purge();
    }
    
    • ulint old_activity_count = srv_get_activity_count();:获取当前的活动计数。
    • while (srv_shutdown_state.load() < SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS) {...}:主循环会一直运行,直到 srv_shutdown_state 大于等于 SRV_SHUTDOWN_PRE_DD_AND_SYSTEM_TRANSACTIONS
    • srv_master_sleep();:主线程睡眠 1 秒。
    • MONITOR_INC(MONITOR_MASTER_THREAD_SLEEP);:增加监控器中主线程睡眠的计数。
    • srv_main_thread_op_info = "checking free log space";:设置主线程的操作信息为“检查空闲日志空间”。
    • log_free_check();:检查日志文件的空闲空间。
    • if (srv_check_activity(old_activity_count)) {...}:检查活动计数是否有变化,如果有,则执行 srv_master_do_active_tasks();否则,执行 srv_master_do_idle_tasks()
    • fil_purge();:清除任何已删除的表空间页面。

总结来说,这段代码实现了 InnoDB 存储引擎的主循环,负责管理和控制整个存储引擎的运行,包括处理任务、执行检查点、关闭操作等。

通过 srv_master_main_loop 函数,InnoDB 可以实现对线程的精细控制和管理。
InnoDB 的 master 线程主循环主要负责管理和维护数据库的运行状态。具体来说,它执行以下任务:

  1. 检查和处理活动:master 线程会定期检查数据库的活动情况,包括事务的提交、回滚、锁的释放等。如果发现有需要处理的活动,它会调用相应的函数进行处理。

  2. 执行空闲任务:如果没有紧急的活动需要处理,master 线程会执行一些空闲任务,例如清理过期的日志、检查和优化索引等。

  3. 检查日志空间:master 线程会定期检查日志文件的可用空间,如果空间不足,它会采取措施释放空间,例如进行日志切换或删除旧的日志文件。

  4. 清理删除的表空间页面:当表空间中的页面被标记为删除时,master 线程会调用 fil_purge 函数来清理这些页面,释放存储空间。

  5. 等待和处理事件:在某些情况下,master 线程可能需要等待特定的事件发生,例如等待其他线程完成某些任务。一旦事件发生,它会相应地处理这些事件。

  6. 执行关闭前的准备工作:当数据库需要关闭时,master 线程会执行一系列的准备工作,例如等待所有事务完成、将脏页刷新到磁盘、关闭所有打开的文件和连接等。

  7. 执行关闭任务:在关闭过程中,master 线程会执行一些特定的关闭任务,例如清理资源、更新元数据等。

  8. 监控和报告状态:master 线程会监控数据库的运行状态,并通过一些监控计数器和状态信息来报告当前的运行情况。

总的来说,master 线程主循环是 InnoDB 存储引擎的核心部分,它确保数据库能够稳定、高效地运行,并在需要时正确地处理各种任务和事件。

扩展

线程与槽位

线程和槽在计算机编程和操作系统领域中各自扮演着重要的角色,并且它们之间存在一定的关联,特别是在某些特定的框架或系统中(如Qt或Suricata)。以下是对线程和槽的详细解释:

线程

  1. 定义:线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。每个线程都拥有一个执行的指令序列,该序列决定了线程的功能。

  2. 作用

    • 提高系统效率:通过并发执行多个线程,可以更充分地利用多核处理器,提高系统的整体效率。
    • 简化编程模型:线程提供了一种比进程更轻量级的并发执行方式,使得程序员可以更容易地编写并发程序。
    • 资源共享:线程共享其所属进程的地址空间和资源,这有助于减少资源开销和简化资源管理。

槽(Slot)

  1. 定义:槽在不同的上下文中可能有不同的含义。在编程中,槽通常指的是一种机制或数据结构,用于存储和调用特定的函数或方法。特别是在某些事件驱动或信号槽机制的框架中(如Qt),槽是指与信号相关联的函数或方法,当信号被触发时,槽函数会被调用执行。

  2. 在特定系统中的作用(以Suricata为例):

    • 模块管理:在Suricata中,槽(Slot)用于管理不同的模块。每个线程都包含一个槽的链表,每个槽结点都悬挂着不同的模块。程序执行时会遍历槽链表,按照加入链表的顺序执行模块。
    • 函数指针:槽中包含了函数指针,用于指向模块的各种处理函数,如初始化函数、数据包获取函数、退出打印函数等。这使得系统能够灵活地调用不同的模块处理函数,实现特定的功能。

线程与槽的关联

  1. 事件驱动:在事件驱动的编程模型中,线程和槽紧密配合工作。线程负责监听和处理事件,而槽则作为事件处理函数的存储和调用机制。当事件发生时,线程会触发相应的槽函数来处理该事件。
  2. 信号槽机制:在某些框架中(如Qt),线程和槽通过信号槽机制进行通信。信号由某个线程发出,而槽函数则可以在不同的线程中被调用执行。这实现了线程间的解耦和异步通信。

综上所述,线程和槽在编程和操作系统中各自发挥着重要的作用。线程提供了并发执行的能力,而槽则提供了一种灵活的事件处理机制。它们之间的关联使得系统能够更高效地处理并发事件和任务。

srv_slot_t *slot; 这个变量在 InnoDB 存储引擎中用于管理线程的槽位(slot)。在 InnoDB 中,每个线程都需要一个槽位来存储其状态和相关信息。这个槽位是通过 srv_reserve_slot 函数分配的,并且在线程的生命周期内保持不变。

具体来说,slot 变量的作用包括:

  1. 线程标识:每个槽位都有一个唯一的标识符,用于区分不同的线程。
  2. 线程状态管理:槽位中存储了线程的当前状态,例如是否正在运行、是否被挂起等。
  3. 事件通知:通过槽位中的事件(event),可以实现线程间的同步和通信。
  4. 资源管理:槽位还可以用于管理线程的资源,例如内存分配、文件描述符等。

在当前的代码片段中,slot 变量是在 srv_master_thread 函数中声明的,用于为主线程分配一个槽位。在后续的代码中,这个槽位将被用于主线程的各种操作,例如等待事件、执行任务等。

以下是 slot 变量在代码中的具体使用示例:

slot = srv_reserve_slot(SRV_MASTER);
ut_a(slot == srv_sys->sys_threads);

在这段代码中,srv_reserve_slot 函数为主线程分配了一个槽位,并将其赋值给 slot 变量。然后,通过 ut_a 断言确保分配的槽位是正确的。

在 InnoDB 中,线程的槽位管理是非常重要的,因为它确保了线程的正确调度和资源的有效利用。通过 slot 变量,InnoDB 可以实现对线程的精细控制和管理。

SRV_FORCE_NO_BACKGROUND

SRV_FORCE_NO_BACKGROUND 是 MySQL InnoDB 存储引擎中的一个恢复模式参数,具体含义和作用如下:

含义

SRV_FORCE_NO_BACKGROUND 是 InnoDB 存储引擎在启动或恢复过程中可以使用的一个参数,用于控制 InnoDB 主线程(master thread)和后台清理线程(purge thread)的行为。

作用

当设置 SRV_FORCE_NO_BACKGROUND 参数时,它会阻止 InnoDB 的主线程和后台清理线程运行。这通常用于在数据库无法正常启动或存在严重损坏时,允许数据库以最小化风险的方式启动,以便进行数据恢复或其他维护操作。

具体来说,阻止这些线程运行可以防止在数据库启动过程中执行可能引发崩溃的操作,如 full purge 操作(完全清理已删除的数据页)。这有助于在数据库损坏时保持稳定,并允许管理员有机会进行进一步的诊断和修复。

使用场景

SRV_FORCE_NO_BACKGROUND 参数通常用于以下场景:

  1. 数据库无法正常启动:当数据库由于某种原因(如损坏、配置错误等)无法正常启动时,可以使用此参数尝试启动数据库,以便进行进一步的诊断和修复。
  2. 数据恢复:在数据恢复过程中,可能需要阻止后台线程的运行,以避免它们干扰恢复过程或进一步损坏数据。
  3. 紧急维护:在某些紧急情况下,可能需要立即启动数据库以进行某些必要的维护操作,而此时无法等待后台线程完成其任务。

注意事项

  1. 风险:使用 SRV_FORCE_NO_BACKGROUND 参数可能会带来一定的风险,因为它会阻止 InnoDB 存储引擎的正常清理和维护操作。因此,在启用此参数之前,应确保已经备份了所有重要数据。
  2. 临时使用:此参数通常应作为临时解决方案使用,以便进行进一步的诊断和修复。一旦问题解决,应尽快关闭此参数,以恢复 InnoDB 存储引擎的正常运行。
  3. 文档和社区:在决定使用此参数之前,建议查阅 MySQL 官方文档或相关社区论坛,以获取更多关于此参数的信息和使用建议。

综上所述,SRV_FORCE_NO_BACKGROUND 是 MySQL InnoDB 存储引擎中的一个重要恢复模式参数,用于在特定情况下控制 InnoDB 主线程和后台清理线程的行为。在使用此参数时,应谨慎考虑其潜在的风险和限制,并确保已经采取了适当的数据备份和恢复措施。

参考资料

mysql源码 srv0srv.cc
MarsCode AI
文心一言

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

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

相关文章

RocketMQ 自动注入消费者

目录 前言一、情景介绍二、问题分析三、代码实现 前言 之前接到一个需求&#xff0c;我们项目的技术负责人希望通过配置的形式&#xff0c;在项目启动的时候自动根据配置生成对应的消费者 觉得还有点意思&#xff0c;随即记录一下~ 一、情景介绍 比如我这里有一个消费者 Mes…

数据结构(C语言版)(第2版) 课后习题答案 李冬梅

数据结构(C语言版)(第2版) 第1章 绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数…

Vue 自定义icon组件封装SVG图标

通过自定义子组件CustomIcon.vue使用SVG图标&#xff0c;相比iconfont下载文件、重新替换更节省时间。 子组件包括&#xff1a; 1. Icons.vue 存放所有SVG图标的path 2. CustomIcon.vue 通过icon的id索引对应的图标 使用的时候需要将 <Icons></Icons> 引到使用的…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.9-4.10

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.9 内容代价函数&#xff08;Content cos…

LeetCode46. 全排列(2024秋季每日一题 57)

给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2&#xff1a; 输入&#xff1a;nums …

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

MySQL 数据表常用编码类型解析

文章目录 MySQL 数据表常用编码类型解析一、字符集与编码简介二、MySQL 中的常用编码类型1. ASCII 编码2. Latin1 编码3. UTF-8 编码4. UTF-8mb4 编码5. UTF-16 编码 三、如何选择合适的编码类型四、编码转换和兼容性问题五、总结 MySQL 数据表常用编码类型解析 在 MySQL 数据库…

LLM训练”中的“分布式训练并行技术;分布式训练并行技术

目录 “LLM训练”中的“分布式训练并行技术” 分布式训练并行技术 数据并行 流水线并行:按阶段(stage)进行切分 张量并行 序列并行 多维混合并行 自动并行 MOE并行 重要的分布式AI框架 “LLM训练”中的“分布式训练并行技术” 随着深度学习技术的不断发展,特别是…

Ubuntu开启FTP与SSH服务

在配置开发环境时&#xff0c;这两个配置感觉是最有用的&#xff0c;开启FTP服务可以将远程linux上的文件映射到Windows上&#xff0c;不管是使用虚拟机还是嵌入式linux设备&#xff0c;特别在开发写代码的时候&#xff0c;映射到Windows上使用VS code打开编写比在linux上编写舒…

虚拟现实技术及其在教育领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 虚拟现实技术及其在教育领域的应用 虚拟现实技术及其在教育领域的应用 虚拟现实技术及其在教育领域的应用 引言 虚拟现实技术概述…

搜维尔科技:Varjo XR-4在教育科研领域应用

医学教育与培训&#xff1a; • 解剖学教学&#xff1a;传统的解剖学教学依赖于教科书、图片或实体标本&#xff0c;学生对于人体结构的空间关系理解存在一定难度。而使用Varjo头显&#xff0c;学生可以沉浸在虚拟的人体解剖环境中&#xff0c;全方位、多角度地观察人体的各个…

Java 源码中的 Unicode 逃逸问题,别被注释给骗了

背景 看了一段项目源码&#xff0c;定义了一个 List 对象&#xff0c;往该列表对象 add 的代码前面有注释符号&#xff0c;但是程序运行时列表中却存在对象&#xff0c;为什么呢&#xff1f;仔细看了一下&#xff0c;注释符号和 add 代码之间有一个特殊符号 \u000d&#xff0c…

基于python的机器学习(一)—— 基础知识(Scikit-learn安装)

目录 一、机器学习基础 1.1 机器学习概述 1.2 监督学习、无监督学习和强化学习 1.3 聚类、分类、回归、标注 1.3.1 聚类 1.3.2 分类 1.3.3 回归 1.3.4 标注 1.4 机器学习、人工智能和数据挖掘 1.5 机器学习的三个要素 二、Scikit-learn 机器学习库 2.1 Scikit-lea…

React 入门课程 - 使用CDN编程React

1. 第一个React 注意&#xff1a;在vscode里&#xff0c;使用Live Server来运行html文件。 index.html <html><head><link rel"stylesheet" href"index.css"><script crossorigin src"https://unpkg.com/react17/umd/react.de…

23isctf

where_is_the_flag 1.打开环境&#xff0c;上面有一句话木马&#xff0c;直接蚁剑上 flag1&#xff1a;蚁剑连接上就可以直接看见&#xff0c;FLAG1:Yunxi{d0c0 flag2:在根目录下就有 797a-4697- flag3&#xff1a; 在主页面有一个start.sh里面有提示信息 4dfe-9b48-50ff…

MySQL 【流程控制】函数

目录 1、CASE 语句用于流程控制中的多分支情况。 2、IF() 函数根据测试条件是否为真分别返回指定的值。 3、IFNULL() 函数&#xff0c;如果第一个参数为 NULL&#xff0c;返回第二个参数&#xff0c;否则返回第一个参数。 4、NULLIF() 函数根据两个参数是否相等决定返回 NUL…

【Rust中多线程同步机制】

Rust中多线程同步机制 多线程编程Rust中的多线程编程thread::spawnmove Rust中的线程间同步机制Rust线程间同步机制之MutexRust线程间同步机制之读写锁Rust线程同步机制之条件变量Rust中的信号量Rust中的Atomic Rust中线程间的数据传递总结 多线程编程 多线程编程&#xff0c;…

传统RAG流程;密集检索器,稀疏检索器:中文的M3E

目录 传统RAG流程 相似性搜索中:神经网络的密集检索器,稀疏检索器 密集检索器 BGE系列模型 text-embedding-ada-002模型 M3E模型 稀疏检索器 示例一:基于TF-IDF的稀疏检索器 示例二:基于BM25的稀疏检索器 稀疏检索器的特点与优势 传统RAG流程 相似性搜索中:神经…

黑马程序员linux学习【持续更新】

Linux基础 一、Linux简介 1.分类 不同领域的主流操作系统&#xff0c;主要分为下 几类&#xff1a;桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。 桌面操作系统 操作系统特点Windows用户数量最多MacOS操作体验好&#xff0c;办公人士首选Linux用户数…

2024强网杯Proxy

代码审计 首先分析go语言代码 package mainimport ("bytes""io""net/http""os/exec""github.com/gin-gonic/gin" )type ProxyRequest struct {URL string json:"url" binding:"req…