应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

IO多路复用,从来没遇到过这么明白的文章

  大家好,我是涛哥。
  很多对技术有追求的读者朋友,做到一定阶段后都希望技术有所精进。有些读者朋友可能会研究一些中间件的技术架构和实现原理。比如,Nginx为什么能同时支撑数万乃至数十万的连接?为什么单工作线程的Redis性能比多线程的Memcached还要强?Dubbo的底层实现是怎样的,为什么他的通信效率非常高?
  实际上,上面的一些问题都和网络模型相关。本文从基础的概念和网络编程开始,循序渐进讲解Linux五大网络模型,包括耳熟能详的多路复用IO模型。相信读完本文,大家会对网络编程和网络模型有一个较清晰的理解。
  本文2800字,阅读需要10分钟。百度一百篇,不如收藏这一篇。
  基本概念
  我们先来了解几个基本概念。
  什么是IO?
  所谓的IO(InputOutput)操作实际上就是输入输出的数据传输行为。程序员最关注的主要是磁盘IO和网络IO,因为这两个IO操作和应用程序的关系最直接最紧密。
  磁盘IO:磁盘的输入输出,比如磁盘和内存之间的数据传输。
  网络IO:不同系统间跨网络的数据传输,比如两个系统间的远程接口调用。
  下面这张图展示了应用程序中发生IO的具体场景:
  通过上图,我们可以了解到IO操作发生的具体场景。一个请求过程可能会发生很多次的IO操作:
  1,页面请求到服务器会发生网络IO
  2,服务之间远程调用会发生网络IO
  3,应用程序访问数据库会发生网络IO
  4,数据库查询或者写入数据会发生磁盘IO
  阻塞与非阻塞
  所谓阻塞,就是发出一个请求不能立刻返回响应,要等所有的逻辑全处理完才能返回响应。
  非阻塞反之,发出一个请求立刻返回应答,不用等处理完所有逻辑。
  内核空间与用户空间
  在Linux中,应用程序稳定性远远比不上操作系统程序,为了保证操作系统的稳定性,Linux区分了内核空间和用户空间。可以这样理解,内核空间运行操作系统程序和驱动程序,用户空间运行应用程序。Linux以这种方式隔离了操作系统程序和应用程序,避免了应用程序影响到操作系统自身的稳定性。这也是Linux系统超级稳定的主要原因。
  所有的系统资源操作都在内核空间进行,比如读写磁盘文件,内存分配和回收,网络接口调用等。所以在一次网络IO读取过程中,数据并不是直接从网卡读取到用户空间中的应用程序缓冲区,而是先从网卡拷贝到内核空间缓冲区,然后再从内核拷贝到用户空间中的应用程序缓冲区。对于网络IO写入过程,过程则相反,先将数据从用户空间中的应用程序缓冲区拷贝到内核缓冲区,再从内核缓冲区把数据通过网卡发送出去。
  Socket(套接字)
  Socket可以理解成,在两个应用程序进行网络通信时,一个应用程序将数据写入Socket,然后通过网卡把数据发送到另外一个应用程序的Socket中。
  所有的网络协议都是基于Socket进行通信的,不管是TCP还是UDP协议,应用层的HTTP协议也不例外。这些协议都需要基于Socket实现网络通信。5种网络IO模型也都要基于Socket实现网络通信。实际上,HTTP协议是建立在TCP协议之上的应用层协议。HTTP协议负责如何包装数据,而TCP协议负责如何传输数据。
  绝大部分编程语言,都支持Socket编程,例如Java,Php,Python等等。而这些语言的SocketSDK都是基于操作系统提供的socket函数来实现的。不管是Linux还是windows,都提供了相应的socket函数。
  Socket编程过程
  我们来看看Socket编程过程是怎样的。
  不管Java、Python还是Php,很多编程语言都支持Socket编程。Linux,Windows等操作系统都开放了网络编程接口。只不过,各种编程语言对底层操作系统提供的网络编程接口做了封装而已。
  从服务端开始,服务端首先调用socket函数,按指定的网络协议和传输协议创建Socket,例如创建一个网络协议为IPv4,传输协议为TCP的Socket。接着调用bind函数,给这个Socket绑定一个IP地址和端口,绑定这两个的目的是什么?
  绑定端口的目的:当内核收到TCP报文,通过TCP头里的端口号,来找到我们的应用程序,然后把数据传递给我们
  绑定IP地址的目的:一台机器可能有多个网卡,每个网卡都对应一个IP地址,只有绑定一个网卡对应的IP时,内核在收到该网卡上的包,才会发给我们的应用程序
  绑定完IP地址和端口后,就可以调用listen函数进行监听。如果我们要判定服务器上某个网络程序有没有启动,可以通过netstat命令查看对应的端口号是否被监听。
  服务端进入了监听状态后,通过调用accept函数,来从内核获取客户端的连接,如果没有客户端连接,则会阻塞等待客户端连接的到来。
  那客户端是怎么发起连接的呢?客户端在创建好Socket后,调用connect函数发起连接,该函数的参数要指明服务端的IP地址和端口号,然后众所周知的TCP三次握手就开始了。
  连接建立后,客户端和服务端就开始相互传输数据了,双方可以通过read和write函数来读写数据。
  基于TCP协议的Socket编程过程就结束了,整个过程如下图所示:
  网络IO模型
  5种Linux网络IO模型包括:同步阻塞IO、同步非阻塞IO、多路复用IO、信号驱动IO和异步IO。
  同步阻塞IO
  我们先看一下传统阻塞IO。在Linux中,默认情况下所有socket都是阻塞模式的。当用户线程调用系统函数read,内核开始准备数据(从网络接收数据),内核准备数据完成后,数据从内核拷贝到用户空间的应用程序缓冲区,数据拷贝完成后,请求才返回。从发起read请求到最终完成内核到应用程序的拷贝,整个过程都是阻塞的。为了提高性能,可以为每个连接都分配一个线程。因此,在大量连接的场景下就需要大量的线程,会造成巨大的性能损耗,这也是传统阻塞IO的最大缺陷。
  同步非阻塞IO
  用户线程在发起Read请求后立即返回,不用等待内核准备数据的过程。如果Read请求没读取到数据,用户线程会不断轮询发起Read请求,直到数据到达(内核准备好数据)后才停止轮询。非阻塞IO模型虽然避免了由于线程阻塞问题带来的大量线程消耗,但是频繁的重复轮询大大增加了请求次数,对CPU消耗也比较明显。这种模型在实际应用中很少使用。
  多路复用IO模型
  多路复用IO模型,建立在多路事件分离函数select,poll,epoll之上。在发起read请求前,先更新select的socket监控列表,然后等待select函数返回(此过程是阻塞的,所以说多路复用IO并非完全非阻塞)。当某个socket有数据到达时,select函数返回。此时用户线程才正式发起read请求,读取并处理数据。这种模式用一个专门的监视线程去检查多个socket,如果某个socket有数据到达就交给工作线程处理。由于等待Socket数据到达过程非常耗时,所以这种方式解决了阻塞IO模型一个Socket连接就需要一个线程的问题,也不存在非阻塞IO模型忙轮询带来的CPU性能损耗的问题。多路复用IO模型的实际应用场景很多,比如大家耳熟能详的JavaNIO,Redis,Nginx以及Dubbo采用的通信框架Netty都采用了这种模型。
  下图是基于select函数Socket编程的详细流程。
  用一句话解释多路复用模型。多路:可以理解成多个网络连接(TCP连接)。复用:服务端反复使用同一个线程去监听所有网络连接中是否有IO事件(如果有IO事件就交给工作线程从对应的连接中读取并处理数据)。
  信号驱动IO模型
  信号驱动IO模型,应用进程使用sigaction函数,内核会立即返回,也就是说内核准备数据的阶段应用进程是非阻塞的。内核准备好数据后向应用进程发送SIGIO信号,接到信号后数据被复制到应用程序进程。
  采用这种方式,CPU的利用率很高。不过这种模式下,在大量IO操作的情况下可能造成信号队列溢出导致信号丢失,造成灾难性后果。
  异步IO模型
  异步IO模型的基本机制是,应用进程告诉内核启动某个操作,内核操作完成后再通知应用进程。在多路复用IO模型中,socket状态事件到达,得到通知后,应用进程才开始自行读取并处理数据。在异步IO模型中,应用进程得到通知时,内核已经读取完数据并把数据放到了应用进程的缓冲区中,此时应用进程
  直接使用数据即可。
  很明显,异步IO模型性能很高。不过到目前为止,异步IO和信号驱动IO模型应用并不多见,传统阻塞IO和多路复用IO模型还是目前应用的主流。Linux2。6版本后才引入异步IO模型,目前很多系统对异步IO模型支持尚不成熟。很多应用场景采用多路复用IO替代异步IO模型。
  本文完,请大家继续关注涛哥后续的技术原创!
  作者简介:曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监,15年电商互联网经历。

软件著作权登记办理的5大步骤!看过来软件著作权是指软件的开发者或者其他权利人依据有关著作权法律的规定,对于软件作品所享有的各项专有权利。软件经过登记后,软件著作权人享有发表权、开发者身份权、使用权、使用许可权和获……林世玲与三星太子离婚分千亿财产,为何又自立门户对抗三星?王子爱上的公主的故事可能是这个世界上最令人向往的爱情。现实中确实如此么?韩国商业巨头千金公主林世玲和韩国三星太子爷李在镕的婚姻故事就给我们深深地上了一课。林世玲,一个被韩国娱乐……某某会死期临近!清除香港污泥浊水,反中乱港组织将彻底严惩某某会为外国代理人香港警方8月25日首次引用香港国安法第43条实施细则,去信在囚的何俊仁、李卓人,以及邹幸彤、陶君行、梁锦威等约10名某某会董事及干事,表示有合理理由相信……同样是饰演黑社会大哥,您更喜欢哪一位?上个世纪八十年代起,黑帮电影(警匪片)在香港特别盛行,为了迎合市场需求,香港的导演陆续拍出了《跛豪》,《上海皇帝》,《英雄本色》,《黑道风云》,《黑金》,《无间道》,等一系列优……李佳航逛公园不敢搭讪,默默玩了会回家,老婆李晟一句话让他释怀你有没有这样的时候?走进咖啡厅,默默地坐在了角落里。想加入群聊,但害怕自己的消息一发出,别人都不作声了。看到大家聚在一起玩很high,明明很想加入,却总找不到……柳岩除了性感,她并非一无所有有朝一日,自己终于从默默无闻,遭人排挤的丑小鸭变成了优雅高贵的白天鹅,飞于云端之上,受世人仰望。这恐怕是很多人曾经都做过的梦。而柳岩和普通人不一样的是,她将这个梦变成了现实。……因戏生情的5对年轻情侣,前4对已分手,唯独他俩成功结婚生子演员是很辛苦的职业,有的时候,还会在剧中和别人产生感情,这其实是很正常的事情,著名的演员聂远就说两个单身的男女天天待在一起,还是演的感情的戏,难免会产生感情,这是很正常的,娱乐……牵手大丈夫俞飞鸿杭州人71年摩羯座165cmFaye北影代表作品:牵手,小李飞刀,三少爷的剑,大丈夫,策马啸西风等。搭档:姚橹杨玏同学:刘云龙邵兵1998年主演电视剧《牵手》……37岁的她身材火辣,迷倒小6岁的鲜肉运动员,网友太配了说起世界上最性感的一群人,我想维密天使获此殊荣是没有什么异议;今天我们就来说说,维密天使中好身材的代表IzabelGoulart。从2005年开始,Izabel连续……对比恢复高考时诺曼底登陆般的命运拼搏,今天的考生幸运多了高考在任何时候都是一场人生鏖战。它关乎考生的前程,关乎考生家庭的命运,牵动着天下父母心。但是,比较恢复高考时诺曼底登陆般的命运拼搏,今昔有着天壤之别。当年高考……郭父说郭威做过DNA心被掏空,有人说怎么不问问自己的儿子在哪郭父说对郭威的爱,说做过DNA的那一刻心被掏空,有人说不找不问自己的亲儿子怎么说许多人发文,说郭父大爱无言,错抱不错爱。还有人发文说,郭父大爱无疆,许多文章都是情深意长,……王彦霖和艾佳妮结婚,结束10年校园爱情长跑,再度求婚抱得美人引子不知道从什么时候开始,就已经成就了一个网络用语:520,一年一度网络情人节。这一对结束13年相识相恋的爱情,演员王彦霖官宣与大学同学艾佳妮结婚。看来,不得不说,520……
机甲武士出阵!百万吨级武藏发布热血OP预告日本游戏开发商Level5昨天晚上公布了PS4、Switch游戏《百万吨级武藏》的OP特别篇预告,视频融合了游戏玩法和CG动画,并加入了热血的主题歌,一起来看看吧。《百万……TMElive首个说唱潮现场,追梦赤子心够真够出ampamp12月5日晚八点,TMElive上线以来的首个说唱潮现场、由维他柠檬茶独家冠名的追梦之夜线上演唱会霸气开唱,知名说唱歌手GAI周延携种梦音乐厂牌集结亮相,高燃炸裂的说唱表演引爆……网红界吴某凡?药水哥出事,疑似侵犯她人滴滴滴,大家晚上好,喜大普奔,吴亦凡正式被批捕,对于批捕一次不太了解的朋友们,可以看看第二条。但,今天又有了一个新的瓜,网红界的吴亦凡,药水哥竟然也出大事啦!先看看……鞠婧祎演被绑架像咬化妆棉一样?宋威龙男友力爆棚最近电视剧中一幕绑架画面引起网友热议,鞠婧祎在某剧中饰演的角色遭歹徒绑架,而她却像咬着化妆棉。网友们纷纷吐槽,此等绑架完全不起作用啊!这不就是两片化妆棉吗!这到底是鞠婧祎……老师朋友圈忘屏蔽学生,一时间火遍家长群,好像段子手附体教师,作为教书育人的职业,在每个人的印象中,总是过于严肃的形象。即使在现实生活中,也很难将段子手和老师联系在一起,殊不知老师在学生面前展现严肃的一面,只是因为职业需要,并……冯巩女徒弟客串安家,角色招人恨被骂惨,又被质疑整容过度冯巩作为著名的相声表演艺术家,他的不少徒弟已经成为喜剧的中坚力量。他的女徒弟贾玲,现在更是被人称为新一代的喜剧一姐。其实冯巩老师还有另外一位女徒弟,就是演员宋宁。与贾玲相……好皮肤重在内调,4大保养好方法,教你轻松拥有好气色hello,大家好!想要养好皮肤,护肤品的力量是有限的内调才是护肤的根本下边是内调养肤时间本人坐标大北方,属于干燥地区一年四季,除了夏季不那么干燥……啊啊啊啊啊,这是什么狗血日剧不得不说,这几年好看的日腐真是越来越多了。比如以前推荐过的连名字都需要打码,尺度大到飞起的《情色小说家》。还有又甜又羞耻,磕糖磕到急需胰岛素的《到了30岁还是处男,……与其骂漫威拍尚气辱华,不如谈谈中国电影如何反攻好莱坞自从7月21日,漫威老大凯文费奇宣布了《尚气》的卡司阵容,以及2021年春节登陆北美院线后,整个中国互联网就掀起了一股骂漫威拍《尚气》辱华抵制其在内地上映的热潮。……唐人街探案3坐善念之舟去地球,探索内心情感的宇宙观看电影的过程里,体验感并不好,整部电影问题很多。但问题多不代表就是烂片,像是同时在看23部电影吧,有野心不坏,但是太贪心可不怎么好哦。说《唐人街探案3》是喜剧电影,开头……王俊凯刚毕业,师弟丁程鑫成功入读北电,其实一张合照早已预言丁程鑫考上北电,粉丝担忧:和王俊凯一样被晒黑关于明星上大学的事,大众总是有好奇心。毕竟文化还是很重要的,时代少年团的丁程鑫,就带来了好消息:他将被北电录取!由……正常行驶的车辆被交通事故,保险协赔42万,司机莫名其妙被交通事故,只因与死者同行十数秒山东菏泽的郑先生吃完晚饭开车回家,行车途中与一骑电动车的同向而行。因为该路段路灯比较亮,路况比较好,且行人、车辆稀少,郑先生没有开远光,也……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网