socket_IO模型
1 背景知识
1.1 用户空间和内核空间
比如32位系统,寻址空间是4G。内存分为用户空间和内核空间,内核空间仅供内核使用,用户空间给各个进程使用。os的核心是内核,只有内核可以访问被保护的内存空间。为了保证进程无法直接操作内核 ,在用户空间的进程无法访问内核空间。
系统调用函数运行于内核态,但是向用户态开放接口。
对于磁盘,网卡等设备,进程都无法直接访问,所以相关数据都用经过系统调用。
1.2 进程阻塞
正在执行的进程,由于期待的事件未发生,比如io操作未完成,新数据未到达,就由系统自动执行阻塞,由运行状态变为阻塞状态。所以,进程的阻塞是自身的自动行为,只有处于运行状态(获取cpu时间片)的进程才能转为阻塞状态。并且处于阻塞状态的进程不占用cpu。
1.3 文件描述符(句柄)
fd是指向具体文件的一个引用。
fd是一个非负整数。当进程打开一个新文件或者socket,系统就为该文件分配一个fd,用来标识这个文件,这个分配的数字从0开始。系统默认情况下,限制每个进程能打来的文件为1024。
1.4 标准io
在标准io机制中,在内核中有页缓冲(内核高速缓冲),在用户空间有流缓冲。
对于读操作,数据首先被读到页缓冲(当页缓冲中没有该数据),然后再拷贝到进程的内存地址。
对于写操作,数据先被写到流缓冲,然后将多次写操作一次性写到页缓冲(减少系统调用),页缓冲再将多次写操作一次性写到磁盘(提高磁盘io效率)
2 linux中的几种IO模型
网络io的本质是socket的读取。对于一次网络io请求,有两个阶段:
a 等待对端传递的数据就绪,就绪就拷贝到系统内核缓冲区,如果没有就绪就一直等待就绪。
b 将内核缓冲区中的数据拷贝到进程的地址空间中。
2.1 bio

阻塞io是最常用的socket模型,并且默认情况下,所有socket都是阻塞的。
首先,进程要请求网络数据时,使用recvfrom系统调用函数,然后系统调用从用户空间转移到内核空间运行。在内核空间等待对端数据报的到达,到达后内核空间的缓冲区后,把数据报拷贝到用户空间应用的缓冲地址。这个过程完成后,就返回获取成功给进程,进程没有延迟,开始处理数据报。
整个过程中,进程都是自我阻塞的,在等待数据就绪的过程中,进程只能等待,无法作其他事情。好处是数据一就绪,进程就马上可以进行下一步的处理。
2.2 nio

在非阻塞模型中,当系统调用发现内核空间中未准备好数据,则直接返回一个error。进程会周期性轮训,询问内核空间是否准备好好数据。在此期间,进程不会等待(就是非阻塞)。
相对于阻塞模型,非阻塞模型释放了进程,可以同时处理其他信息。但由于是周期性轮训,进程就不会在第一时间知道网路数据已准备好,所以增加了延迟。
但如果进程要处理多个socket,非阻塞模型总是比阻塞模型效率更高。
2.3 mio

就是用select、epoll、poll,将多个socket的文件描述符传给内核,让内核去监听它们是否就绪。
当用户进程调用 select,整个进程就被阻塞,当任何一个socket的数据在内核中 准备好了,select就会将可读条件返回。然后进程使用系统调用,将数据拷贝到用户空间(这一步就相当于bio)。
nio是进程主动去询问多个socket的数据在内核中是否准备好,而mio是采用select去实时监听多个socket在内核中的数据是否准备好。
2.4 aio

进程使用aio_read函数将socket文件描述符,缓冲区指针、缓冲区大小和文件偏移传递给内核,并且告诉内核等数据准备好后直接传给aio_read中。
进程不阻塞,数据准备好后,不需要进程再通过系统调用去读。
2.5 比较

bio,nio,mio,在数据拷贝到用户空间这个阶段进程会被阻塞,属于同步模型。
aio在这个阶段进程不被阻塞
socket_IO模型的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET路由模型解析
大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- 隐马尔科夫模型python实现简单拼音输入法
在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...
- webapi - 模型验证
本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...
随机推荐
- openwrt 编译 gmediarender
output_gstreamer.o: In function `my_bus_callback': output_gstreamer.c:(.text+0xf68): undefined refer ...
- STM32唯一身份识别ID(器件电子签名)的读取以及芯片Flash大小读取
每个STM32有一个独立的ID,这个ID可以用来: 产品唯一的身份标识的作用: ● 用来作为序列号(例如USB字符序列号或者其他的终端应用): ● 用来作为密码,在编写闪存时,将此唯一 ...
- Robots协议应用与写法研究
- Spark高级
Spark源码分析: https://yq.aliyun.com/articles/28400?utm_campaign=wenzhang&utm_medium=article&utm ...
- (C)do{...}while(0);的用法及意义
实际上,do{…}while(0)的作用远大于美化你的代码. 总结起来这样写主要有以下几点好处: 1. 辅助定义复杂的宏 避免引用的时候出错: 举例来说,假设你需要定义这样一个宏: #define D ...
- html5--6-28 css盒模型4
html5--6-28 css盒模型4 实例 学习要点 了解盒模型 元素内容.内边距.边框 和 外边距 了解盒模型的概念: CSS 盒模型规定了处理元素内容.内边距.边框 和 外边距 的方式. 最内部 ...
- A+B Problem && OJ推荐【持续更新】
目录 List 前言 长郡 Position: code 1. 2. 持续更新,么么哒 List 前言 有没有觉得写这篇文章很奇怪,这个还是有原因的.①很多OJ都有着道题,所以发个博客②这可以介绍很多 ...
- HBase集群出现NotServingRegionException问题的排查及解决方法
HBase集群在读写过程中,可能由于Region Split或Region Blance等导致Region的短暂下线,此时客户端与HBase集群进行RPC操作时会抛出NotServingRegionE ...
- xcode添加背景音乐/音效
xcode添加音效:http://www.cnblogs.com/jiayongqiang/p/5625886.html 背景音乐: ios播放音乐时会用到一个叫做AVAudioPlayer的类,这个 ...
- 一题多解 —— linux 日志文件(log)reload 重新载入
1. tail -F 等同于–follow=name –retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪 也即可以间接实现从日志文件末尾,不断载 ...