Linux电源管理(3)_关机和重启的过程
原文:Linux电源管理(3)_Generic PM之重新启动过程
1.前言
在使用计算机的过程中,关机和重启是最先学会的两个操作。同样,这两个操作在Linux中也存在,可以关机和重启。这就是这里要描述的对象。在Linux Kernel中,主流的关机和重新启动都是通过“ reboot”系统调用(具体可参考kernel / sys.c)来实现的。另外,除了我们常用的shutdown和restart两类操作之外,该系统调用也提供了其他的reboot方式,也会在这里一一说明。
2.内核支持的reboot方式
也许你会奇怪,reboot是重启的意思,所以用它实现Restart是合理的,但怎么用它实现关机操作呢?答案是这样的:关机之后,早晚也会开机啊!所以关机是一种特殊的重新启动过程,只不过持续的时间有点长而已。所以,内核根据不同的表现方式,将重新启动分成如下的几种方式:
1: / *
2: * _reboot()系统调用接受的命令。
3: *
4: *重新启动使用默认命令和模式重新启动系统。
5: * HALT停止OS,并将系统控制权交给ROM监视器(如果有)。
6: * CAD_ON Ctrl-Alt-Del序列导致RESTART命令。
7: * CAD_OFF Ctrl-Alt-Del序列将SIGINT发送到初始化任务。
8: * POWER_OFF如果可能,请停止OS并从系统中断开所有电源。
9: * RESTART2使用给定的命令字符串重新启动系统。
10: * SW_SUSPEND使用软件挂起的挂起系统(如果已编译)。
11: * KEXEC使用先前加载的Linux内核重新启动系统
12: * /
13:
14: #define LINUX_REBOOT_CMD_RESTART 0x01234567
15: #define LINUX_REBOOT_CMD_HALT 0xCDEF0123
16: #define LINUX_REBOOT_CMD_CAD_ON 0x89ABCDEF
17: #define LINUX_REBOOT_CMD_CAD_OFF 0x00000000
18: #define LINUX_REBOOT_CMD_POWER_OFF 0x4321FEDC
19: #define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4
20: #define LINUX_REBOOT_CMD_SW_SUSPEND 0xD000FCE2
21: #define LINUX_REBOOT_CMD_KEXEC 0x4558454
操作类型 | 英文全称/别名 | 功能描述 | 备注 |
RESTART | Restart | 正常重启系统,重新加载内核和用户空间。 | 用户最常用的重启方式,等同于 reboot 命令。 |
HALT | Halt | 停止操作系统,将控制权交给其他代码(如 BIOS/UEFI 或监控程序)。 | 表现形式依赖具体硬件实现,可能完全断电或进入低功耗状态。 |
CAD_ON/CAD_OFF | Ctrl+Alt+Del On/Off | 允许/禁止通过 Ctrl+Alt+Del 组合键触发重启(RESTART)。 | 需键盘驱动支持,默认行为由内核配置决定。 |
POWER_OFF | Power Off | 正常关机,停止操作系统并切断电源(ACPI 状态 S5 )。 | 等同于 poweroff 命令,需硬件支持完全断电。 |
RESTART2 | Restart with Command | 重启时携带自定义字符串( cmd ),传递给关注重启事件的进程或机器相关代码。 | 用途由设备厂商自定义(如安卓的恢复模式)。 |
SW_SUSPEND | Software Suspend | 挂起到内存(Suspend-to-RAM)或磁盘(Hibernate),进入低功耗状态。 | 依赖 CONFIG_SUSPEND 内核选项,详见后续休眠专题。 |
KEXEC | Kernel Execute | 跳过 BIOS/UEFI,直接重启到预加载的其他内核镜像(需 CONFIG_KEXEC 支持)。 | 用于快速内核热替换或崩溃恢复(如 kexec -l 加载新内核)。 |
3.重新启动相关的操作流程
在Linux操作系统中,可以通过重新启动,停止,关闭电源等命令,启动重新启动,具体的操作流程如下:
一般的Linux操作系统,在用户空间都提供了一些工具集合(如常在嵌入式系统使用的Busybox),这些工具集合包含了重新引导,停止和关机三个和重新引导相关的命令。
用户空间程序通过reboot系统调用,进入内核空间,内核空间根据执行路径的不同,提供了kernel_restart,kernel_halt和kernel_power_off三个处理函数,响应用空间的reboot请求这三个处理函数的处理流程大致相同,主要包括:向有关重新引导过程的进程发送通知事件;调用驱动程序核心模块提供的接口,关闭所有的外部设备;调用驱动程序syscore模块提供的接口,关闭系统核心;调用架构相关的处理函数,进行后续的处理;最后,调用计算机相关的接口,实现真正意义上的重新启动另外,采用TTY模块提供的Sysreq机制,内核提供了其他途径的关机方法,如某些按键组合,向/ proc文件写入命令等
4.重新启动过程的内部动作和代码分析
4.1重启系统调用
重新启动系统调用的实现位于“ kernel / sys.c”,其函数原型如下:
1: SYSCALL_DEFINE4(reboot,int,magic1,int,magic2,unsigned int,cmd,
2: void __user *,arg)
reboot,该系统调用的名称。
magic1,magic2,两个int类型的“魔力数”,用于防止误操作。具体在“ include / uapi / linux / reboot.h”中定义,感兴趣的同学可以去看看(话说这些数字还是蛮有意思的,例如Linus同学及其家人的生日就在里面,猜出来的可以在文章下面留言)。
cmd,第2章所描绘的reboot方式。
arg,其他的额外参数。
reboot系统调用的内部动作比较简单:
1)确定调用者的用户权限,如果不是超级用户(superuser),则直接返回错误(这也是我们再用户空间执行reboot,halt,poweroff等命令时,必须是root用户的原因);
2)判断预测的魔术数是否匹配,如果不匹配,直接返回错误。这样就可以进行的防止误动作发生;
3)调用reboot_pid_ns接口,检查是否需要由该接口处理reboot请求。
4)如果是POWER_OFF命令,且没有注册电源关闭的机器处理函数(pm_power_off),把该命令转换为HALT命令;
5)根据特定的cmd命令,执行具体的处理,包括,
如果是RESTART或RESTART2命令,调用kernel_restart。
如果是CAD_ON或CAD_OFF命令,更新C_A_D的值,则表示允许通过Ctrl + Alt + Del组合键重新启动系统。
如果是HALT命令,调用kernel_halt。
如果是POWER_OFF命令,调用kernel_power_off。
如果是KEXEC命令,调用kernel_kexec接口
如果是SW_SUSPEND,则调用hibernate接口
6)返回上述的处理结果,系统调用结束。
4.2 kernel_restart,kernel_halt和kernel_power_off
1)调用kernel_xxx_prepare函数,进行重新启动/停止/ power_off前的准备工作,包括,
调用blocking_notifier_call_chain接口,向关心reboot事件的进程,发送SYS_RESTART,SYS_HALT或SYS_POWER_OFF事件。并发送出去。
将系统状态设置为相应的状态(SYS_RESTART,SYS_HALT或SYS_POWER_OFF)。
调用usermodehelper_disable接口,禁止用户模式辅助
调用device_shutdown,关闭所有的设备
2)如果是power_off,并且存在PM相关的power off prepare函数(pm_power_off_prepare),则调用该调用函数;
3)调用migrate_to_reboot_cpu接口,将当前的进程(任务)移到一个CPU上;
注2:对于多CPU的机器,无论由哪个CPU触发了当前的系统调用,代码都可以运行在任意的CPU上。这个接口将代码分派到一个特定的CPU上,并禁止调度器分派代码到其他CPU上。首先,这个接口被执行后,只有一个CPU在运行,用于完成后续的重新启动动作。
4)调用syscore_shutdown接口,将系统核心器件关闭(例如中断等);
5)调用printk以及kmsg_dump,向这个世界发出最后的声音(打印日志);
6)最后,由machine-core的代码,接管后续的处理。
4.3 device_shutdown
设备模型中和device_shutdown有关的逻辑包括:
1.每个设备(结构设备)都会保存该设备的驱动(结构设备驱动程序)指针,以及该设备所在的总线(结构总线类型)的指针
2.设备驱动中有一个名称为“ shutdown”的某种函数,用于在device_shutdown时,关闭该设备
3.总线中也有一个名称为“ shutdown”的某种函数,用于在device_shutdown时,关闭该设备
4.系统的所有设备,都存在于“ / sys / devices /”目录下,而该目录由名称为“ devices_kset”的kset表示。kset中会使用一个链表保存其下所有的kobject(也即“ / sys / devices /”目录下的所有设备)。”的最终结果就是,以“ devices_kset”为根目录,将内核中所有的设备(以相应的kobject为代表),组织成一个树状结构
device_shutdown的实现,该接口位于“ drivers / base / core.c”中,执行逻辑如下。
1: / **
2: * device_shutdown-在每个设备上调用-> shutdown()以关闭。
3: * /
4: 无效device_shutdown(void)
5: {
6: 结构设备* dev,* parent;
7:
8: spin_lock(&devices_kset-> list_lock);
9: / *
10: *向后移动设备列表,依次关闭每个设备。
11: *请注意,设备拔出事件也可能会开始拉
12: *设备离线,即使系统正在关闭。
13: * /
14: while (!list_empty(&devices_kset->list)) {
15: dev = list_entry(devices_kset->list.prev, struct device,
16: kobj.entry);
17:
18: /*
19: * hold reference count of device's parent to
20: * prevent it from being freed because parent's
21: * lock is to be held
22: */
23: parent = get_device(dev->parent);
24: get_device(dev);
25: /*
26: * Make sure the device is off the kset list, in the
27: * event that dev->*->shutdown() doesn't remove it.
28: */
29: list_del_init(&dev->kobj.entry);
30: spin_unlock(&devices_kset->list_lock);
31:
32: /* hold lock to avoid race with probe/release */
33: if (parent)
34: device_lock(parent);
35: device_lock(dev);
36:
37: /* Don't allow any more runtime suspends */
38: pm_runtime_get_noresume(dev);
39: pm_runtime_barrier(dev);
40:
41: if (dev->bus && dev->bus->shutdown) {
42: if (initcall_debug)
43: dev_info(dev, "shutdown\n");
44: dev->bus->shutdown(dev);
45: } else if (dev->driver && dev->driver->shutdown) {
46: if (initcall_debug)
47: dev_info(dev, "shutdown\n");
48: dev->driver->shutdown(dev);
49: }
50:
51: device_unlock(dev);
52: 如果(父母)
53: device_unlock(parent);
54:
55: put_device(dev);
56: put_device(父);
57:
58: spin_lock(&devices_kset-> list_lock);
59: }
60: spin_unlock(&devices_kset-> list_lock);
61: async_synchronize_full();
62: }
4.4 system_core_shutdown
系统核心的关机和设备的关机类似,也是从一个链表中,遍历所有的系统核心,并调用它的关机接口。
4.5 machine_restart,machine_halt和machine_power_off
虽然以machine_为预先命名,这三个接口却是属于架构相关的处理函数,如ARM。以ARM为例,它们在“ arch / arm / kernel / process.c”中实现,具体如下。
4.5.1机器重启
1: / *
2: *重新启动要求辅助CPU停止执行任何活动
3: *,同时主CPU重置系统。具有单个CPU的系统可以
4: *使用soft_restart()作为其机器描述符的.restart钩子,因为
5: *将导致唯一可用的CPU复位。具有多个CPU的系统必须
6: *提供硬件重新启动实施,以确保所有CPU立即复位。
7: *这是必需的,以便在主CPU上复位后运行的任何代码
8: *不必与其他CPU协调以确保它们仍然不处于运行状态
9: *执行预重置代码,并使用主CPU的代码希望的RAM
10: *使用。实施这种协调基本上是不可能的。
11: * /
12: void machine_restart(char * cmd)
13: {
14: smp_send_stop();
15:
16: arm_pm_restart(reboot_mode,cmd);
17:
18: / *给失败的宽限期1s * /
19: mdelay(1000);
20:
21: / *糟糕-平台无法重新启动。告诉用户!* /
22: printk(“重新启动失败-系统停止\ n”);
23: local_irq_disable();
24: 而(1);
25: }
0)先转述一下该接口的注释;
对于多CPU的机器而言,重新启动之前必须保证其他的CPU位于非活动状态,由其中一个主CPU负责重新启动动作。并且,必须实现一个基于硬件的重新启动操作,以保证所有CPU同步重启,这是设计的重点!
对于单CPU机器而言,就相对简单了,可以直接用软件reset的方式实现重启。
1)调用smp_send_stop接口,确保其他CPU位于非活动状态;
2)调用机器相关的重启接口,实现真正的重启。该接口是一个变量函数,由“ arch / arm / kernel / process.c”声明,由具体的机器代码实现。格式如下:
void(* arm_pm_restart )(char str,const char * cmd)= null_restart;
EXPORT_SYMBOL_GPL(arm_pm_restart);
3)等待1s;
4)如果没有返回,则重启成功,否则失败,打印错误信息。
4.5.2 machine_halt
ARM的halt很简单,就是将其他CPU停下来,并禁止当前CPU的中断后,死循环!确实,中断被禁止了,又死循环了,不halt才怪。代码如下:
1: / *
2: *停止仅要求辅助CPU停止执行任何操作
3: *活动(执行任务,处理中断)。smp_send_stop()
4: *实现此目标。
5: * /
6: void machine_halt(void)
7: {
8: smp_send_stop();
9:
10: local_irq_disable();
11: 而(1)
12: }
4.5.3 machine_power_off
power off动作和restart类似,即停止其他CPU,调用其他函数。power off的某些函数和restart类似,就不再说明了。
5.总结与思考
5.1建筑和机器的概念
本文是我们在分析Linux内核时第一次遇到架构和机器的概念,顺便解释一下。内核代码中最常见的目录结构就是:arch / xxx / mach-xxx /(例如arch / arm / mach-bcm /)。由该目录结构可知,架构(简称arch)是指具体的体系结构,如ARM,X86等。机器呢,是指具体体系结构下的一个或多个的SOC,如bcm等。
5.2电源管理驱动(和reboot有关的部分)需要实现的内容
由上面的分析可知,在Reboot的过程中,大部分的逻辑是否内核处理的,具体的驱动程序需要关注2点即可:
1)实现各自的关机接口,以正确关闭对应的设备
2)实现机器相关的接口,以确保足够的机器可以正确重启或关闭电源
看来还是很简单的
相关文章:
Linux电源管理(3)_关机和重启的过程
原文:Linux电源管理(3)_Generic PM之重新启动过程 1.前言 在使用计算机的过程中,关机和重启是最先学会的两个操作。同样,这两个操作在Linux中也存在,可以关机和重启。这就是这里要描述的对象。在Linux Ke…...
SQLMesh增量模型实战指南:时间范围分区
引言 在数据工程领域,处理大规模数据集和高频率数据更新是一项挑战。SQLMesh作为一款强大的数据编排工具,提供了增量模型功能,帮助数据工程师高效地管理和更新数据。本文将详细介绍如何使用SQLMesh创建和管理基于时间范围的增量模型…...
LeetCode -160.相交链表
题目 160. 相交链表 - 力扣(LeetCode) 解法一 哈希表 哈希表解决方案的思路 这个使用哈希表(unordered_set)的解决方案基于一个简单的观察:如果两个链表相交,那么相交点及之后的所有节点都是两个链表共…...
针对Linux挂载NAS供Minio使用及数据恢复的需求
针对Linux挂载NAS供Minio使用及数据恢复的需求,设计以下分阶段解决方案: 一、存储架构设计 存储拓扑 [Minio Server] --> [NAS挂载点 (/mnt/nas/minio-data)] --> [企业级NAS设备]│└─[备份服务器/存储] (可选异地备份)组件版本要求 Minio版本&a…...
【大厂实战】API网关进化史:从统一入口到智能AB分流,如何构建灰度无感知系统?
【大厂实战】API网关进化史:从统一入口到智能AB分流,如何构建灰度无感知系统? 1. 为什么API网关是AB面架构的天然起点? 在分布式微服务架构中,API网关(API Gateway)承担着重要职责:…...
开放平台架构方案- GraphQL 详细解释
GraphQL 详细解释 GraphQL 是一种用于 API 的查询语言,由 Facebook 开发并开源,旨在提供一种更高效、灵活且强大的数据获取和操作方式。它与传统的 REST API 有显著不同,通过类型系统和灵活的查询能力,解决了 REST 中常见的过度获…...
使用 TypeScript 开发并发布一个 npm 包(完整指南)
本教程将一步步教你从零开发、打包并发布一个 TypeScript 工具库到 npm。以日期时间格式化工具为例,涵盖项目初始化、Vite 打包、类型声明输出、npm 配置、实际发布等完整流程,适合开发者直接套用。 文章目录 📁 项目结构预览🧱 初…...
在Anolis OS 8上部署Elasticsearch 7.16.1与JDK 11的完整指南
目录 1. 环境与版本选择 1.1 操作系统选择:Anolis OS 8 1.2 版本匹配说明 1.3 前置条件检查 2. JDK 11安装与配置 2.1 安装流程 2.2 配置详解 3. Elasticsearch 7.16.1安装与优化 3.1 基础安装 3.2 目录规划与权限 3.3 核心配置文件详解 3.4 JVM调优 4. 用户权限管…...
SELinux 从理论到实践:深入解析与实战指南
文章目录 引言:为什么需要 SELinux?第一部分:SELinux 核心理论1.1 SELinux 的三大核心模型1.2 安全上下文(Security Context)1.3 策略语言与模块化 第二部分:实战操作指南2.1 SELinux 状态管理2.2 文件上下…...
巧用 `unittest.mock` 模块实现依赖服务隔离测试
巧用 unittest.mock 模块实现依赖服务隔离测试 引言 在软件开发过程中,单元测试是保障代码质量的核心手段。然而,许多代码依赖于外部服务,如数据库、API 或文件系统,直接进行测试可能会导致: 环境不可控:测试数据可能变化,影响测试结果的稳定性。执行时间长:依赖外部…...
水利三维可视化平台怎么做?快速上手的3步指南
分享大纲: 1、了解水利三维可视化平台 2、选择合适的开发平台 3、快速搭建水利三维可视化平台 第一步:了解水利三维可视化平台 水利三维可视化平台是利用大数据、物联网、数字孪生等技术,将物理实体数字化建模,并通过三维可视化技…...
【DB2】逻辑导出导入注意事项
DB2异构操作系统之间迁移需选择逻辑备份恢复 导出环节 1、设置字符集,源端创建导出目录,并导出数据库DDL db2set db2codepage1208 db2stop force db2start db2look -d YS-e -l -o -createdb db2look_YS.sql导出文件:db2look_YS.sql –详细参数请参考…...
Fiddler抓取APP端,HTTPS报错全解析及解决方案(一篇解决常见问题)
环境:雷电模拟器Android9系统 你所遇到的fiddler中抓取HTTPS的问题可以分为三类:一类是你自己证书安装上逻辑错误,另一种是APP中使用了“证书固定”的手段。三类fiddler中生成证书时的参数过程。 1.Fiddler证书安装上的逻辑错误 更新Opt…...
C语言教程(二十三):C 语言强制类型转换详解
一、强制类型转换的概念 强制类型转换是指在程序中手动将一个数据类型的值转换为另一种数据类型。在某些情况下,编译器可能不会自动进行类型转换,或者自动转换的结果不符合我们的预期,这时就需要使用强制类型转换来明确指定要进行的类型转换。…...
阿里云服务器 篇十二:加入 Project Honey Pot 和使用 http:BL
文章目录 系列文章背景前提条件注册和准备注册安装蜜罐捐赠MX记录(可选)添加 QuickLinks(快速链接)使用 http:BL(HTTP黑名单)获取Access Key(访问秘钥)Apache自动拦截黑名单IP模块Http:BL API文档更多实现案例监控IP空间系列文章 阿里云服务器 篇一:申请和初始化 阿里…...
Android 手动删除 AAR jar 包 中的文件
Duplicate class com.xxxa.naviauto.sdk.listener.OnChangeListener found in modules jetified-xxxa-sdk-v1.1.2-release-runtime (:xxx-sdk-v1.1.2-release:) and jetified-xxxb-sdk-1.1.3-runtime (:xxxb-sdk-1.1.3:) A.aar B.aar 有类冲突; 使用 exclude 排除本地aar无效…...
Tomcat 部署配置指南
## 1. 环境要求 - JDK 8 或更高版本 - Tomcat 8.5/9.x/10.x - Windows 操作系统 ## 2. 安装步骤 ### 2.1 安装JDK 1. 下载并安装JDK 2. 配置环境变量: - JAVA_HOME: JDK安装目录 - Path: 添加 %JAVA_HOME%\bin 3. 验证安装:打开命令提示符&#…...
阿里千问Qwen3技术解析与部署指南 :混合推理架构突破性优势与对DeepSeek R1的全面超越
阿里千问Qwen3技术解析:突破性优势与对DeepSeek R1的全面超越 在2025年4月29日,阿里巴巴发布了新一代开源大模型Qwen3(通义千问3),凭借其创新架构与显著性能提升,迅速成为全球开源AI领域的焦点。本文将从技…...
宾馆一次性拖鞋很重要,扬州卓韵酒店用品详细介绍其材质与卫生标准
宾馆一次性拖鞋在旅途中很重要。它的卫生情况受大家关注。它的舒适度也受大家关注。扬州卓韵酒店用品在这方面经验丰富。其产品质量优良。下面为你详细介绍宾馆一次性拖鞋。 材质选择目前宾馆一次性拖鞋材质多样。常见的有布质、纸质和塑料的。布质拖鞋相对环保舒适。能给脚部…...
推荐系统中 Label 回收机制之【时间窗口设计】
目录 引言一、业务需求:目标导向的窗口设计1.1 用户行为周期决定窗口基础1.2 业务目标驱动窗口粒度1.3 动态场景下的弹性调整 二、数据特性:窗口设计的底层约束2.1 数据分布与稀疏性适配2.2 数据延迟与完整性保障2.3 特征时效性分层 三、算法模型&#x…...
DevExpressWinForms-XtraMessageBox-使用教程
XtraMessageBox-使用教程 一、基础使用:快速弹出标准消息框 XtraMessageBox 的基础使用非常简单,只需调用XtraMessageBox.Show方法即可弹出一个标准的消息框。根据不同的使用需求,Show方法有多种重载形式。 1.1 仅显示提示信息 当我们仅仅…...
ETL数据集成与数据资产的紧密关联,解锁数据价值新密码
数据已然成为企业最为珍贵的资产之一。无论是传统行业巨头,还是新兴的互联网企业,都在积极挖掘数据背后所蕴含的巨大商业价值。而在这个过程中,ETL(Extract,Transform,Load)作为数据处理的关键环…...
【无报错,亲测有效】如何在Windows和Linux系统中查看MySQL版本
如何在Windows和Linux系统中查看MySQL版本 MySQL作为最流行的开源关系型数据库管理系统之一,了解如何查看其版本信息对于开发者和数据库管理员来说是常用的一个基本操作。本文将详细介绍在Windows和Linux系统中查看MySQL版本的方法。 文章目录 如何在Windows和Linu…...
【Leetcode 每日一题】2962. 统计最大元素出现至少 K 次的子数组
问题背景 给你一个整数数组 n u m s nums nums 和一个 正整数 k k k。 请你统计有多少满足 「 n u m s nums nums 中的 最大 元素」至少出现 k k k 次的子数组,并返回满足这一条件的子数组的数目。 子数组是数组中的一个连续元素序列。 数据约束 1 ≤ n u m s …...
网络爬取需谨慎:警惕迷宫陷阱
一、技术背景:网络爬虫与数据保护的博弈升级 1. 问题根源:AI训练数据爬取的无序性 数据需求爆炸:GPT-4、Gemini等大模型依赖数万亿网页数据训练,但大量爬虫无视网站的robots.txt协议(非法律强制),未经许可抓取内容(如新闻、学术论文、代码),引发版权争议(如OpenAI被…...
‘WebDriver‘ object has no attribute ‘find_element_by_class‘
在使用Selenium进行Web自动化测试时,如果你遇到了错误信息:“‘WebDriver’ object has no attribute ‘find_element_by_class’”,这通常是因为在Selenium 4及以上版本中,find_element_by_* 和 find_elements_by_* 这类方法已经…...
ComfyUI 学习笔记,案例1:2_pass_txt2img
背景 ComfyUI 官方案例学习笔记,本文是跑出的第三个案例,但确是官网案例的第一个,所以运行起来总体比较顺利。整理几点页面使用技巧: 是网页版本,没有 IDEA,而且画布上没有滚动条,想看清楚内容…...
代码颜色模式python
1. CMYK(印刷场景) 例子:某出版社设计书籍封面时,使用 Adobe Illustrator 绘制图案。 红色封面的 CMYK 值可能为:C0, M100, Y100, K0(通过洋红和黄色油墨混合呈现红色)。印刷前需将设计文件转…...
Android第五次面试总结之网络篇(修)
一、域名解析到服务器的过程(DNS 解析流程) 当应用发起网络请求(如https://www.example.com)时,操作系统需先将域名转换为服务器 IP 地址,这一过程通过 DNS(域名系统) 完成…...
JavaScript 作用域全面总结
JavaScript 作用域全面总结 作用域(Scope)是JavaScript中一个核心概念,决定了变量、函数和对象的可访问性。以下是JavaScript作用域的全面总结,结合表格和箭头图进行讲解。 一、作用域类型 JavaScript 作用域类型详解 JavaScript 中有四种主要的作用…...
Redis核心与底层实现场景题深度解析
Redis核心与底层实现场景题深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于Redis的核心与底层实现相关的场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。…...
代发考试战报:4月份 思科认证,华为认证,考试战报分享
CCNP 300-410考试通过战报,350-401 考试通过战报,CCNA 200-301 考试通过战报,HCIP数通 H12-821考试通过,H12-831考试通过,HCSP 行业金融 H19-611考试通过,HCSE 行业金融 H21-293 考试通过 报名考试一定要找…...
Linux 内核中 TCP 协议的支撑解析
在 Linux 网络协议栈中,TCP(传输控制协议)作为面向连接的可靠传输协议,其实现依赖于一系列复杂的内核机制。本文通过分析四个关键函数(cookie_v4_init_sequence、tcp_fastopen_ctx_destroy、sk_forced_mem_schedule 和 sk_stream_alloc_skb),探讨它们如何共同保障 TCP 的…...
std::string的底层实现 (详解)
目录 std::string的底层实现* 写时复制原理探究 CowString代码初步实现 短字符串优化(SSO) 最佳策略 std::string的底层实现* 我们都知道, std::string的一些基本功能和用法了,但它底层到底是如何实现的呢? 其实在std::stri…...
蓝桥杯 11. 最大距离
最大距离 原题目链接 题目描述 在数列 a1, a2, ⋯, an 中,定义两个元素 ai 和 aj 的距离为: |i - j| |ai - aj|即元素下标的距离加上元素值的差的绝对值,其中 |x| 表示 x 的绝对值。 给定一个数列,请找出元素之间最大的元素…...
【运维】使用 DataX 实现 MySQL 到 PostgreSQL 的数据同步
🚀 使用 DataX 实现 MySQL 到 PostgreSQL 的数据同步 在日常的数据开发工作中,数据同步是一项极其常见的任务。而 DataX 作为阿里开源的一款通用数据同步工具,支持多种数据源之间的互通,使用简单,扩展性强,非常适合进行结构化数据的迁移和同步。 本文将详细介绍如何通…...
Mangodb基本概念和介绍,Mango三个重要的概念:数据库,集合,文档
MongoDB基本概念和介绍 MongoDB 是一个开源的、基于分布式文件存储的NoSQL数据库,由 C 编写。 它的主要特点是: 使用**面向文档(Document-Oriented)**的存储方式,不是传统的表格行列模式。存储的数据格式是BSON&…...
什么是ICSP编程
ICSP编程介绍 ICSP 编程(In-Circuit Serial Programming),即“在线串行编程”,是一种通过 SPI 协议 直接对微控制器(如 Arduino 的 ATmega328P)进行编程的技术,无需移除芯片。它常用于以下场景…...
LeetCode 155题解 | 最小栈
最小栈 一、题目链接二、题目三、算法原理思路1:用一个变量存储最小元素思路2:双栈普通栈和最小栈 四、编写代码五、时间复杂度 一、题目链接 最小栈 二、题目 三、算法原理 栈用数组、链表实现都行,最主要的就是在能在常数时间内检索到最…...
Modal 深度解析:无服务器高性能计算平台实战指南
概览 Modal 是一个 “零配置,无需 YAML” 的云函数平台,通过将你的 Python 代码打包进容器并在 Modal 自建的云环境中执行,实现秒级启动、按秒计费、自动弹性扩缩容等能力。它构建在高性能 Rust 容器堆栈与 gVisor 沙箱之上,为大规模 AI 推理、批量数据处理、作业调度、Web…...
数字逻辑--期末大复习
写卷子前准备:二进制串、卡诺图的数序、分析与设计的步骤,直接写上省的忘了 进制转化 二进制 刚开始做题前可以把0-9次方的列出来 十进制转二进制:不断除以2得到余数,直到商为0,再将余数倒着拼起来即可。 如十六进制ÿ…...
【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿
思维导图: Redis最主要的用途,三个方面: 1.存储数据(内存数据库) 2.缓存(redis最常用的场景) 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说,通常情况下࿱…...
kubelet 清理资源以缓解磁盘压力
kubelet 资源清理缓解磁盘压力指南 在 Kubernetes 集群中,当节点磁盘压力过大时,可通过以下几种方式利用 kubelet 清理资源,从而缓解磁盘压力。 一、镜像垃圾回收 自动回收 kubelet 内置了镜像垃圾回收机制,其行为由配置参数控…...
机器人“跨协议对话”秘籍:EtherNet IP转PROFINET网关应用实录
近期,我们工厂在进行自动化生产线升级改造时,引进了一批全新的机器人手臂设备。这批机器人采用EtherNet/IP通信协议,而生产线上原有的终端控制器则使用PROFINET协议。由于两种协议在通信标准和数据格式上存在差异,导致机器人手臂无…...
松下机器人快速入门指南(2025年更新版)
松下机器人快速入门指南(2025年更新版) 松下机器人以其高精度、稳定性和易用性在工业自动化领域广泛应用。本文将从硬件配置、参数设置、手动操作、编程基础到维护保养,全面讲解松下机器人的快速入门方法,帮助新手快速掌握核心操…...
开启健康养生,重塑生活品质
当你习惯性地用咖啡开启忙碌的一天,当熬夜加班成为生活常态,当外卖占据一日三餐,或许未曾察觉,健康正悄然亮起红灯。在快节奏的现代生活中,健康养生不再是可选项,而是关乎生活质量与生命活力的必答题&#…...
百度「心响」:通用超级智能体,重新定义AI任务执行新范式
在AI技术从“对话交互”迈向“任务执行”的转折点,百度于2025年4月正式推出移动端超级智能体应用——心响。这款以“AI任务完成引擎”为核心的创新产品,被誉为“AI指挥官”,通过自然语言交互实现复杂任务的全流程托管,覆盖知识解析…...
AXPA17388: 4x45W 车用AB类四通道桥式输出音频功率放大器
AXPA17388是采用BCD(双极型,CMOS,DMOS)工艺技术设计的四通道桥式输出AB类车用音频功率放大器,采用完全互补的P型/ N型输出结构, 具有轨到轨的输出电压摆幅,高输出电流,具有出色的低失真性能。 AXPA17388可以…...
【codeforces 2086d】背包+组合数学
【codeforces 2086d】背包组合数学 Problem - D - Codeforces 题意: 给出字符串中每个字符的出现次数 c i ( 1 ≤ i ≤ 26 ) c_i(1 \leq i \leq 26) ci(1≤i≤26)。现构造一个字符串,要求任意相同字母之间的距离必须是偶数。求满足要求的字符串的数量…...
[特殊字符]OCR,给交通领域开了“外挂”?
OCR 技术是什么 宝子们,OCR 其实就是光学字符识别(Optical Character Recognition)的英文缩写。简单来说,它能让电子设备,比如扫描仪、摄像头这些,像长了眼睛一样,“看” 懂图片或文档里的文字&…...