<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>脑力积累 on 沐风的博客</title><link>https://blog.muwinds.com/categories/%E8%84%91%E5%8A%9B%E7%A7%AF%E7%B4%AF/</link><description>Recent content in 脑力积累 on 沐风的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 01 Aug 2026 23:40:57 +0800</lastBuildDate><atom:link href="https://blog.muwinds.com/categories/%E8%84%91%E5%8A%9B%E7%A7%AF%E7%B4%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>leetcode 复健：1041</title><link>https://blog.muwinds.com/archives/392/</link><pubDate>Sat, 01 Aug 2026 23:40:57 +0800</pubDate><guid>https://blog.muwinds.com/archives/392/</guid><description>&lt;p&gt;在无限的平面上，机器人最初位于 &lt;code&gt;(0, 0)&lt;/code&gt; 处，面朝北方。注意:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;北方向&lt;/strong&gt; 是y轴的正方向。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;南方向&lt;/strong&gt; 是y轴的负方向。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;东方向&lt;/strong&gt; 是x轴的正方向。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;西方向&lt;/strong&gt; 是x轴的负方向。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;机器人可以接受下列三条指令之一：&lt;/p&gt;</description></item><item><title>pi agent 不显示 xhigh 和 max 的解决方法</title><link>https://blog.muwinds.com/archives/389/</link><pubDate>Tue, 28 Jul 2026 20:52:04 +0800</pubDate><guid>https://blog.muwinds.com/archives/389/</guid><description>&lt;p&gt;最近开始使用 pi 的 coding agent，发现没法通过 shift+tab 来调整 effort level 到 xhigh 和 max，pi 的 settings 里也没有&lt;/p&gt;
&lt;p&gt;让 pi 自己解决，很快就好了&lt;/p&gt;
&lt;p&gt;直接把 thinkingLevelMap 放在模型对象下，并且在 max 键上也做映射（否则 max 级别不会出现）：&lt;/p&gt;</description></item><item><title>Z100 DCU 上 vLLM CUDA Graph 推理优化实践</title><link>https://blog.muwinds.com/archives/380/</link><pubDate>Mon, 15 Jun 2026 09:25:04 +0800</pubDate><guid>https://blog.muwinds.com/archives/380/</guid><description>&lt;p&gt;我们在海光 Z100 DCU (gfx906) 上对 vLLM 推理框架的 CUDA Graph 功能进行了完整的测试验证。本文记录开启 CUDA Graph + torch.compile 的具体配置、性能数据和关键发现。&lt;/p&gt;
&lt;h2 id="测试环境"&gt;测试环境&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;详情&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;服务器&lt;/td&gt;
&lt;td&gt;scnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;1x 海光 Z100 DCU (gfx906), 16 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;3.10.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyTorch&lt;/td&gt;
&lt;td&gt;2.10.0+das.opt1.dtk2604&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vLLM&lt;/td&gt;
&lt;td&gt;0.18.1+das.3266200.dtk2604&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triton&lt;/td&gt;
&lt;td&gt;3.4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型&lt;/td&gt;
&lt;td&gt;Qwen3.5-4B (BF16)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="两种配置对比"&gt;两种配置对比&lt;/h2&gt;
&lt;h3 id="baselineenforce_eagertrue禁用-cuda-graph"&gt;Baseline：enforce_eager=True（禁用 CUDA Graph）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compilation_config.mode = CompilationMode.NONE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cudagraph_mode = CUDAGraphMode.NONE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;启用 custom fusions（norm_quant、act_quant）&lt;/li&gt;
&lt;li&gt;模型加载时间：~125s&lt;/li&gt;
&lt;li&gt;显存占用：~13.25 GiB&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cuda-graph--compileenforce_eagerfalse"&gt;CUDA Graph + Compile：enforce_eager=False&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compilation_config.mode = VLLM_COMPILE&lt;/code&gt;（Inductor backend）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cudagraph_mode = FULL_AND_PIECEWISE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compile_ranges_endpoints: [8192]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cudagraph_capture_sizes: [1, 2]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;禁用 custom fusions（与 compile 不兼容）&lt;/li&gt;
&lt;li&gt;模型加载时间：~172s（编译开销）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显存占用：~14.5 GiB&lt;/strong&gt;（多出 ~1.3 GiB 用于 Graph 缓冲）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键：CUDA Graph 模式&lt;strong&gt;不要传 &amp;ndash;enforce-eager&lt;/strong&gt;，去掉该参数后 vLLM 自动启用 VLLM_COMPILE + FULL_AND_PIECEWISE CUDA Graph。&lt;/p&gt;</description></item><item><title>海光 Z100 DCU 适配 vLLM 运行 Qwen3.5-27B 完整总结</title><link>https://blog.muwinds.com/archives/370/</link><pubDate>Mon, 08 Jun 2026 16:37:41 +0800</pubDate><guid>https://blog.muwinds.com/archives/370/</guid><description>&lt;h2 id="环境信息"&gt;环境信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;详情&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;4× 海光 Z100 DCU，每张 16GB，合计 64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU 架构&lt;/td&gt;
&lt;td&gt;gfx906 (Vega 20 / GCN 5.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DTK 版本&lt;/td&gt;
&lt;td&gt;DTK 26.04 (DCC2602-0317)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;3.10.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyTorch&lt;/td&gt;
&lt;td&gt;2.10.0+das.opt1.dtk2604&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vLLM&lt;/td&gt;
&lt;td&gt;0.18.1+das.3266200.dtk2604&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triton&lt;/td&gt;
&lt;td&gt;3.4.0（从源码编译，替换原 3.4.0+git1ef59765）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;transformers&lt;/td&gt;
&lt;td&gt;5.5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;flash_attn&lt;/td&gt;
&lt;td&gt;2.8.3+das&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上述镜像可以去海光社区：&lt;a href="https://developer.sourcefind.cn/modelzoo/list/qwen3.5_vllm/detail?post_id=46176b42-0c0b-11f1-a49f-0242ac150003"&gt;https://developer.sourcefind.cn/modelzoo/list/qwen3.5_vllm/detail?post_id=46176b42-0c0b-11f1-a49f-0242ac150003&lt;/a&gt; 获得&lt;/p&gt;</description></item><item><title>训练小参数LLM将优化器从AdamW换成Muon的尝试</title><link>https://blog.muwinds.com/archives/365/</link><pubDate>Sun, 31 May 2026 11:39:40 +0800</pubDate><guid>https://blog.muwinds.com/archives/365/</guid><description>&lt;p&gt;最近社区都在说 Muon 用在 LLM 上的训练效果要比 AdamW 好很多，这里根据 Kimi 的论文（http://arxiv.org/abs/2502.16982）和仓库做了一些尝试。&lt;/p&gt;
&lt;p&gt;选用模型：minimind，Github 链接：https://github.com/jingyaogong/minimind&lt;/p&gt;</description></item><item><title>各种距离算法小记</title><link>https://blog.muwinds.com/archives/282/</link><pubDate>Tue, 07 Oct 2025 23:57:57 +0800</pubDate><guid>https://blog.muwinds.com/archives/282/</guid><description>&lt;p&gt;最近在翻一些距离算法并考虑他们的GPU并行化实现，记录一下。&lt;/p&gt;
&lt;p&gt;这里从图片转成向量开始，利用opencv配合torchvision，转成tensor还是比较容易的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cv2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;torchvision.transforms.functional&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;F&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;torchvision.transforms&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;test_pic1.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;img1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://blog.muwinds.com/wp-content/uploads/2025/10/image-9.png"&gt;&lt;img loading="lazy" src="https://blog.muwinds.com/wp-content/uploads/2025/10/image-9.png"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Accuracy、Recall、Precission、F1 Score分别是什么？</title><link>https://blog.muwinds.com/archives/280/</link><pubDate>Sun, 28 Sep 2025 03:12:45 +0800</pubDate><guid>https://blog.muwinds.com/archives/280/</guid><description>&lt;p&gt;无论是打数模还是单纯的搞机器学习，都需要对最后训练结果进行分析，这时候常用的四个指标：准确率、召回率、精确率、F1分数。&lt;/p&gt;
&lt;p&gt;作为指标，一定会涉及几个方面&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用来描述什么&lt;/li&gt;
&lt;li&gt;如何计算的&lt;/li&gt;
&lt;li&gt;指标的意义是什么&lt;br&gt;
那为了计算这几个指标，我们需要了解什么是TP、TN、FP、FN&lt;br&gt;
用识别苹果举例&lt;br&gt;
假设我们有100张照片：&lt;br&gt;
其中有40张是真的苹果照片称之为正样本。&lt;br&gt;
另外60张不是苹果照片称之为负样本。&lt;br&gt;
模型预测可能有四种情况：&lt;/li&gt;
&lt;li&gt;预测是苹果，实际是苹果，TruePositive (TP)&lt;/li&gt;
&lt;li&gt;预测是苹果，实际不是苹果，FalsePositive (FP)&lt;/li&gt;
&lt;li&gt;预测不是苹果，实际是苹果，FalseNegative (FN)&lt;/li&gt;
&lt;li&gt;预测不是苹果，实际也不是苹果，TrueNegative (TN)&lt;br&gt;
True or False =有没有猜对&lt;br&gt;
Positive or Negative 表示猜的结果 是不是正类，是苹果为正类。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;假设：&lt;/p&gt;</description></item><item><title>理解PID控制算法</title><link>https://blog.muwinds.com/archives/245/</link><pubDate>Sun, 29 Jun 2025 01:39:52 +0800</pubDate><guid>https://blog.muwinds.com/archives/245/</guid><description>&lt;p&gt;PID控制算法，可以将其看作是一个 &lt;strong&gt;“不断尝试缩小目标与现状之间差距”的智能调节器&lt;/strong&gt;。它广泛应用于工业控制（如温度、压力、流量控制）、机器人、自动驾驶、无人机稳定系统等需要精确调节物理量的场景。&lt;/p&gt;</description></item><item><title>数学建模笔记-最优化问题</title><link>https://blog.muwinds.com/archives/145/</link><pubDate>Sat, 28 Jun 2025 12:51:56 +0800</pubDate><guid>https://blog.muwinds.com/archives/145/</guid><description>&lt;h2 id="一基本概念"&gt;一、基本概念&lt;/h2&gt;
&lt;p&gt;最优化：首先是一种理念，其次才是一种方法，它所追求的是一种“至善”之道，一种追求卓越的精神。&lt;br&gt;
例子：小明同学，烧一壶水要8分钟，灌开水要1分钟，取牛奶和报纸要5分钟，整理书包要6分钟，为了尽快做完这些事，怎样安排才能使时间最少？最少需要几分钟？&lt;/p&gt;</description></item><item><title>线性回归&amp;Logistic Model</title><link>https://blog.muwinds.com/archives/210/</link><pubDate>Tue, 17 Jun 2025 12:18:39 +0800</pubDate><guid>https://blog.muwinds.com/archives/210/</guid><description>&lt;p&gt;&lt;strong&gt;线性回归模型&lt;/strong&gt;，它是统计学和机器学习中最基础、最核心的预测模型之一，主要用于解决&lt;strong&gt;回归问题&lt;/strong&gt;，即预测一个&lt;strong&gt;连续的数值型输出&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="核心思想建立输入与输出之间的线性关系"&gt;核心思想：建立“输入”与“输出”之间的线性关系&lt;/h3&gt;
&lt;p&gt;线性回归的核心目标非常直观：&lt;strong&gt;假设并建模目标变量 &lt;code&gt;y&lt;/code&gt;（因变量、输出）与一个或多个预测变量 &lt;code&gt;x&lt;/code&gt;（自变量、特征、输入）之间存在的线性关系。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>KMP算法</title><link>https://blog.muwinds.com/archives/207/</link><pubDate>Sun, 15 Jun 2025 11:51:05 +0800</pubDate><guid>https://blog.muwinds.com/archives/207/</guid><description>&lt;p&gt;KMP算法（Knuth-Morris-Pratt）是一种高效的字符串匹配算法，它通过避免回溯主串指针来实现O(n+m)的时间复杂度。要深入理解KMP算法，需要掌握其核心思想——&lt;strong&gt;部分匹配表（Pi数组）&lt;strong&gt;和&lt;/strong&gt;匹配过程中的智能回退机制&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Smoke Test冒烟测试理解</title><link>https://blog.muwinds.com/archives/204/</link><pubDate>Tue, 27 May 2025 23:51:11 +0800</pubDate><guid>https://blog.muwinds.com/archives/204/</guid><description>&lt;h3 id="一定义与核心目的"&gt;&lt;strong&gt;一、定义与核心目的&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本质&lt;/strong&gt;：一种轻量级、快速执行的验证性测试，用于检测系统&lt;strong&gt;核心功能&lt;/strong&gt;是否可运行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;快速发现&lt;strong&gt;阻断性缺陷&lt;/strong&gt;（Blocking Bug），确保被测对象（如新构建的版本）具备进一步测试的价值。&lt;/li&gt;
&lt;li&gt;避免在不可用的版本上浪费时间和资源执行深度测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐喻来源&lt;/strong&gt;：源自硬件测试，类比电路板通电后若冒烟则说明存在严重故障，需立即停止测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="二适用场景"&gt;&lt;strong&gt;二、适用场景&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;持续集成（CI）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;代码提交后触发自动化冒烟测试，验证构建是否通过基础检查（如编译成功、服务启动）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本发布前&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;上线前最后一轮验证，确保主流程（如用户登录、支付）未因最新修改而崩溃。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境迁移后&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;新部署环境中快速确认系统是否可访问（如数据库连接、API网关响应）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="三测试范围设计原则"&gt;&lt;strong&gt;三、测试范围设计原则&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最小化覆盖&lt;/strong&gt;：仅测试最关键路径（Critical Path），而非全量功能。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;示例&lt;/em&gt;：
&lt;ul&gt;
&lt;li&gt;电商平台：用户登录 → 商品搜索 → 加入购物车 → 结算 → 支付。&lt;/li&gt;
&lt;li&gt;金融系统：账户查询 → 转账 → 交易记录查看。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高优先级用例&lt;/strong&gt;：覆盖直接影响业务连续性的功能（如核心交易链路）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;排除非关键路径&lt;/strong&gt;：不涉及边缘场景（如异常数据输入）、性能或安全测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="四执行逻辑与流程"&gt;&lt;strong&gt;四、执行逻辑与流程&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前置条件&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;被测对象已完成部署（如新版本安装、环境配置）。&lt;/li&gt;
&lt;li&gt;准备测试数据（如测试账号、基础商品信息）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行步骤&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动化脚本&lt;/strong&gt;（推荐）：通过工具（如Postman、Selenium）执行预设用例，5-15分钟内完成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手动检查&lt;/strong&gt;（应急场景）：人工点击主流程，观察日志或界面反馈。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通过标准&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;核心功能无崩溃（如HTTP 500错误）、无阻塞性错误（如数据库连接失败）。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;注意&lt;/em&gt;：不要求功能完全正确，仅需确认“可测试性”（Testability）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="五与企业级测试策略的关联"&gt;&lt;strong&gt;五、与企业级测试策略的关联&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;测试类型&lt;/th&gt;
&lt;th&gt;目标&lt;/th&gt;
&lt;th&gt;执行频率&lt;/th&gt;
&lt;th&gt;深度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Smoke Test&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;验证核心功能可用性&lt;/td&gt;
&lt;td&gt;每次构建/部署&lt;/td&gt;
&lt;td&gt;浅层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regression Test&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;确保修改未破坏现有功能&lt;/td&gt;
&lt;td&gt;主要版本发布前&lt;/td&gt;
&lt;td&gt;中层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance Test&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;评估系统负载能力&lt;/td&gt;
&lt;td&gt;季度/重大变更后&lt;/td&gt;
&lt;td&gt;深层&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="六典型案例分析"&gt;&lt;strong&gt;六、典型案例分析&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id="场景银行核心系统版本升级"&gt;&lt;strong&gt;场景：银行核心系统版本升级&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;冒烟测试设计&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;用户登录（验证身份认证服务正常）。&lt;/li&gt;
&lt;li&gt;账户余额查询（验证数据库连接与核心交易接口）。&lt;/li&gt;
&lt;li&gt;单笔转账（验证交易引擎与风控规则引擎）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失败处理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;若转账接口返回“系统忙”，标记构建失败并通知开发团队，暂停后续测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="工具链示例"&gt;&lt;strong&gt;工具链示例&lt;/strong&gt;：&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API测试&lt;/strong&gt;：Postman + Newman（批量运行Collection）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端测试&lt;/strong&gt;：Cypress（自动化模拟用户点击）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流水线集成&lt;/strong&gt;：Jenkins调用测试脚本，通过钉钉/邮件发送结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="七常见误区与避坑指南"&gt;&lt;strong&gt;七、常见误区与避坑指南&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;误区：冒烟测试 = 简单测试&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;纠正&lt;/strong&gt;：冒烟测试是策略性筛选，需基于业务风险设计，非随机选择用例。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区：仅用于开发阶段&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;纠正&lt;/strong&gt;：生产环境变更（如配置更新、热修复）后同样需要冒烟测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;陷阱：忽视环境差异性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规避&lt;/strong&gt;：确保测试数据与环境配置与生产环境一致（如使用影子表隔离测试数据）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="八进阶实践"&gt;&lt;strong&gt;八、进阶实践&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;动态冒烟测试&lt;/strong&gt;：根据代码变更范围自动调整测试用例（如代码影响支付模块时，仅执行支付相关冒烟测试）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;熔断机制&lt;/strong&gt;：若连续3次构建冒烟测试失败，自动回滚至上一个稳定版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过以上框架，可系统化掌握冒烟测试的核心逻辑，并针对企业级场景设计高效验证方案。&lt;/p&gt;</description></item><item><title>操作系统用户态和内核态</title><link>https://blog.muwinds.com/archives/203/</link><pubDate>Tue, 27 May 2025 17:49:20 +0800</pubDate><guid>https://blog.muwinds.com/archives/203/</guid><description>&lt;h3 id="一核心概念与设计意义"&gt;&lt;strong&gt;一、核心概念与设计意义&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;用户态（User Mode）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：用户态是应用程序运行的受限环境，无法直接访问硬件或执行特权指令。操作系统通过限制其权限，确保应用程序只能通过系统调用（如文件操作、网络通信）请求内核服务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;权限受限&lt;/strong&gt;：仅能访问用户空间内存，无法操作硬件设备（如直接读写磁盘）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性&lt;/strong&gt;：即使应用程序崩溃或被攻击，也不会破坏系统核心功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非特权指令&lt;/strong&gt;：只能执行普通运算指令（如加减乘除），无法执行停机、修改内存映射等敏感操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内核态（Kernel Mode）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：操作系统内核运行的特权模式，拥有对硬件、内存和进程调度的完全控制权。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最高权限&lt;/strong&gt;：可执行所有CPU指令（包括特权指令），直接访问所有内存地址和硬件资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稳定性保障&lt;/strong&gt;：负责处理中断、异常和系统调用，确保多任务调度和资源分配的可靠性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不可抢占性&lt;/strong&gt;：内核态进程运行时不可被中断（除非更高优先级中断发生）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区分意义&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安全隔离&lt;/strong&gt;：防止用户程序误操作导致系统崩溃（如非法内存访问）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源管理&lt;/strong&gt;：通过权限分层实现硬件资源的统一调度和高效利用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：内核态直接操作硬件，避免用户态频繁切换的开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="二切换机制与实现细节"&gt;&lt;strong&gt;二、切换机制与实现细节&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id="切换触发条件"&gt;&lt;strong&gt;切换触发条件&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主动切换（系统调用）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;流程&lt;/strong&gt;：用户程序通过系统调用（如&lt;code&gt;read()&lt;/code&gt;）请求内核服务 → CPU执行&lt;code&gt;syscall&lt;/code&gt;指令 → 保存用户态寄存器（RIP、RSP等） → 跳转至内核入口函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;code&gt;read()&lt;/code&gt;函数的执行涉及：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数传递&lt;/strong&gt;：文件描述符（&lt;code&gt;rdi&lt;/code&gt;）、缓冲区地址（&lt;code&gt;rsi&lt;/code&gt;）、数据长度（&lt;code&gt;rdx&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统调用号&lt;/strong&gt;：通过&lt;code&gt;rax&lt;/code&gt;寄存器指定（如Linux x86-64中&lt;code&gt;__NR_read=0&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;被动切换（中断与异常）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中断&lt;/strong&gt;：外部设备触发（如时钟中断、磁盘I/O完成），CPU暂停当前任务处理中断。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常&lt;/strong&gt;：程序错误（如缺页异常、除零错误），CPU强制切换到内核态处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;恢复流程&lt;/strong&gt;：内核处理完成后，通过&lt;code&gt;iret&lt;/code&gt;指令恢复用户态上下文。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="上下文切换细节"&gt;&lt;strong&gt;上下文切换细节&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;栈切换&lt;/strong&gt;：用户态使用用户栈，内核态使用内核栈。切换时保存用户栈指针（&lt;code&gt;ss3&lt;/code&gt;/&lt;code&gt;rsp3&lt;/code&gt;）到内核栈，并加载内核栈指针（&lt;code&gt;ss0&lt;/code&gt;/&lt;code&gt;rsp0&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;寄存器保存&lt;/strong&gt;：CPU自动保存&lt;code&gt;RIP&lt;/code&gt;（指令指针）、&lt;code&gt;RFLAGS&lt;/code&gt;（状态标志）等寄存器到内核栈。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限级别变更&lt;/strong&gt;：x86架构中，用户态为Ring 3，内核态为Ring 0。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="三实际应用与性能影响"&gt;&lt;strong&gt;三、实际应用与性能影响&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;典型场景&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统调用&lt;/strong&gt;：文件读写（&lt;code&gt;read()&lt;/code&gt;/&lt;code&gt;write()&lt;/code&gt;）、进程创建（&lt;code&gt;fork()&lt;/code&gt;）、网络通信（&lt;code&gt;send()&lt;/code&gt;/&lt;code&gt;recv()&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬件交互&lt;/strong&gt;：设备驱动通过内核态直接控制硬件（如网卡数据包收发）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存管理&lt;/strong&gt;：内核态处理虚拟内存映射和缺页异常（如&lt;code&gt;mmap()&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化考量&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;切换开销&lt;/strong&gt;：一次系统调用需约数百纳秒，频繁切换会显著降低性能（可通过批处理系统调用减少次数）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零拷贝技术&lt;/strong&gt;：内核态直接传递数据（如&lt;code&gt;sendfile()&lt;/code&gt;），避免用户态与内核态间的多次数据拷贝。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>What is hypervisor?</title><link>https://blog.muwinds.com/archives/202/</link><pubDate>Sat, 24 May 2025 21:24:43 +0800</pubDate><guid>https://blog.muwinds.com/archives/202/</guid><description>&lt;h2 id="what-are-hypervisors"&gt;What are hypervisors?&lt;/h2&gt;
&lt;p&gt;A hypervisor is a software that enables multiple &lt;a href="https://www.ibm.com/think/topics/virtual-machines"&gt;virtual machines (VMs)&lt;/a&gt;—each with its own operating system (OS)—to run on one physical server. The hypervisor pools and allocates physical computing resources as needed by the VM, enabling efficiency, flexibility and scalability&lt;/p&gt;
&lt;p&gt;Sometimes called a virtual machine monitor (VMM), the hypervisor manages VMs as they run alongside each other. It separates VMs from each other logically, assigning each its own slice of the underlying computing power, memory and storage. This prevents the VMs from interfering with each other. For example, if one OS suffers a crash or a security compromise, the others survive.&lt;/p&gt;</description></item><item><title>C/C++编译的四个阶段</title><link>https://blog.muwinds.com/archives/199/</link><pubDate>Thu, 22 May 2025 15:55:45 +0800</pubDate><guid>https://blog.muwinds.com/archives/199/</guid><description>&lt;p&gt;C/C++程序的编译过程分为四个关键阶段：&lt;strong&gt;预处理（Preprocessing）、编译（Compilation）、汇编（Assembly）和链接（Linking）&lt;/strong&gt;。每个阶段承担不同任务，最终将源代码转换为可执行文件。&lt;/p&gt;</description></item><item><title>并发编程三大特性——原子性、可见性、有序性</title><link>https://blog.muwinds.com/archives/190/</link><pubDate>Mon, 19 May 2025 16:41:28 +0800</pubDate><guid>https://blog.muwinds.com/archives/190/</guid><description>&lt;h2 id="a原子性"&gt;A.原子性&lt;/h2&gt;
&lt;p&gt;**即一个操作或者多个操作，要么全部执行并且执行的过程不会被任何因素打断，要么就都不执行。**原子性确保对共享资源的操作不会被其他线程干扰，从而避免数据不一致性（如竞态条件）&lt;/p&gt;</description></item><item><title>什么是消息验证码 MAC？</title><link>https://blog.muwinds.com/archives/151/</link><pubDate>Fri, 02 May 2025 23:48:16 +0800</pubDate><guid>https://blog.muwinds.com/archives/151/</guid><description>&lt;p&gt;有两个人 A 和 B。 A 通过网络向 B 发送一条消息。B 收到了之后，怎么确认：&lt;/p&gt;
&lt;p&gt;1.这条消息没有被中间人篡改过&lt;/p&gt;
&lt;p&gt;2.这条消息确实来自于 A，而不是某个 C 伪造出来的&lt;/p&gt;
&lt;p&gt;答案就是使用 MAC。A 在发送消息时，计算出该消息的 MAC 值，并将其一起发送给 B。B 收到之后，便可以根据 MAC 确认 1 和 2.&lt;/p&gt;</description></item><item><title>Authorization Code 授权原理和实现方法</title><link>https://blog.muwinds.com/archives/150/</link><pubDate>Fri, 02 May 2025 23:46:23 +0800</pubDate><guid>https://blog.muwinds.com/archives/150/</guid><description>&lt;p&gt;Oauth2.0 定义了几种授权流程，其中最重要、也最基础的是 Authorization Code 授权。先看流程图：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://img2020.cnblogs.com/blog/419544/202106/419544-20210609172848603-384012851.png"&gt;&lt;/p&gt;
&lt;p&gt;　　1，用户访问 A 网站&lt;/p&gt;
&lt;p&gt;　　2，A 打开 B 的授权页面&lt;/p&gt;
&lt;p&gt;　　3，用户看到授权界面，输入账号密码进行授权&lt;/p&gt;
&lt;p&gt;　　4，B 验证用户是合法的之后，生成一个 authorization code，然后通过 302 跳转的方式，把这个 code 发送给 A&lt;/p&gt;</description></item></channel></rss>