位置: 编程技术 - 正文

总结网络IO模型与select模型的Python实例讲解(总结网络io模型的特点)

编辑:rootadmin

推荐整理分享总结网络IO模型与select模型的Python实例讲解(总结网络io模型的特点),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:ip网络模型,5种网络io模型,5种网络io模型,ip网络模型,5种网络io模型,总结网络io模型的优缺点,总结网络io模型的过程,总结网络io模型的过程,内容如对您有帮助,希望把文章链接给更多的朋友!

网络I/O模型人多了,就会有问题。web刚出现的时候,光顾的人很少。近年来网络应用规模逐渐扩大,应用的架构也需要随之改变。Ck的问题,让工程师们需要思考服务的性能与应用的并发能力。

网络应用需要处理的无非就是两大类问题,网络I/O,数据计算。相对于后者,网络I/O的延迟,给应用带来的性能瓶颈大于后者。网络I/O的模型大致有如下几种:

同步模型(synchronous I/O) 阻塞I/O(bloking I/O) 非阻塞I/O(non-blocking I/O) 多路复用I/O(multiplexing I/O) 信号驱动式I/O(signal-driven I/O) 异步I/O(asynchronous I/O)

网络I/O的本质是socket的读取,socket在linux系统被抽象为流,I/O可以理解为对流的操作。这个操作又分为两个阶段:

等待流数据准备(wating for the data to be ready)。从内核向进程复制数据(copying the data from the kernel to the process)。对于socket流而已,

第一步通常涉及等待网络上的数据分组到达,然后被复制到内核的某个缓冲区。第二步把数据从内核缓冲区复制到应用进程缓冲区。I/O模型:举个简单比喻,来了解这几种模型。网络IO好比钓鱼,等待鱼上钩就是网络中等待数据准备好的过程,鱼上钩了,把鱼拉上岸就是内核复制数据阶段。钓鱼的人就是一个应用进程。

阻塞I/O(bloking I/O)阻塞I/O是最流行的I/O模型。它符合人们最常见的思考逻辑。阻塞就是进程 "被" 休息, CPU处理其它进程去了。在网络I/O的时候,进程发起recvform系统调用,然后进程就被阻塞了,什么也不干,直到数据准备好,并且将数据从内核复制到用户进程,最后进程再处理数据,在等待数据到处理数据的两个阶段,整个进程都被阻塞。不能处理别的网络I/O。大致如下图:

这就好比我们去钓鱼,抛竿之后就一直在岸边等,直到等待鱼上钩。然后再一次抛竿,等待下一条鱼上钩,等待的时候,什么事情也不做,大概会胡思乱想吧。

阻塞IO的特点就是在IO执行的两个阶段都被block了非阻塞I/O(non-bloking I/O)在网络I/O时候,非阻塞I/O也会进行recvform系统调用,检查数据是否准备好,与阻塞I/O不一样,"非阻塞将大的整片时间的阻塞分成N多的小的阻塞, 所以进程不断地有机会 '被' CPU光顾"。

也就是说非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。

我们再用钓鱼的方式来类别,当我们抛竿入水之后,就看下鱼漂是否有动静,如果没有鱼上钩,就去干点别的事情,比如再挖几条蚯蚓。然后不久又来看看鱼漂是否有鱼上钩。这样往返的检查又离开,直到鱼上钩,再进行处理。

非阻塞 IO的特点是用户进程需要不断的主动询问kernel数据是否准备好。多路复用I/O(multiplexing I/O)可以看出,由于非阻塞的调用,轮询占据了很大一部分过程,轮询会消耗大量的CPU时间。结合前面两种模式。如果轮询不是进程的用户态,而是有人帮忙就好了。多路复用正好处理这样的问题。

多路复用有两个特别的系统调用select或poll。select调用是内核级别的,select轮询相对非阻塞的轮询的区别在于---前者可以等待多个socket,当其中任何一个socket的数据准好了,就能返回进行可读,然后进程再进行recvform系统调用,将数据由内核拷贝到用户进程,当然这个过程是阻塞的。多路复用有两种阻塞,select或poll调用之后,会阻塞进程,与第一种阻塞不同在于,此时的select不是等到socket数据全部到达再处理, 而是有了一部分数据就会调用用户进程来处理。如何知道有一部分数据到达了呢?监视的事情交给了内核,内核负责数据到达的处理。也可以理解为"非阻塞"吧。

对于多路复用,也就是轮询多个socket。钓鱼的时候,我们雇了一个帮手,他可以同时抛下多个钓鱼竿,任何一杆的鱼一上钩,他就会拉杆。他只负责帮我们钓鱼,并不会帮我们处理,所以我们还得在一帮等着,等他把收杆。我们再处理鱼。多路复用既然可以处理多个I/O,也就带来了新的问题,多个I/O之间的顺序变得不确定了,当然也可以针对不同的编号。

总结网络IO模型与select模型的Python实例讲解(总结网络io模型的特点)

多路复用的特点是通过一种机制一个进程能同时等待IO文件描述符,内核监视这些文件描述符(套接字描述符),其中的任意一个进入读就绪状态,select, poll,epoll函数就可以返回。对于监视的方式,又可以分为 select, poll, epoll三种方式。了解了前面三种模式,在用户进程进行系统调用的时候,他们在等待数据到来的时候,处理的方式不一样,直接等待,轮询,select或poll轮询,第一个过程有的阻塞,有的不阻塞,有的可以阻塞又可以不阻塞。当时第二个过程都是阻塞的。从整个I/O过程来看,他们都是顺序执行的,因此可以归为同步模型(asynchronous)。都是进程主动向内核检查。

异步I/O(asynchronous I/O)相对于同步I/O,异步I/O不是顺序执行。用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。I/O两个阶段,进程都是非阻塞的。

比之前的钓鱼方式不一样,这一次我们雇了一个钓鱼高手。他不仅会钓鱼,还会在鱼上钩之后给我们发短信,通知我们鱼已经准备好了。我们只要委托他去抛竿,然后就能跑去干别的事情了,直到他的短信。我们再回来处理已经上岸的鱼。

同步和异步的区别通过对上述几种模型的讨论,需要区分阻塞和非阻塞,同步和异步。他们其实是两组概念。区别前一组比较容易,后一种往往容易和前面混合。在我看来,所谓同步就是在整个I/O过程。尤其是拷贝数据的过程是阻塞进程的,并且都是应用进程态去检查内核态。而异步则是整个过程I/O过程用户进程都是非阻塞的,并且当拷贝数据的时是由内核发送通知给用户进程。

对于同步模型,主要是第一阶段处理方法不一样。而异步模型,两个阶段都不一样。这里我们忽略了信号驱动模式。这几个名词还是容易让人迷惑,只有同步模型才考虑阻塞和非阻塞,因为异步肯定是非阻塞,异步非阻塞的说法感觉画蛇添足。

Select 模型同步模型中,使用多路复用I/O可以提高服务器的性能。在多路复用的模型中,比较常用的有select模型和poll模型。这两个都是系统接口,由操作系统提供。当然,Python的select模块进行了更高级的封装。select与poll的底层原理都差不多。千呼万唤始出来,本文的重点select模型。1.select 原理网络通信被Unix系统抽象为文件的读写,通常是一个设备,由设备驱动程序提供,驱动可以知道自身的数据是否可用。支持阻塞操作的设备驱动通常会实现一组自身的等待队列,如读/写等待队列用于支持上层(用户层)所需的block或non-block操作。设备的文件的资源如果可用(可读或者可写)则会通知进程,反之则会让进程睡眠,等到数据到来可用的时候,再唤醒进程。

这些设备的文件描述符被放在一个数组中,然后select调用的时候遍历这个数组,如果对于的文件描述符可读则会返回改文件描述符。当遍历结束之后,如果仍然没有一个可用设备文件描述符,select让用户进程则会睡眠,直到等待资源可用的时候在唤醒,遍历之前那个监视的数组。每次遍历都是线性的。

2.select 回显服务器select涉及系统调用和操作系统相关的知识,因此单从字面上理解其原理还是比较乏味。用代码来演示最好不过了。使用python的select模块很容易写出下面一个回显服务器:

运行上述代码,使用curl访问 request信息。

下面详细解析上述代码的原理。

上述代码使用socket初始化一个TCP套接字,并绑定主机地址和端口,然后设置服务器监听。

这里定义了一个需要select监听的列表,列表里面是需要监听的对象(等于系统监听的文件描述符)。这里监听socket套接字和用户的输入。

然后代码进行一个服务器无线循环。

调用了select函数,开始循环遍历监听传入的列表inputs。如果没有curl服务器,此时没有建立tcp客户端连接,因此改列表内的对象都是数据资源不可用。因此select阻塞不返回。

客户端输入curl nodejs都是基于epoll进行的异步。

Python的Flask框架及Nginx实现静态文件访问限制功能 Nginx配置Ngnix,一个高性能的web服务器,毫无疑问它是当下的宠儿。卓越的性能,灵活可扩展,在服务器领域里攻城拔寨,征战天下。静态文件对于大多

Python的string模块中的Template类字符串模板用法 string.Template()string.Template()内添加替换的字符,使用"$"符号,或在字符串内,使用"${}";调用时使用string.substitute(dict)函数.可以通过继承"string.Template",覆盖变量d

Python中的字符串替换操作示例 字符串的替换(interpolation),可以使用string.Template,也可以使用标准字符串的拼接.string.Template标示替换的字符,使用"$"符号,或在字符串内,使用"${}";调用时使

标签: 总结网络io模型的特点

本文链接地址:https://www.jiuchutong.com/biancheng/387649.html 转载请保留说明!

上一篇:结合Python的SimpleHTTPServer源码来解析socket通信(python simple)

下一篇:Python的Flask框架及Nginx实现静态文件访问限制功能(flask框架官方文档)

  • 小规模纳税人转让不动产增值税
  • 新成立小规模纳税人开发票如何办理
  • 应收利息和利息收入的关系
  • 人力资源公司代招的岗位可以去吗
  • 三栏式明细账月结
  • 购进财务软件折旧怎么算
  • 公司办理个人所得税退税
  • 临时工人工资原始凭证怎么做及会计分录解析?
  • 股权稀释需要交税吗
  • 软件入库会计分录
  • 收到个税返还计入成本吗
  • 行政会计账务处理
  • 加了一年的油
  • 营改增后进项税相关规定
  • 已抵扣的发票怎么开红字发票申请单
  • 税收六项减免
  • 没有收款人复核人的发票能报销吗
  • 差旅费可以支取现金吗
  • 什么是劳动保护费支出
  • 财务中不能冲销的凭证
  • 留置权什么时候才可以行使
  • bootcamp怎么直接安装
  • 事业单位年末收入怎么算
  • 进程rundll32
  • 公司为实习生买保险列支什么科目?
  • 其他费用的账务处理
  • php读取opc
  • 国家对国有企业采取的政策是怎样的
  • 企业所得税如何计算应纳税所得额
  • 前端的基本知识
  • php获取当前时间提交数据库
  • thinkphp yii
  • 差旅费报销应注意什么
  • 公司变更需要哪些资料~问华杰 财务
  • java前后端加密解密请求
  • 计算机视角技术
  • php动态语言
  • 金税盘报送汇总在哪
  • 小企业会计准则和企业会计准则的区别
  • 计提折旧会计分录例题
  • 防伪税控开票
  • 微擎框架可以干什么
  • 出口免税免的是哪部分的税
  • 业务招待费进项税额转出会计分录
  • 个人所得税汇算清缴
  • 高并发数据库解决方案
  • 注册资本在十年后怎么办
  • sqlserver分页查询越到最后越慢
  • 收回上年度拨款怎么做账
  • 一般纳税人开普票税率是3%还是13%
  • 其他综合收益会影响未分配利润吗
  • 企业哪些收入不需要交税
  • 其他应付现金流量表
  • 汽车装修费计入哪个科目
  • 购买机器的运费计入什么科目
  • 财务费用在贷方负数表示什么
  • 工资表明细表
  • 会计凭证装订的步骤
  • 建账时应考虑的问题包括下列哪三项
  • 无形资产占公司比例
  • 删除用户mysql
  • 使用灭火器人要站在上风口还是下风口
  • win7系统的笔记本电脑有哪些
  • bboy.exe进程是病毒吗 bboy进程安全吗
  • win7系统cmd命令大全
  • win10如何关闭windows defender实时保护
  • win10高分辨率
  • linux bzz
  • Win7系统电脑开机无法进入桌面
  • linux用户放在哪个目录
  • portainer集群管理
  • android仿qq聊天
  • android开发最全教程
  • JavaScript中的数据类型分哪为两大类?
  • android基于linux还是unix
  • js自适应布局
  • 广东省地方税务局公告2017年第7号
  • 重庆市电子税务局官网登录入口注册
  • 本年累计实际已预缴的所得税额怎么填
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设