两种系统哲学的分野:为什么 Windows 选项了 IOCP?|服务器|采取程序|操作系统|unix|linux|命令提示符|windows_网易订阅
发布时间:2026-08-08 23:23:38 作者:玩站小弟
我要评论
本文来自微信公众号: 宇众不同的露萱 ,作者:宇众不同的露萱,原文标题:《两种系统哲学的分野:为什么 Windows 选择了 IOCP?》一个值得琢磨的对比:Linux世界里,从select、poll
。

本文来自微信公众号: 宇众不一样的两种露萱 ,作者:宇众不一样的系统选项序操露萱,原文标题:《两种系统哲学的哲学作系分野:为什么 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
相关文章

曼城队长人选生变:迪亚斯有望接棒,罗德里3800万镑或转投巴萨|瓜迪奥拉|十大中场|巴塞罗那队|荷西·迪亚斯_网易订阅
恩佐·马雷斯卡将为自己的曼城队长阵容做出选择,并希望任命一名英格兰球员进入他的领导团队。据消息人士透露,马雷斯卡将决定谁接替贝尔纳多·席尔瓦成为新队长,后者已在夏天以自由转会方式加盟皇家马德里。此前,2026-08-08
我是如何从亏损10万到赚回300万,只因死记“开盘冲3到5,横7竖8是猛虎”,稳定的投资_新浪财经_新浪网
来源:A股荟萃)如何操作股票买卖法——开盘就冲3和5,横7竖8是猛虎“开盘冲3到5,横7竖8是猛虎”到底是什么样的呢?它就是投资者所选择的目标股,如果开盘就冲到3到5个点,分时均价线跟上来,当股价稍作2026-08-08
新媒:世界重回“帝国时代”了吗?|美国|欧盟|俄罗斯|殖民地_网易订阅
参考消息网8月3日报道新加坡《联合早报》网站7月30日发表题为《世界重回“帝国时代”了吗?》的文章,作者是德国时评作家于大勇。文章摘编如下:面对百年未有之大变局,“帝国回归”又登上西方媒体的热门话题榜2026-08-08
跌幅榜丨同类跌幅最小!半导体设备ETF万家(159327)跌9.3%_新浪财经_新浪网
8月3日,半导体设备ETF万家159327)报收0.973元,收跌9.32%,成交金额3.66亿元。同类基金中跌幅最小。半导体设备ETF万家成立于2024年07月24日,管理人为万家基金,基金经理为吴2026-08-08
央视新闻客户端消息新闻联播):今年上半年,我国乡村产业提质增效,随着新装备、新技术、新工艺的加快应用,乡村特色产业全链升级。眼下,山东威海无花果正值采收季。过去,这种怕磕碰、易腐烂的鲜果很难走出本地市2026-08-08
因“仓促引入杠杆ETF”,韩总统办公室高官面临刑事指控!韩股收跌5.13%,SK海力士和三星电子均跌近9% | 日韩股市_新浪财经_新浪网
来源:@每日经济新闻微博#韩国高官因ETF被刑事指控##韩股年内第10次熔断# 【因“仓促引入杠杆ETF”,#韩总统办公室高官面临刑事指控#!韩股收跌5.13%,#SK海力士和三星电子均跌近9%# |2026-08-08

最新评论