普通视图

微软操作系统在2025年12月才开始支持NVMe协议

2026年1月4日 21:23

垃圾微软又一次成功的刷新了我对其垃圾程度的认知。


技术简介

首先为不了解技术名词和技术原理的朋友简单讲一下。

传统的存储设备中,机械硬盘都是靠电机+磁头的方式工作,光驱也是靠相似结构的电机+激光头工作。这就意味着这种类型的设备在同一时间内只可能完成一个查询请求(CRUD,增删查改),不存在并发查询的可能性。

img_BV1iT4y1k7G7-1

(希捷 Exos X18 18TB氦气硬盘开盖结构)

img_BV1U8411s7Mh-1

(希捷双磁臂硬盘工作方式)

img_BV1iT4y1k7G7-2

(希捷双磁臂近照)

图片来自:

而对应的存储设备的 接口/传输协议:SATA,是专门为这些存储设备设计的,也仅支持单并发。

(因本人目前能查到的SAS接口的技术详情有限,本文不讨论SAS接口)

  • 2003年的SATA 1.0 版本原始带宽为 1.5Gbps,传输速率约 150MB/s
  • 2004年的SATA 2.0 版本则翻倍,原始带宽为 3Gbps,传输速率约 300MB/s
  • 2009年的SATA 3.0 版本则继续翻倍,原始带宽为 6Gbps,传输速率约 600MB/s

而2025年,机械硬盘最高的持续传输速率大概也只到 300MB/s 左右。

img_sata_hdds

(3.5寸机械硬盘和2.5寸机械硬盘的接口。注意,短的那个才是SATA接口,长的那个是电源接口)

img_SATA_ports

(SATA数据线和SATA插座)

固态硬盘开始普及后,一开始固态硬盘使用和2.5寸机械硬盘相同的硬件外观,使用标准SATA接口。体积太大!没那个必要。后来开始用mSATA协议,体积缩小,但是仍然受限于SATA的单并发查询限制。行业新定义了m.2接口,更小。同时定义了新的传输规范 NVMe,其支持固态存储的并行查询能力,理论上一次支持最多64000个并发查询。其他优点我在这里就不讲了。

img_MSATA_SSD_vs._2.5__SATA_drive

(2.5寸SATA接口硬盘 与 mSATA接口硬盘)

img_M2_and_mSATA_SSDs

(mSATA固态硬盘(左) 与 m.2固态硬盘(右))

注意:m.2 接口同时有 SATA 版本和 NVMe 版本,SATA 版本是走 SATA 协议的,仅支持单并发查询。所以正常人都在你买固态的时候,推荐你买 m.2 接口走 NVMe 协议的固态。SATA 接口的固态主要还是为了供给那些只有SATA接口的老电脑和老存储服务器使用,m.2 接口走 SATA 协议的版本同样也只是为了迁就过渡时期有 m.2 接口却不支持NVMe协议的旧主板。至于奸商的歪理邪说我就不提了。(固态硬盘的成本都在颗粒上,协议和接口对价格没太大影响)

小总结

讲到这里其实就已经很清晰了。

  • 给机械硬盘设计的 SATA 协议不支持并发查询
  • 给固态硬盘设计的 NVMe 协议支持并发查询

用支持 NVMe 的固态硬盘就对了。(除非旧电脑没有硬件条件)


垃圾微软

NVMe 协议比 SATA 协议性能好,这本身就是个很简单也很容易理解的道理。

然后傻逼的微软就开始搞笑了。

NVMe 协议开始于 2011 年,大约在 2015 年前后,包括 ChromeOS 和 iOS 在内的多数操作系统都添加了对 NVMe 的原生支持。而 Linux 更是早早的在 2012年就已经在内核中添加了对 NVMe 的支持。

而2025年12月份,微软才正式官方支持 NVMe 协议,而在这之前,微软的所有操作系统是 把 NVMe设备 当作 SCSI设备 处理的

也就是说:微软操作系统(包括最新版的Win11,以及服务器版的 Windows Server 2025)都不支持 NVMe 协议。插上去的支持 NVMe 的固态硬盘被当作旧 SCSI 协议的机械硬盘一样对待。(来源:微软官方,链接使用了 文本片段(Text Fragment) 功能以通过 URL 高亮特定的文本,但微软官网会清除对应的高亮,垃圾微软)

screenshot_on_b85m_by_flameshot_at_2026-01-04_20-52-52

screenshot_on_b85m_by_flameshot_at_2026-01-04_20-51-54

说实话,虽然只有东亚国家和俄罗斯会使用 黑色方框示亡号,但是看到 Microsoft 上带个黑框,感觉微软也早就死了

个人猜测:理论上NVMe协议可以让固态硬盘直连CPU,在延迟性能上要比需要经过SATA控制器的SATA硬盘好得多。但由于微软的废物逻辑,由操作系统产生的硬盘操作指令是SCSI指令,还要再由CPU翻译成NVMe指令,其延迟性能可能比有原生SATA支持且有单独处理芯片的SATA性能还差。

也就是说你的 Windows系统 的 电脑/服务器,固态硬盘插 m.2接口 还是插 SATA接口,走 NVMe协议 还是 SATA协议,性能都是一样烂的。


其他补充

关于SAS

虽然研究不够深,但是对于泛用于企业级硬盘的SAS接口,情况相同:

SAS(Serial Attached SCSI)同样仅支持单队列,与SATA情况相同,只不过其队列深度比SATA要高。

关于AHCI

其实我没太搞明白AHCI和SATA之间的关系。

 

如果你有更全面的参考资料的话,可以分享。


参考资料


结论

垃圾微软!

The post 微软操作系统在2025年12月才开始支持NVMe协议 first appeared on 石樱灯笼博客.

使用原子 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")...

Ubuntu 关闭 Pro 更新提示

2025年7月15日 21:12

系统版本 Ubuntu 24.04

每次 apt update 都会带出一大堆提示升级但需要 ubuntu pro 才能升级的提示,比如:

Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
  vlc-plugin-qt libvlc5 libzvbi-common vlc-data libvlccore9 vlc vlc-bin
  vlc-l10n libcjson1 libavdevice60 ffmpeg libpostproc57 vlc-plugin-samba
  libavcodec60 libzvbi0t64 vlc-plugin-notify libavutil58 libswscale7
  vlc-plugin-access-extra vlc-plugin-skins2 vlc-plugin-video-splitter
  libswresample4 vlc-plugin-video-output libavformat60 v2ray libvlc-bin
  vlc-plugin-base vlc-plugin-visualization libavfilter9
Learn more about Ubuntu Pro at https://ubuntu.com/pro

看着乱不说,心理还不爽,vlc 插件居然要 pro 才能升级?关了关了。

终端下打开文件夹:

cd /var/lib/ubuntu-advantage/apt-esm/etc/apt/sources.list.d
ls

编辑文件夹下的 ubuntu-esm-apps.sources 文件。

sudo vi ubuntu-esm-apps.sources

将文件里面所有行都用 # 注释掉,最后结果:

# Written by ubuntu-pro-client
# Types: deb
# URIs: https://esm.ubuntu.com/apps/ubuntu
# Suites: noble-apps-security noble-apps-updates
# Components: main
# Signed-By: /usr/share/keyrings/ubuntu-pro-esm-apps.gpg

再次执行 apt update apt upgrade 就不会出现 Ubuntu pro 才能更新的提示了。

Windows 11 升级 24H2 提示 ahsProtector 尚未准备好

2025年7月10日 08:55

问题

Windows 11 升级 24H2 提示下面的错误:

ahsProtector
你的电脑上有服务尚未准备好用于此版本的Windows。有新版本可用。

如图:

win11-24H2-ahsProtector

解决办法

  1. 打开 C:\Windows\System32\drivers\ 文件夹
  2. 找到文件 ahs_protect.sys
  3. 将上面的文件名改为 ahs_protect.sys.bak

回到上面的提示框,点刷新即可继续升级。

升级完成后,会自动出现 ahs_protect.sys 文件,你可以把重命名的 .bak 文件删除了。

❌