两种系统哲学的分野:为什么 Windows 选项了 IOCP?|服务器|采取程序|操作系统|unix|linux|命令提示符|windows_网易订阅
时间:2026-08-08 22:16:12 来源:知来藏往网

本文来自微信公众号: 宇众不一样的两种露萱 ,作者:宇众不一样的系统选项序操露萱,原文标题:《两种系统哲学的哲学作系分野:为什么 Windows 选项了 IOCP?》一个值得琢磨的比较:Linux世界里,从select、分订阅poll一路演化到epoll,服务符再到近几年的器采取程io_uring,这条路走了将近三十年。统u提示而Windows,命令早在1994年发布Windows NT 3.5的网易时候,就已经给予了一套至今几乎没有被替代过的两种高并发I/O模型——IOCP(I/O Completion Port,I/O实现端口)。系统选项序操更耐人寻味的哲学作系是,Linux最新的分订阅io_uring,设方式哲学上居然和这套快三十年前的服务符Windows方式划越来越像。这中间到底发生了什么?器采取程故事背景:1990年代初,一台服务器该怎么同时伺候成千上万个连接?把时间拨回1980年代末到1990年代初。彼时,微软正在打造一个全新的操作系统内核,用来彻底取代老旧的DOS架构——这就是后来的Windows NT。负责这个项目的题人物,是从DEC(数字设备公司)挖来的传奇工程师Dave Cutler,他之前主导设方式了DEC的VMS操作系统,是操作系统内核设方式领域举足轻重的人物。Windows NT从一最初就瞄准的是服务器级别的场景——这意味着它必须直面一个当时几乎所有操作系统都在挣扎的状况:当一台服务器需同时处理成百上千个网络连接时,操作系统的I/O模型该怎么设方式,才能既保证并发能力,又不把CPU和内存资源全部耗死在"等待"上?这个状况后来在互联网爆发的年代,被Unix社区称为著名的C10K状况——如何让一台服务器同时支撑一万个并发连接。而在Windows NT诞生的那个更早的年代,微软的内核团队已经在为类似的挑战寻找答案,只然而他们走的是一条和后来Unix世界主流路线截然不一样的馗。旧方式划为什么失败?每连接一个线程(Thread-Per-Connection):这是最直觉的方式划——每来一个客户端连接,就创建一个线程专业处理它的读写。逻辑清楚、编程模型便捷,几乎是当时大多数网络服务的原则写法。但状况在于,线程从来不是免费的资源:每个线程都需独立的内核栈空间(常见是1MB量级),当连接数实现几千甚至上万时,仅仅是线程本身占用的内存就已经相当可观,更致命的是,操作系统在成百上千个线程之间来回**上下文切换(Context Switch)**的开销,会随着线程数量增首先而急剧膨胀——大部分CPU时间被浪费在"决定接下来运行哪个线程"这件事本身,而不是真正处理业务逻辑。阻塞式同步I/O:线程调用一次读操作,如果数据还没到达,线程就会被操作系统挂起,直到数据就绪。这种模型下,一个线程在等待I/O的这段时间里完全是"死"的,无法做任何其他有意义的工作——如果你想同时处理多个连接,唯一的方式就是开更多线程,回到上面那个死胡同。基于消息循环的异步通知(例如早期Windows给予的WSAAsyncSelect):把I/O事件转换成Windows消息,投递到采取程序的消息队列里,程序在消息循环里处理这些通知。这种方式确实避免了阻塞,但它天然和Windows的GUI消息机制绑定在一起,在真正高并发、高吞吐的服务器场景下,消息队列的处理效率和扩展性都远远不够。这些方式划共同的困境是:它们都没有回答一个题矛盾——并发连接数可能是成千上万,但一台机器真正能同时实施代码的CPU题数,却只有个位数或者几十个。如果线程数量和连接数量强绑定,系统迟早会被压垮。真正的突破:不问"谁准备好了",而是"谁刚刚做完"Windows NT内核团队给出的答案是IOCP——I/O实现端口,随Windows NT 3.5于1994年正式发布。它的设方式哲学,和后来Unix世界主流的select、poll、epoll有一个根本性的分歧,理解这个分歧,是理解IOCP为什么尤其的题。Unix世界的主流模型,本质上是**"就绪通知"(Readiness Notification)**:采取程序问操作系统,"这些socket里,哪些目前已经可以读或者可以写了?",得到答案后,采取程序自己去实施真正的读写操作。而IOCP走的是完全不一样的路——"实现通知"(Completion Notification):采取程序直接发起一次异步的读或写请求(这被称为Overlapped I/O,重叠I/O),然后立刻返回去做别的事情,由操作系统内核在后台真正实现这次数据搬运,等数据已经读好、或者已经写完之后,内核才把"这件事已经做完了"的通知,投递到一个叫"实现端口"的内核队列里。这个设方式和Dave Cutler之前在DEC VMS系统上的经验一脉相承——VMS本身就有相当成熟的异步I/O实现机制,Cutler把这套思路带进了Windows NT的内核设方式中。IOCP真正巧妙的地方在于它同时处理了两个状况:首先,采取程序不再需为每个连接分配一个专属线程——发起异步I/O之后线程立刻释放,可以去处理别的连接;第二,实现端口允许你自己控制"到底应该有多少个线程在同时处理这些实现通知",微软给出的经典实践提议是——工作线程数量应该和CPU题数大致匹配,多个线程共享同一个实现端口,谁空闲了,就去队列里取下一个已经实现的I/O任务来处理。这就从根本上把"并发连接数"和"实际工作线程数"这两个变量彻底解耦了。源码里的体现IOCP的编程模型题,浓缩在两个函数调用里:CreateIoCompletionPort用于创建实现端口,并把一个个socket或者文件句柄"关联"到这个端口上;而工作线程只需反复调用GetQueuedCompletionStatus,这个调用会阻塞在这里,直到内核队列里出现一个已经实现的I/O操作,线程被唤醒,拿到这个实现结荚,处理完业务逻辑后,再回来后续调用这个函数等待下一个任务。这段代码背后最值得玩味的设方式,是实现端口内部维护的先进先出队列,加上一个"并发值"参数——你可以在创建端口时指定,同一时刻最多允许多少个线程真正处于"运行"状态(常见设为CPU题数),当某个正在运行的线程因为其他因素阻塞时,内核会智能地唤醒队列里等待的下一个线程来补位,尽可能让CPU题始终保持"满载但然而载"的状态。这本质上是把"如何合理调度线程去匹配CPU资源"这件极其复杂的事情,直接下沉进了内核里实现,而不是交给采取程序自己摸索。设方式思想IOCP的设方式浓缩了几种在高性能系统里反复出现的题思想:实现驱动而非就绪驱动:不问"能不能做",而是让内核直接把"已经做完"的结荚送到你面前,减小了采取层需主动轮询和调度的复杂度。线程池思想,与连接数彻底解耦:并发连接数可以是几万,工作线程数量却始终稳固地贴合CPU题数量。内核级别的负载均衡:把线程调度的精细决策,交给最认识硬件状态的内核,而不是采取层自己去猜。零拷贝的延伸空间:重叠I/O的异步模型,天然为之后结合DMA、分散/聚集(Scatter-Gather)等零拷贝技术留出了空间。为什么它最后赢了?IOCP之因此在Windows生态里首先期保持"没有真正对手"的地位,是因为它一次性处理了高并发服务器最题的两个痛点——既不需为每个连接付出一个线程的代价,又能让有限的CPU题得到充分且然而载的利用。这套模型此后成为Windows高性能网络服务的事实原则:IIS(Internet Information Services)、SQL Server的网络层,首先期基于IOCP构建;.NET的异步I/O体系、涵盖后来的async/await语法糖,底层在Windows平台上很大程度依赖IOCP给予的异步能力;跨平台的libuv(Node.js的底层事件循环库)在Windows平台上,专业用IOCP作为其异步I/O的实现后端,与Linux平台上采取epoll的实现分庭抗礼;Rust生态里的异步运行时Tokio,同样在Windows上基于IOCP构建其底层驱动。它真正变化的,是"高并发网络编程"这件事在Windows世界里的默认答案——不再需工程师自己去纠结线程池大小该怎么调、连接数暴涨了该怎么办,这些复杂度被系统性地下沉进了操作系统内核这一层。有没有更好的方式划?耐人寻味的是,Linux世界这些年也在朝着IOCP当年的方向靠拢。2019年,Linux内核开发者Jens Axboe提出了io_uring,这是Linux异步I/O历史上一次真正意义上的范式转变——它同样采取了"实现队列"的设方式,用户态和内核态共享一片环形缓冲区,采取程序提交I/O请求,内核实现后把结荚写入实现队列,用户态几乎不需额外的系统调用开销就能拿到结荚。这本质上就是**"实现驱动"哲学在Linux世界的一次迟到二十多年的回归**——某种意义上,这是对IOCP当年设方式理念的一次隔空致敬(尽管两者在详详见细实现细节上有相当大的区别,io_uring更进一步利用了共享内存环减小系统调用次数)。更现代的多核架构、更强调低延迟的NVMe存储设备,让"减小系统调用次数、减小内核态用户态切换"变得越来越题,这也是io_uring相比传统epoll更进一步的题动机之一。而在编程语言层面,Rust的async/await、Go的goroutine调度器、Java 21引入的Virtual Thread(虚拟线程),都在用不一样的方式,试图把"高并发编程"这件事的心智负担,从工程师手中进一步转移给运行时和调度器——这条馗上,IOCP当年"让内核帮你管理线程和I/O实现"的思路,可以说是一次相当早期的先声。现实中的采取IIS(Internet Information Services):微软自家Web服务器,网络层首先期基于IOCP构建。SQL Server:数据库引擎的网络通信层同样依赖IOCP实现高并发连接处理。.NET/.NET Core:异步I/O与async/await编程模型在Windows平台上的底层实现基础之一。libuv(Node.js):在Windows平台专业采取IOCP作为异步事件循环的后端实现。Tokio(Rust异步运行时):跨平台异步运行时在Windows上同样基于IOCP构建其I/O驱动。这些系统的共同选项,反映出一个朴素的事实:只关键你需在Windows平台上构建高并发、高吞吐的网络服务,IOCP几乎始终是那个绕不开的底层答案。本材料由作者授权发布,观点仅代表作者本人,不代表虎嗅立场。如对本稿件有异议或投诉,请关联 tougao@huxiu.com。本文来自虎嗅,原文链接:https://www.huxiu.com/article/4880691.html?f=wyxwapp
-
“人工智能+”,解锁更多新可能昊志机电股价跌5.02%,华夏基金旗下1只基金位居十大流通股东,持有274.46万股浮亏损失935.91万元网宿科技股价跌6.63%,南方基金旗下1只基金位居十大流通股东,持有1782.15万股浮亏损失1675.22万元家电ETF国泰(159996)开盘跌0.86%,重仓股格力电器涨0.05%,美的集团跌0.02%求助各位老哥,高中生是否应该抽出午休健身-步行街主干道-虎扑社区九安医疗股价跌5.99%,博道基金旗下1只基金重仓,持有1.34万股浮亏损失5.9万元景旺电子股价跌6.49%,新沃基金旗下1只基金重仓,持有6000股浮亏损失2.87万元景旺电子股价跌6.49%,民生加银基金旗下2只基金重仓,合计持有4.61万股浮亏损失22.08万元澳洲名将自曝非天生开罐手,仍将担纲20场重任|海德|卡瓦|乌斯曼_网易订阅康美特股价跌5.27%,南方基金旗下8只基金重仓,合计持有1600股浮亏损失2064元
相关内容
- ·港澳大学生逐浪海南自贸港:跨越千年读懂东坡
- ·九安医疗股价跌5.99%,招商基金旗下1只基金重仓,持有22.31万股浮亏损失98.14万元
- ·大元泵业股价跌5.02%,天弘基金旗下1只基金重仓,持有2.99万股浮亏损失9.24万元
- ·中国天楹股价涨6.42%,汇丰晋信基金旗下1只基金重仓,持有108.71万股浮盈赚取33.7万元
- ·《大步同行》克制修复音量 称听见身边玩家是设计核心|游戏|音效|麦克风_网易订阅
- ·锦浪科技股价涨5.66%,西部利得基金旗下1只基金重仓,持有49.03万股浮盈赚取172.59万元
- ·杰瑞股份股价涨7.18%,摩根士丹利基金旗下2只基金重仓,合计持有27.76万股浮盈赚取269.27万元
- ·深信服股价跌5.99%,万家基金旗下5只基金重仓,合计持有992.73万股浮亏损失6591.7万元
- ·小五说了,第3把没上山确实可惜了。-绝地求生-虎扑社区
- ·沪深300ETF汇添富(515310)开盘跌1.12%,重仓股中际旭创跌2.05%,宁德时代跌0.73%
- ·新泉股份股价跌5.22%,弘毅远方基金旗下1只基金重仓,持有22.12万股浮亏损失46.89万元
- ·九安医疗股价跌5.99%,长安基金旗下1只基金重仓,持有10万股浮亏损失44万元
- ·[流言板]CYBL官方分享精彩片段:19记三分,浙江双加时首胜-CBA-CBA专区-虎扑社区
- ·新泉股份股价跌5.22%,南华基金旗下1只基金重仓,持有2.72万股浮亏损失5.77万元
- ·深信服股价跌5.99%,德邦基金旗下1只基金位居十大流通股东,持有306.15万股浮亏损失2032.86万元
- ·新能源车ETF华夏(515030)开盘跌1.62%,重仓股宁德时代跌0.73%,比亚迪跌1.21%
最新内容
- ·全球@中国|肯尼亚学者:中非贸易创新高为非洲经济发展创造新机遇_市场准入_产品_建设
- ·人工智能ETF华富(515980)开盘跌2.24%,重仓股寒武纪跌1.04%,新易盛跌3.09%
- ·锦浪科技股价涨5.66%,安信基金旗下1只基金重仓,持有9.76万股浮盈赚取34.36万元
- ·大元泵业股价跌5.02%,华夏基金旗下1只基金重仓,持有59.51万股浮亏损失183.89万元
- ·张凌赫童年照被考古 | 从素人萌娃到“贵圈顶帅”,颜值如何升级?|素颜|侧颜|婴儿肥_网易订阅
- ·杰瑞股份股价涨7.18%,财通证券资管旗下4只基金重仓,合计持有69.37万股浮盈赚取672.89万元
- ·景旺电子股价跌6.49%,大成基金旗下1只基金重仓,持有1900股浮亏损失9101元
- ·陇神戎发股价跌5.91%,招商基金旗下1只基金重仓,持有9500股浮亏损失7220元
- ·罗德里的转会越拖越可能失败-西甲-巴萨专区-虎扑社区
- ·沪深300ETF华安(515390)开盘跌0.22%,重仓股中际旭创跌2.05%,宁德时代跌0.73%
推荐内容
热点内容
- ·八月天降横财!这4个生肖苦尽甘来,事业财运双丰收,有你吗?|好运|猴人|生肖马|成语本义_网易订阅
- ·大元泵业股价跌5.02%,鹏华基金旗下2只基金重仓,合计持有70.98万股浮亏损失219.33万元
- ·家电ETF国泰(159996)开盘跌0.86%,重仓股格力电器涨0.05%,美的集团跌0.02%
- ·景旺电子股价跌6.49%,宝盈基金旗下3只基金重仓,合计持有179.91万股浮亏损失861.77万元
- ·新疆4A级及以上景区自驾服务费均改为按车收费_旅游_调整_过渡期
- ·有研硅股价跌5.78%,富国基金旗下1只基金重仓,持有1600股浮亏损失3776元
- ·康美特股价跌5.27%,永赢基金旗下1只基金重仓,持有100股浮亏损失129元
- ·戈碧迦股价跌7.18%,浦银安盛基金旗下1只基金重仓,持有5.52万股浮亏损失49.55万元
- ·后藤启介:在国家队用餐期间迟到会被罚款,我都是提前10分钟到|日本|世界杯|朝日电视台_网易订阅
- ·钢铁ETF国泰(515210)开盘跌0.86%,重仓股宝钢股份涨0.00%,包钢股份跌0.90%
