开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

八、网络服务I/O模型

简介:
+关注继续查看

  在操作系统中,进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。进程与I/O之间的通信模型如图所示。

wKioL1k0wdSTU6hjAAA1yd6YWqA094.png

  对于输入而言,等待(wait)数据输入至buffer需要时间,而从buffer复制(copy)数据至进程也需要时间。根据调用者与被调用者的不同就有四种I/0模型。

调用者处理措施:
  阻塞:进程发起 I/O 调用, 未完成之前,当前进程会被挂起;

  非阻塞:进程发起 I/O 调用,被调用函数完成之前不会阻塞当前进程,而是立即返回;

被调用者响应:

  同步:进程发起一个过程调用(功能、函数)调用后,在没得到结果之前,该调用将不会返回;
  异步:进程发起一个过程调用后,即使调用者不能立即得结果,但调用却会返回,返回是未未完成     状态;当调用完成后,内核会自行通知调用者结果已经 OK;

wKiom1k0wn3Bxg-9AAAPTIjCpmg344.png-wh_50

8.2、五种网络服务I/0模型

 根据等待模式不同,I/O动作可分为五种模式:

同步阻塞进程会一直阻塞,直到数据拷贝完成

wKiom1k0wuCwKQS0AAFEJe5A8yk967.png-wh_50

同步非阻塞非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的

wKioL1k0wx3AdIkRAAIZSFxvqbw397.png-wh_50

I/O 复用:主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听。

wKiom1k0wx7g6OTYAAH3Am-OY0U161.png-wh_50

异步IO:数据拷贝的时候进程无需阻塞。

wKioL1k0wx7wiapjAAFyv-G9x64829.png-wh_50

信号驱动:两次调用,两次返回。

wKiom1k0wx_TkIZJAAHKmSujLKo270.png-wh_50

五种IO模型的比较:

wKioL1k0wx-BxJd8AAJfyslDNx8650.png-wh_50

8.3、select/poll/epoll

select

  本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理,但是单个进程可监视的fd数量被限制,即能监听端口的大小有限。对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低,需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。 

1
# cat /proc/sys/fs/file-max    #查看可监听fd的数量

poll

  本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,其没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意。 poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

epoll

  支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。 使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

  其优点是没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口)效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关。使用内存拷贝方式,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。 



本文转自 梦想成大牛 51CTO博客,原文链接:http://blog.51cto.com/yinsuifeng/1932187,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一文概览神经网络模型
一般的,神经网络模型基本结构按信息输入是否反馈,可以分为两种:前馈神经网络和反馈神经网络。
27 0
神经网络-神经元模型及神经网络模型
神经网络-神经元模型及神经网络模型
49 0
原型模型
定义 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
705 0
盒子模型
快递车上包裹盒子模型                   盒子的特征: 每个盒子都有 边距、边框、填充、内容四个属性         CSS盒子模型 在浏览器中,把一个个html元素当成一个个盒子。
803 0
盒子模型
(引用慕课网 我的学习笔记)
645 0
ThinkPHP框架模型连贯操作(八)
原文: ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一、常用连贯操作 1.
845 0
网络分层模型
目前存在的两种网络分层模型:OSI模型和TCP/IP模型。OSI模型一共分为七层,TCP/IP模型和OSI模型类似,但是只分为四层。 OSI模型 OSI的全程是Open Systems Interconncection,即开放系统互联,它由ISO(International Organization for Standardization)制定。OSI是网络通信的一种
1096 0
13688
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载