普通视图

使用原子 TAS 指令实现自旋锁

使用原子 TAS 指令实现自旋锁

使用原子 TAS 指令实现自旋锁 Implementing a Spinlock Using the Atomic TAS Instruction 从零实现自旋锁:基于 TAS 的最小同步原语 Building a Spinlock from Scratch with Atomic TAS 用 test-and-set 实现最简单的互斥锁 Implementing a Minimal Mutex Using Test-and-Set 自旋锁的底层原理:TAS、原子性与忙等待 Inside Spinlocks: TAS, Atomicity, and Busy Waiting 原子操作与自旋锁:用 C 语言实现线程同步 Atomic Operations and Spinlocks: Thread Synchronization in C 从原子指令到锁:全面理解 TAS 和自旋锁 From Atomic Instructions to Locks: A Complete Guide to TAS and Spinlocks 动手写一个自旋锁:tryLock / lockAcquire / lockRelease 全实现 Hands-On Spinlock Implementation: tryLock, lockAcquire, and lockRelease 你的第一个自旋锁:基于 C 语言的 TAS 实现 Your First Spinlock: A TAS-Based Implementation in C 原子交换与线程互斥:自旋锁实现指南 Atomic Exchange and Thread Mutual Exclusion: A Guide to Implementing Spinlocks
假设我们有一个 TAS(Take-And-Set)函数。该操作返回内存中原来的值,并以原子方式将其替换为新值。原子性(atomicity)意味着没有其他线程能够观察到中间状态;整个读-写操作是一体不可分的。 在 C++ 中,标准库函数 std::exchange 在逻辑上表现相同,但它不是原子操作。同步原语需要硬件级别的原子性。
int TAS(int* memory, int newVal) {
    int old = *memory;
    *memory = newVal;
    return old;
}
我们想使用这个原语来实现一个简单的自旋锁,包括:
  • lockAcquire()
  • lockRelease()
线程将调用这些函数来保护对共享变量的访问:
typedef struct {
    int lock;
} lockType;

typedef struct {
    int val;
} threadArgType;

void threadFunc(void* arg) {
    lockAcquire((static_cast<lockType*>arg)->lock);
    (static_cast<threadArgType*>arg)->val++;
    lockRelease((static_cast<lockType*>arg)->lock);
}

实现 tryLock

tryLock 函数尝试获取锁一次。如果锁为空(值为 0),TAS 将其设置为 1 并返回原值(0)。如果锁已被占用,TAS 返回 1。tryLock 函数是非阻塞的——它会立即返回。 因此 tryLock() 只有在 TAS 返回 0 时才会成功:
enum {
    UNLOCKED = 0,
    LOCKED = 1
}

int tryLock(lockType* lock) {
    // 如果之前已锁定返回 1,如果之前未锁定返回 0
    int old = TAS(lock->lock, LOCKED);
    return (old == UNLOCKED);   // true (1) = 成功获取锁
}

实现 lockAcquire()

普通的锁获取应当“自旋”直到 tryLock() 成功。这称为 自旋锁,因为 CPU 会忙等待。必要时可以加入短暂的 sleep。例如,sleep(0) 并不会真正暂停执行,而是让出 CPU,允许其他线程运行。 它通常用于实现跨线程的互斥自旋锁。
void lockAcquire(lockType* lock) {
    while (!tryLock(lockType* lock)) {
        // 自旋直到锁可用
    }
}
另一种实现:
void lockAcquire(lockType* lock) {
    do {
       if (tryLock(lockType* lock)) {
          break;
       }
    } while (1);
}
展开 tryLock:
void lockAcquire(lockType* lock) {
    do {
       int old = TAS(lock->lock, LOCKED);
       // 无论锁是否已被获取,锁都已设置为 LOCKED
       if (old == UNLOCKED) {
           break;
       }
    } while (1);
}
这是使用 TAS 实现的最简单方法。在实际系统中,我们可能会加入 pause 指令或退避策略,但基本思路是相同的。

实现 lockRelease()

释放锁时,持有者只需将锁变量写为 0。由于 TAS 是“设置新值并返回旧值”,它同样适用于释放锁:
void lockRelease(lockType* lock) {
    TAS(lock->lock, UNLOCKED);
}
或者使用简单的原子存储也足够,但由于 TAS 是我们唯一的工具,我们重用它。请注意,在这里重复释放锁是安全的,因为再次将其设置为 UNLOCKED=0 不会产生副作用。

总结

仅使用原子 TAS 指令,我们实现了:
  • 一个 tryLock() 尝试
  • 一个 lockAcquire() 自旋锁
  • 一个 lockRelease() 解锁操作
这种锁的实现方式对于理解低级并发、内存顺序以及高层互斥锁库的构建方式非常基础。 [show_file file="/var/www/wp-post-common/justyy.com/cpp.php"] 英文:Implement a Lock Acquire and Release in C++

相关文章:

  1. 简易教程: C++的智能指针 C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个...
  2. C++中的 const和constexpr 比较 C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr...
  3. 被动收入之: 微博红包 今年开始重新经营我的微博帐号 drlai 收到两笔微信红包,应该是来自于官方的支持,150元(成功提现到支付宝)。虽然这不能持久,也没多少,但毕竟实现了零的突破,意义重大。 如果流量上来,内容创作者可能会接受到比较多的赞赏,这也是一个比较简单的变现方法。这也能作为一种被动收入,不过如果不是头部网红,可能杯水车薪,但如果你有好几个类似这样的,也能积少成多! 在用户中心,微博用户可以每天登陆手机微博APP打卡,获取点数和少量的红包钱(几分钱),积少成多! 微博做些小任务可获得积分和几分钱。聊胜于无。 微博的主要盈利模式 微博的主要盈利模式主要包括以下几个方面: 广告收入:微博的大部分收入来源于广告,尤其是品牌广告和效果广告。广告形式包括信息流广告(类似于推文广告)、热门话题广告、开屏广告和视频广告。品牌和企业可以利用微博庞大的用户群和社交互动来提升曝光率、推广品牌和产品。 会员服务:微博提供的VIP会员服务,用户可以支付订阅费用来享受更多的特权,比如个性化的主题、特有的表情包、私密权限设置等。这些会员服务主要面向个人用户,提升其社交体验。 直播和打赏:微博提供直播平台,用户可以通过购买虚拟礼物来支持主播,微博会从这些打赏中抽取一定比例的分成。此外,微博与内容创作者分成,通过内容付费、知识付费等形式变现。 增值服务:针对企业和大V(拥有大量粉丝的用户),微博还提供增值服务,如账号认证、粉丝数据分析、精准推送、推广和营销工具等。这些服务帮助企业提升营销效果,同时也增加了微博的收入来源。 电商和导流:微博上有大量的电商导流业务,尤其是和明星、网红的合作推广。微博用户在浏览社交内容时,可以直接跳转到商品购买链接,微博通过这种方式赚取导流佣金。 游戏联运:微博也会与一些游戏公司合作推出联合运营的游戏,微博负责推广和流量引入,用户充值或付费时,微博可以获得一部分的分成。 这些模式相结合,使得微博能够在广告市场、内容创作和电商等多个领域获利。...
  4. 借助AI快速开源了N个小工具: 写代码越来越像做产品了, AI 真把我宠坏了(Vibe Coding) 程序员的未来?Vibe Coding + AI 一起上! 借助 AI 快速开源了三个小工具 最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了几个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行...
  5. 豪车的修理费用就是贵一些 去年买了保时捷卡宴SUV(Porsche Cayenne)后,我一直担心将来修车费用会很高。当时购车时,车厂做了一次全面保养,把车里里外外都清洁了一遍。虽然这辆车已经三年车龄,但看上去几乎和新车没区别。 在英国,三年以内的新车通常不需要做MOT年检。而且很多这类新车会通过PCP(个人合同购车)方式出租给车主。简单来说,就是车主每月支付一笔租金,租期通常为三年,期满后可以选择一次性付清尾款买下车辆,也可以继续换租一辆新车。 举个例子,如果一辆新车售价是10万英镑,车厂可能按未来三年折旧后的50%残值来计算每月租金。三年后,如果车主不想买断,车厂就会将车辆作为二手车卖出,回收那5万英镑的残值。这样一来,车厂基本不会亏钱。此外,PCP合同中还有附加条款,比如每年限行1万英里,超出的部分需要额外付费,这些内容都会写在合同里。 车龄到了三年,车辆需要首次做MOT年检,同时车辆的市场价值也会首次出现较大幅度的贬值(一般是50%,甚至更多)。修车厂老板告诉我,相比玛莎拉蒂等其他豪车,保时捷的保值率相对较高。 这一年我开这辆保时捷基本没出什么问题。今年年初做了年检,顺利通过。随后又做了一次常规保养,修车厂老板告诉我,前后刹车片已经磨损了80%–85%。我们住剑桥村里,开车比较多(上班、送娃、家庭旅游都要用车),一年大概能开1-2万英理。 几周后我将车送回去更换刹车片。修完后账单是将近900英镑。我觉得有点贵,车行老板解释说,不仅换了前后刹车片,还有一个前雷达的传感器掉进了车体内部,为了修这个传感器需要拆掉前保险杠等部件,花了6个小时人工费。 我当时质疑说为啥这次修这么贵,他说:“因为这是保时捷。”我说:“那和别的车有什么区别?”他说:“It is not the same.” 我说不都一样么,他说:“It is not...
  6. 重要通知: 弃用 FeedBurner RSS 请改用 https://justyy.com/feed 最近我发现原本的 RSS(/rss、/feed)没有按时更新。 进一步检查后发现这些地址都被 301 重定向到了 FeedBurner(https://feeds.feedburner.com/zhihua-xblog),而 FeedBurner 已经久未维护,偶有抓取失败或延迟,导致读者无法及时收到新文章。 造成这次重定向的原因是我们使用的第三方主题/插件(mytheme)里曾经内置了将站点 feed 转发到 FeedBurner 的功能。 当时之所以做 301...
  7. 换了个奥迪Q5大灯花了我1000英镑 我那辆奥迪Q5 SUV今年年检没通过,原因是左前车灯坏了,需要更换。车厂告诉我,光是订购零件就要700多英镑,加上人工费,总费用得1000英镑。但没办法,如果不修,车辆年检(MOT)就过不了,车也不能上路。 MOT是英国的机动车强制性安全检测(Ministry of Transport Test)的简称。 近侧前位置灯不工作 drl/位置灯集成(4.2.1(a)(ii)) Nearside Front Position lamp not working drl/position...
  8. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: // @justyy var request = require("request")...

聊一聊分布式系统中的时间

2024年10月21日 08:41

今天聊一下时间的话题。在分布式系统中,“时间” 是一个挺有趣,但是很难处理的东西。我把自己的理解简单整理下来。

不可靠的物理时钟

首先,单一节点的物理时钟是不可靠的。

物理时钟本身就有偏差,可是除此之外,可以引起节点物理时钟不准确的原因太多了,比如 clock jump。考虑到 NTP 协议,它基于 UDP 通信,可以从权威的时钟源获取信息,进行自动的时间同步,这就可能会发生 clock jump,它就是说,时钟始终会不断进行同步,而同步回来的时间,是有可能不等于当前时间的,那么系统就会设置当前时间到这个新同步回来的时间。即便没有这个原因,考虑到数据从网络传输的延迟,处理数据的延迟等等,物理时钟是非常不可靠的。

如果一个分布式系统,多个节点想要仅仅依赖于物理时钟来完成什么操作,那么只能祈祷运气足够好了。在 《从物理时钟到逻辑时钟》这篇文中,我已经介绍了对于物理时钟不可靠的问题,我们有一个解决的办法,就是引入 Lamport 逻辑时钟,或者使用向量时钟,这里就不赘述了。

超时

分布式系统中什么样的执行结果最难处理,成功还是失败?其实都不是,最难处理的结果是超时,因为执行超时了,但是系统却并不知道它:

  • 是没执行,
  • 是执行成功了,
  • 还是执行失败了。

所谓超时,一个显然的问题是,超过多少时间才算超时?往往没有一个公式,更没有一个标准答案,我觉得《Designing Data-Intensive Applications》这本书里面对这一点总结得很好——对于超时时间的定义,其实就是一个 tradeoff,一个基于 failure detection delay 和 risk of premature timeouts 之间抉择的平衡。如果超时时间设置长了,就会减少超时判定的误杀,但是对于系统失败的识别就会延迟;反之,如果超时时间设置过短,那就会触发更多看起来是超时的 case,但是它们本身其实并没有真正超时。

通常来说,对于超时的处理,其实办法也不多。一种是放弃,一种是重试。就像消息投递,如果要保证 “至多投递一次”,那在投递超时后,就直接放弃;如果要保证 “至少投递一次”,那在投递超时后,就重试。如果要重试,那就需要引入保证幂等性的机制。

分布式事务 SAGA 对于超时的处理,其实也是遵照上面的原则,在系统内单步都成为事务的基础上,把流程视作一个状态机,无论单步操作是成功还是失败,都会根据清晰的预定义逻辑,触发相应的正向流程或者反向流程,可是唯独超时,多数情况下最有意义的事情就是重试,也只能重试,因为谁也不知道它究竟实际是成功了还是失败了。

说完操作超时,再来说一下节点超时。很多分布式系统中都会使用一种 lease(租约)的机制,比如一个集群中的 leader,作为 leader 会扮演不同的角色,但是必须要 renew 这个 lease,否则超过一定的时间,无论它给不给响应,它都会被开除出 leader 的角色,而 follower 会重新选举(或者其他方式)一个 leader。

比较难处理的是,如果这个节点本来是被 hang 住了,导致了超时,它也已经被踢下 leader 的角色,但是之后它 “活” 过来了(比如经过了一个超长时间的 GC),它还以为自己是 leader,继续去干 leader 干的事,变成了一个假 leader。这其实就是出现了脑裂,本质上是一个一致性的问题。这种情况比较难处理,因为即便有 heartbeat 不断检测,在每两个 heartbeat 的间隙,可能这种重要的变动就发生了。

要解决这种问题,需要使用 token fence 的方法,即让每次最关键的状态数据的更改,携带一个单调递增的 token,这种情况下这个假 leader 发起更改的 token,已经小于系统中最新的 token 了,接收这个数据更改的子系统应该拒掉这个请求。上面说的节点超时的情况我在《谈谈分布式锁》里面有详细说明。

计算机的两种时钟

有两种时钟是计算机普遍支持的,一种叫做 time-of-day clock,就是我们一般意义上的时钟,代表着相对于 1970 年 1 月 1 日的 epoch 时间,也就是 Java 里面 System.currentTimeMillis() 返回的。网络时间协议 NTP 就是用来同步计算机这个时间的。

不过,其实还有一种时钟,叫做 monotonic clock(单调时钟),在 Java 里面相应的接口是 System.nanoTime()。这个时钟有一个特点,就是它永不回头。对于 time-of-day clock 来说,时间是可能 “回头” 的,对于很多应用来说,时间回头是要命的。不过这个时钟给出的具体时间却是毫无意义,如果在不同的机器上调用 System.nanoTime(),会得到完全随机的结果。API 的名字是纳秒,可是这个时钟并不给出到纳秒的时间精度,它的作用是用来帮助计算间隔时间的:在同一个节点,第二次调用的时间减掉第一次调用的时间,这个结果(时间间隔)是严格递增(不回头)的。从这个意义上说,除去时间这个视角本身,这个时钟更像是一个单调的计数器。既然是单调的计数器,就可以用来帮助产生系统严格自增的 ID。

下面是 System.nanoTime() Javadoc 上面的解释:

Returns the current value of the most precise available system timer, in nanoseconds.
This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative). This method provides nanosecond precision, but not necessarily nanosecond accuracy. No guarantees are made about how frequently values change. Differences in successive calls that span greater than approximately 292 years (263 nanoseconds) will not accurately compute elapsed time due to numerical overflow.

TrueTime

一般来说,我们都知道计算机的时钟有误差,可是这个误差是多少,差 1 毫秒还是 1 分钟,并没有任何严格保证。绝大多数接触到的时间 API 也是如此,可是,Google 数据库 Spanner 的 TrueTime API 却。它使用了 GPS 时钟和原子钟两种完全独立的机制来冗余某一个机制失败导致的时钟问题,增加 reliability。此外,它还有和 System.nanoTime() 一样的严格递增的特点。

它有三个核心 API,很有意思:

  • TT.now() 它返回 [earliest, latest] 这样一个范围,表示当前时间就在这个范围内;
  • TT.after(t) 它返回当前时间是不是肯定在 t 之后
  • TT.before(t) 它返回当前时间是不是肯定在 t 之前

有了 TrueTime,这让分布式系统中,本来无法通过物理时钟解决的问题也变得可解决了。比如对于操作冲突的问题,现在的新办法就是等一个 buffer 时间,TrueTime 认为已经前一个操作的结束时间肯定已经过去了,再来启动后一个操作。当然,这个方法的缺点是 throughput,因为整个操作周期因为 buffer 时间的关系变长了。

《四火的唠叨》文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接

一站式操作系统 ISO 下载平台

2025年10月28日 00:00

找到一个安全、便捷且资源丰富且下载速度较快的操作系统 ISO 文件下载平台显得尤为重要。很多小伙伴习惯使用 MSDN,但又不喜欢其登录机制,这里杜老师推荐 OS.click,一款专注于为用户提供实用、高效的系统下载服务的网站。

丰富的资源库

OS.click 拥有海量操作系统 ISO 文件可供下载,涵盖了当下主流的两大操作系统阵营。

在 Windows 系统方面,无论是较为经典的 Windows 8.1,还是广泛运用于个人和企业的 Windows 10,以及最新的 Windows 11,都有完整且经过精心挑选整理的版本提供给用户。

无论您是想要体验全新的系统功能,还是需要回退到熟悉的旧版本进行系统恢复,甚至是搭建特定的测试环境,OS.click 都能满足您不同的需求。

对于 Linux 系统爱好者和开发者来说,这里同样是一座宝藏。Ubuntu 作为 Linux 系统中广受欢迎的发行版之一,以其用户友好的界面和强大的社区支持,吸引了众多用户。

在 OS.click 上,可以轻松获取到各个稳定版本的 Ubuntu ISO,方便用户快速搭建开发环境、进行系统测试或者部署服务器等操作。

而 Debian 作为 Linux 世界中以稳定性和安全性著称的系统,同样在 OS.click 上有丰富的资源,无论是用于个人桌面电脑还是企业级服务器的系统安装,都能在这里找到合适的 Debian ISO 版本。

快速便捷下载体验

网站名称中的 “lightning fast” 绝非夸大其词。

OS.click 通过先进的服务器技术和优化的网络架构,确保用户能够以极快的速度下载所需的 ISO 文件。

这意味着用户无需长时间等待,即可快速获取系统安装文件,大大提高了工作效率和使用体验。

无论您是处于家庭网络环境下,还是在企业内部网络中,OS.click 都能凭借其强大的网络资源和智能的流量分配机制,为用户提供智能、稳定且高速的下载通道,让用户能够迅速开始系统的安装或升级过程。

简洁直观用户界面

OS.click 的界面设计简洁明了,易于操作。

对于那些不熟悉技术或者对网络下载流程不太熟悉的新手用户来说,也能轻松上手。

在网站的首页,清晰地展示了可下载的各类操作系统 ISO 文件的列表,用户只需通过简单的点击操作,即可进入相应的下载页面。

没有繁琐的注册流程,也没有复杂的广告干扰,用户可以专注于寻找自己需要的系统文件并立即开始下载,节省了宝贵的时间和精力。

安全可靠下载保障

在互联网上下载软件或文件,安全性始终是用户最关心的问题之一。

OS.click 深知这一点,因此致力于为用户提供能够安全可靠的下载服务。

网站对所有的 ISO 文件都进行了严格的审核和筛选,确保这些文件没有携带恶意软件、病毒或者其他安全风险。

用户在 OS.click 上下载的系统文件,可以放心地用于安装和使用,大大降低了因下载到不安全文件而可能导致的系统故障、数据泄露等风险。

灵活多样应用场景

OS.click 的服务适用于多种场景。

例如,当用户的电脑出现系统故障,需要重装系统时,只需访问 OS.click,找到对应的系统 ISO 文件进行下载,然后通过简单的步骤制作启动盘,就能顺利完成系统的重新安装。

对于那些想要尝试不同操作系统以寻找更适合自己的系统环境的用户来说,OS.click 提供的丰富资源也为其提供了极大的便利性。

此外,对于企业 IT 管理人员而言,在企业内部进行批量的系统安装或者升级时,OS.click 快速稳定的下载服务能够有效提高工作效率,节省大量的时间和人力成本。

社区互动支持

OS.click 并不仅仅是一个单纯的下载平台,它还拥有活跃的用户社区。在这里,用户可以交流使用心得、分享经验技巧、寻求技术支持等。

对于在系统安装或使用过程中遇到的问题,用户可以在社区中提出咨询,其他同好或者经验丰富的用户会积极地提供帮助和解决方案。

这种良好的社区互动氛围,不仅增强了用户的使用体验,还促进了用户之间的知识共享和技术交流,有利于整个用户群体的技术水平提升。

在众多的操作系统 ISO 文件下载平台中,OS.click 凭借其丰富的资源、快速的下载速度、简洁友好的界面、安全保障以及多样化的应用场景,成为了众多用户在系统安装和升级过程中的首选。

无论是个人用户还是企业用户,无论是新手还是技术老手,OS.click 都能为他们提供满意的服务,助力他们在数字化世界的探索和工作中更加顺利高效。

如果您也在寻找一个可靠的系统 ISO 下载平台,不妨试试 OS.click,相信它不会让您失望。

三年半的新机为何比 11 年老机更卡?一次散热与维护全记录

2025年9月29日 08:00

电脑变“卡”,很多时候并不是性能不够,而是散热与维护问题。本文记录了我对一台用了三年半的新机进行的排查:从软件优化、清灰、更换硅脂,到水冷报废、改用风冷,再到风扇调节与硬件升级。最后整理出一份维护计划和配置建议,供大家参考。

当电脑开始出现:开机变慢、应用响应迟缓、风扇噪音增大,甚至系统不稳定,原因通常有两个:

  1. 散热效率下降 → 硬件降频;
  2. 硬件性能不足 → 难以满足新应用需求。

我家里有两台台式机:

  • 2014 年老机:Win10 系统,已用 11 年,依然运行流畅;
  • 2022 年新机:i7-12700KF + RTX 3080Ti + 64GB,当时算高配。

没想到,用了三年半后,新机竟然开始“卡顿”。于是我开始了一次彻底的散热与维护排查,以下是全过程记录。

工具诊断:先确认方向

动手之前,先用工具排查:

  • LatencyMon:检测系统延迟,用于排查日常使用中的卡顿问题。
  • HWMonitor:监控关键硬件的传感器数据,如温度、电压和风扇转速。
  • Process Explorer:深入分析进程信息,找出在系统响应缓慢时资源占用过高的程序。在 CPU 占用图中,绿色代表用户进程,红色则代表系统核心或驱动程序。

👉 建议的排查顺序:

  1. 先看是否是软件进程异常;
  2. 若软件正常,再重点检查散热和温度。

例如,我曾因开启 ManicTime 的屏幕截图功能,导致切换应用时出现短暂卡顿,关闭后问题立刻消失。此外,另一个可能原因是电源。我也是在一次突然断电黑屏后才察觉到这一点,而这通常难以及时判断。

硬件维护:散热是关键

清灰:第一步必做

散热问题往往来自灰尘。它会堵塞进气口、覆盖鳍片,导致温度升高、风扇狂转、最终触发降频。

清洁前准备

  1. 彻底断电:关机,关闭电源供应器(PSU)背后的开关,并拔掉电源线。
  2. 选择通风环境:最好在室外或阳台,避免灰尘在室内弥漫。
  3. 防静电:在接触任何内部组件前,务必触摸机箱的金属部分以释放身体静电。

清洁步骤

  1. 拆卸侧板:打开机箱,暴露内部组件。
  2. 清洁防尘网:找到并取下机箱的防尘网(通常位于前面板、顶部和PSU下方),用水或刷子彻底清洁。
  3. 吹灰:推荐使用压缩空气罐,短促、有力地喷射,并始终保持罐体直立,以防液态推进剂喷出。(我这次用了530精密电器清洁剂,后发现有些人说可能有硅油残留。为安全起见,建议用压缩空气。)
  4. 清洁风扇:在对CPU、显卡、机箱和PSU风扇进行吹灰时,必须用手指或棉签轻轻固定住扇叶,防止其因气流过快旋转而损坏轴承。对于附着牢固的灰尘,可以用棉签蘸取少量高纯度(>90%)异丙醇进行擦拭。
  5. 清洁散热鳍片:将气流对准CPU和显卡散热器的金属鳍片,吹走积聚在内部的灰尘。

SSD 散热:小投入,立竿见影

我的 SSD 待机温度常年 60℃+。加装被动散热片后,降至 40–50℃,卡顿现象有所缓解。安装时注意:SSD 上的原厂贴纸可能是保修凭证,可自行选择是否移除。

👉 建议:SSD 长期高温会影响寿命,几十元的散热片立竿见影。

CPU 导热硅脂:3–5 年就要换

导热硅脂填充在 CPU 顶盖与散热器底座之间,保证热量高效传导。几年后会逐渐干涸、硬化,导致 CPU 温度升高。

更换步骤:

  1. 拆卸CPU散热器:首先断开CPU风扇的电源线,然后根据散热器的固定方式(卡扣或螺丝)将其从主板上取下。由于旧硅脂可能有粘性,轻轻旋转一下散热器有助于分离。
  2. 清理旧硅脂:使用无绒布(如咖啡滤纸)或超细纤维布,蘸取适量异丙醇,彻底擦拭CPU顶盖和散热器底座上的所有旧硅脂。
  3. 涂抹新硅脂:将一粒米或豌豆大小的新硅脂挤在CPU中央即可。无需手动涂抹,散热器的压力会自动将其均匀压开,形成一个薄而均匀的导热层。
  4. 重新安装散热器:将散热器垂直、平稳地放回CPU上,避免滑动。然后以对角线顺序分次拧紧螺丝,以确保压力均匀分布。

⚠️ 不要用消毒湿巾或低浓度酒精,避免水分残留损伤硬件。

我更换硅脂后,开机温度直飙到 100℃。排查发现,并不是涂抹问题,而是水冷散热器老化。

一体水冷报废 → 换风冷更安心

一体式水冷散热器寿命通常只有 3–5 年。随着时间推移,可能会出现以下问题:

  • 冷却液损耗:虽然是密封系统,但仍有极少量冷却液会随时间蒸发,可能影响散热性能。
  • 水泵故障:这是最常见的故障点。如果系统过热且您在iCUE等监控软件中看到水泵转速(RPM)为0,或听到水泵发出异常噪音,则可能意味着水泵已经损坏。
  • 气泡问题:如果您听到水冷头或管道内有明显的“咕噜”或冒泡声,说明冷却循环内混入了空气。您可以尝试轻轻前后倾斜机箱,或将水泵转速设为最高运行一小时,以帮助将气泡排出水泵,聚集到冷排顶部。

我这套水冷用了三年半,性能已明显衰退,更换硅脂时甚至彻底坏掉。于是换上 200 元的双塔风冷,CPU 温度降至 30–50℃,比之前低了 20℃。

对比来看:

  • 老机的风冷 → 11 年依然坚挺;
  • 新机的水冷 → 3 年半报废。

👉 建议:能用风冷就别折腾水冷。

风道检查

更换风冷后,我在机箱顶部加装了两个 140mm 风扇。用 AIDA64 监控后发现:新风道是“负压”(出风大于进风)。虽然排热效率可能稍高,但容易从各处缝隙吸入灰尘。理想状态是略微正压,以兼顾散热与防尘。如果你搞不清风道怎么算,可以把传感数据都丢给AI分析。

于是我在 BIOS/UEFI 中调整了前置进风风扇的转速。操作流程是:开机时按特定键(通常是Del)进入BIOS设置,可以找到如“QFan Control”(华硕)、“Hardware Monitor”(微星)或“Smart Fan”(技嘉)等选项。在这里,您可以为CPU和机箱风扇选择预设模式(如静音、标准、性能),或根据温度手动设定风扇转速曲线。

调节时,注意记录主板接口与风扇的对应关系,便于后期调整。比如我的风扇布局如下:

进气:前 2(#3、#4)
CPU 风冷:双塔,从前吹后 (#2)
排气:上 2(#1)、后 1(#5)
GPU:自带 3 风扇

显卡风扇控制

与机箱风扇不同,显卡风扇需要专门的软件来进行控制。

  • 通用第三方工具:MSI Afterburner 是广受欢迎的显卡超频和监控工具,它兼容NVIDIA和AMD的绝大多数显卡。用户可以通过其“风扇”设置选项,启用自定义的自动风扇控制,并拖动节点来设定一条与GPU温度相对应的风扇转速曲线。
  • 品牌专用软件:
    • 华硕(ASUS):提供GPU Tweak III软件,用于调整显卡参数,包括风扇控制、超频和电压调整。
    • AMD:Adrenalin Edition 驱动套件中内建了“性能调优”工具,允许用户直接控制显存频率、核心频率以及风扇速度。
    • NVIDIA:也提供官方工具,允许用户动态调整风扇速度,并可设置基于温度的自动控制。

原本还计划顺便给显卡更换硅脂,但考虑到(手残)风险太大就放弃了。好在显卡平时温度维持在 60℃ 左右,属于正常范围。

电源:最容易被忽视的隐患

电源问题对电脑的影响远比想象中严重,但又很难直接诊断。当电源老化或供电不稳时,可能出现以下症状:

  • 电压波动:导致 CPU/GPU 降频保护,表现为不规则的卡顿或掉帧;
  • 突然断电/黑屏:高负载时电源供电不足,系统直接关机;
  • 啸叫/异响:电源内部元器件老化,发出高频噪音。

排查与处理建议:

  1. 直接接墙插:电源线应插入墙壁插座,而非排插,以减少电压损耗和静电干扰。
  2. 善用保修:台式机电源通常有 5–10 年的质保。我这台电源在使用三年半后,进入冬天经常需要彻底断电放静电才能开机。联系店家后成功更换了新的电源。第一台换来的存在啸叫问题,再次申请更换后,第二台才恢复正常。
  3. 更换全套模组线:如果更换电源,建议一并换掉所有模组线(显卡供电线、主板 24pin、CPU 8pin、SATA 线等),避免老化线材带来的接触不良。

我这次卡顿的根本原因很可能就是电源。换新后,系统稳定性明显改善,再也没有出现过无故黑屏或随机卡顿。

⚠️ 电源故障不像温度问题那样有明确数据可看,排查时容易被忽略。如果前面的散热、软件都没问题,电源值得重点怀疑。

软件优化:MSI Utility V3

MSI Utility V3 是一款第三方开发的小工具,通过启用 Message Signal Interrupt (MSI) 模式,优化 Windows 的中断处理,避免传统线基中断容易因共享 IRQ 产生冲突而出现的高延迟(DPC/ISR 延迟)、随机卡顿。

十年内的电脑基本都支持 MSI Utility V3,我个人体验效果明显。AMD 显卡默认开启 MSI,NVIDIA 需手动切换。

使用方法:

  1. 下载 Msi-Utility-v3
  2. 以管理员身份运行 MSI_util_v3.exe
  3. 找到显卡(如 "NVIDIA GeForce RTX xxxx") → 勾选 “MSI” → 优先级设为 High
  4. 点击右上角 "Apply",重启电脑生效

推荐设置:显卡/声卡/网卡设为 High,NVMe 控制器设为 Normal。

硬件升级:低成本提升

SSD 升级

把系统盘从机械硬盘迁移到固态硬盘(SSD),提升最明显:开机时间大幅缩短、系统响应变快。

实现迁移主要有两种途径:

  • 克隆:使用专用软件将旧硬盘的内容完整复制到新SSD上。这种方法保留了所有数据和设置,非常便捷,但有时也会将旧系统中的潜在问题一并带过来。
  • 全新安装:在新SSD上全新安装Windows,然后重新安装应用程序并迁移个人数据。虽然步骤较多,但能保证最佳的性能和稳定性。

内存升级

内存不足时,系统会频繁调用虚拟内存(硬盘空间),造成明显卡顿。但在如今的大多数场景下,这个瓶颈已经不常见。对 Win11 用户来说,32GB 已经足够覆盖日常使用。我自己的 64GB 内存,常年占用不到 40%。

如果你要升级内存,要注意以下几点:

  • 检查兼容性:确定主板支持的 DDR 类型、最大容量与频率。
  • 双通道更优:例如 2×8GB 比单条 16GB 性能好。安装时需将内存条插入主板上指定的配对插槽中。
  • 频率设置:部分内存需在 BIOS 启用扩展内存预设(XMP)才能跑满标称频率。例如,DDR5-6000 内存条一般默认仅以4800MHz的频率运行。

总结与维护计划

调整后,整机表现明显改善:

  • CPU 温度 ↓ 20℃
  • SSD 温度 ↓ 15℃
  • LatencyMon 测试一整天无异常

长期维护表

| 频率 | 任务 | | :

在银河麒麟桌面操作系统 ARM 版上安装 KVM 虚拟化

2025年8月17日 00:00

KVM 是一种开源全虚拟化解决方案,能够在 Linux 系统运行多个操作系统。本文将详细介绍如何在银河麒麟桌面操作系统 ARM 版安装 KVM 虚拟化环境,帮助用户搭建高效的虚拟化平台。

准备工作

  1. 硬件要求

确保 ARM 架构设备支持虚拟化技术。通常,支持虚拟化的 ARM 处理器会支持硬件辅助虚拟化功能。

系统至少需要 4GB 内存和 20GB 的硬盘空间。

  1. 软件要求

银河麒麟桌面操作系统 ARM 版「如 V10」

KVM 虚拟化相关的软件包。

安装 KVM 虚拟化环境

  1. 安装 KVM 和相关工具
1
2
sudo apt update
sudo apt -y install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

注意:在银河麒麟桌面操作系统 ARM 版上,可以通过上面命令安装 KVM 和相关工具。

  1. 包的作用

上面软件包的作用如下:

包名作用
qemu-kvm提供 KVM 虚拟化核心功能
libvirt-daemon-system用于管理虚拟机的后端服务
libvirt-clients提供客户端工具管理虚拟机
bridge-utils用于配置网络桥接
virt-manager提供图形化界面管理虚拟机
  1. 添加用户到 libvirt 组内
1
sudo usermod -aG libvirt $(whoami)

注意:为方便管理虚拟机,需要将当前用户添加到 libvirt 组,然后注销重新登录,使组成员关系生效。

  1. 验证是否安装成功
1
virsh --version

注意:运行上面命令来检查 KVM 是否正常工作,如果返回版本信息,说明 KVM 安装成功了。

创建 KVM 虚拟机

  1. 下载镜像

可以从银河麒麟官方网站下载适合 ARM 架构的虚拟机镜像文件。

Kylin-Desktop-V10-SP1-2403-Release-20240430-arm64.iso 文件。

  1. 创建虚拟磁盘
1
qemu-img create -f qcow2 /path/to/disk.img 50G

注意:使用上面命令创建虚拟磁盘。其中/path/to/disk.img 是虚拟磁盘路径,50G 表示磁盘的大小。

  1. 启动 KVM 虚拟机安装
1
qemu-system-aarch64 -m 2048 -cpu cortex-a76 -smp 4 -M virt -bios /path/to/QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=/path/to/disk.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=/path/to/Kylin-Desktop-V10-SP1-2403-Release-20240430-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom

注意:使用上面命令启动 KVM 虚拟机安装。其中-m 2048 分配 2048MB 内存;-cpu cortex-a76 指定 CPU 类型;-smp 4 是指定虚拟 CPU 核心数。

  1. 完成安装

按照虚拟机安装界面的提示完成安装过程。

安装完成后 KVM 虚拟机将自动重启。

使用 KVM 管理虚拟机

  1. 使用 virsh 命令行工具

列出所有 KVM 虚拟机:

1
virsh list --all

启动 KVM 虚拟机:

1
virsh start <KVM 虚拟机名称>

关闭 KVM 虚拟机:

1
virsh shutdown <KVM 虚拟机名称>

强制停止 KVM 虚拟机:

1
virsh destroy <KVM 虚拟机名称>

挂起 KVM 虚拟机:

1
virsh suspend <KVM 虚拟机名称>

恢复挂起 KVM 虚拟机:

1
virsh resume <KVM 虚拟机名称>
  1. 使用 virt-manager 图形化界面

virt-manager 提供了一个直观的图形化界面,方便用户管理 KVM 虚拟机。

启动 virt-manager 后,可以连接到本地或者远程的 KVM 服务器,创建、启动、停止 KVM 虚拟机。

❌