linux 网络io命令详解,Linux下五种网络IO模型详解

本文我们主要来了解一下Unix/Linux下5种网络IO模型:blocking IO, nonblocking IO, IO multiplexing, signal driven IO, asynchronous IO的基本原理,更好的理解在高级语言中的异步编程,一起来看看吧,希望对大家学习linux有所帮助。

写在前面

为了更好的理解下面提到的Linux下5种网络IO的概念,我们还是有必要先理清几个概念。

1.程序空间与内核空间

在Linux中,对于一次读取IO的操作,数据并不会直接拷贝到程序的程序缓冲区。它首先会被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的缓冲区。p.s: 最后一句话非常重要,重复一遍。

1. Waiting for the data to be ready(等待数据到达内核缓冲区)

2.Copying the data from the kernel to the process(从内核缓冲区拷贝数据到程序缓冲区)

2.阻塞与非阻塞

阻塞就是说我们某一个请求不能立即得到返回应答,否则就可以理解为非阻塞。

3.同步IO与异步IO

这里先直接引用Stevens(POSIX)在Unix网络编程中的定义:

A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes. An asynchronous I/O operation does not cause the requesting process to be blocked.

对于同步与异步,我们可以用一个简单的生活场景来描述。当我们排队在实体店买东西可以视作同步,而网购则可以视作异步。实体店排队这种同步情形显然是非常的浪费时间,等待的这段时间我们被阻塞住了不能干其他的事情,而网购只要我们提交一下订单之后其他什么都不用管了,商品到了,快递员给我们发送一个信号(打电话)我们直接到门口去拿,等待的这段时间我们可以用来撸代码。

p.s: 等你阅读完文章的后面部分,回过头来看异步其实就是将等待的这段时间去处理IO操作,把CPU(我们的大脑)让出来做其他更有价值的事情(撸代码),而不是像同步那样去傻傻地排队。更加详细准确的定义可以在阅读完本文后面部分后参考维基百科。

4.文件描述符

在Linux下面一切皆文件, 文件描述符(file descriptor)是内核为文件所创建的索引 ,所有I/O操作都通过调用文件描述符(索引)来执行,包括下面我们要提到的socket。Linux刚启动的时候会自动设置0是标准输入,1是标准输出,2是标准错误。

5种网络IO模型

1.blocking IO(阻塞IO)

如图所示,进程调用一个recvfrom请求,但是它不能立刻收到回复,直到数据返回,然后将数据从内核空间复制到程序空间。这里我们再次回顾开篇提到的两个过程:

1.Waiting for the data to be ready(等待数据到达内核缓冲区)

2.Copying the data from the kernel to the process(从内核缓冲区拷贝数据到程序缓冲区)

注意到没有,在上面这两个过程中,进程都处于blocked(阻塞)状态,在等待数据返回的过程中不能空闲出来干其他的事情。

9ea33101e7ababe701fddf3e81a38699.png

2.nonblocking IO(非阻塞IO)

当我们设置一个socket为nonblocking(非阻塞),相当于告诉内核当我们请求的IO操作不能立即得到返回结果,不要把进程设置为sleep状态,而是返回一个错误信息(下图中的EWOULDBLOCK)。

322e7131a5ef53949d8f1dc0ab9e8749.png

我们来分析一下图片中的整个流程。前三次我们调用recvfrom请求,但是并没有数据返回,所以内核只能返回一个错误信息(EWOULDBLOCK)。但是当我们第四次调用recvfrom,数据已经准备好了,然后将它从内核空间复制到程序空间。

在非阻塞状态下,我们的过程一(wait for data)并不是完全的阻塞的,但是过程二(copy data from kernel to user)依然处于一个阻塞状态。

3.IO multiplexing(IO复用)

IO复用的好处是我们可以通过(select/poll/epoll)一个时刻处理多个文件描述符,这里以select为例来分析一下。

6f69aae8af7bdd97628b55d1f0ab0336.png

IO复用实际上也是完全阻塞的,请仔细看图(图中我们有两个return,前面我们都只有一个return),Stevens在书中提到这里并没有阻塞在recfrom阶段而是阻塞在select阶段,其实这样说并不是非常的严谨,因为recform其实也是一个阻塞过程(图中也描述了),recvfrom过程中进程除了等待copy data from kernel to user以外,并不能空闲出来干其他事情。

两个过程的都是阻塞的,看起来IO复用和阻塞IO相比似乎并没有什么优势,而且还需要两个return,但是这里注意在IO复用中我们可以同时监听多个文件描述符。

4.signal driven IO(信号驱动IO)

我们也可以使用信号驱动IO,要求内核通知我们当文件描述符准备就绪以后发送相应的信号。

1a107e8bc6dfe87f7cdad99e72ba7b6e.png

我们根据图片来分析一下。 阶段1: 我们首先设置socket为一个信号驱动IO,并且通过sigaction system call安装一个signal handler,注意这个过程是瞬时的,所以这个阶段是非阻塞的。 阶段2 : 当数据已经准备好了以后,一个SIGIO信号传送给我们的进程告诉我们数据准备好了,然后进程开始等待数据从内核空间复制到程序空间(copy data from kernel to user),这个过程是阻塞的,因为我们的进程只能等待数据复制完毕。

5.asynchronous IO(异步IO)

我们来看一下异步的概念,异步就是说对于上面两个步骤(wait for data 和copy of the data from the kernel to our buffer)当它们完成的时候会自动通知进程,在这段时间里面进程什么都不用操心,就像网购一样,下了单什么也不用管了等着快递员通知我们(即我们通常所说的callback)。 相比前面的信号驱动IO,异步IO两个阶段都是非阻塞的。

6908a5469cd609c688529c334d612aed.png

6.小结

3b6ba127a90b3dc22be8cb3ee3fb24a9.png

阻塞式IO(默认),非阻塞式IO(nonblock),IO复用(select/poll/epoll),signal driven IO(信号驱动IO)都是属于同步型IO,因为在第二个阶段: 从内核空间拷贝数据到程序空间的时候不能干别的事。只有异步I/O模型(AIO)才是符合我们上面对于异步型IO操作的含义,在1.wait for data,2.copy data from kernel to user,这两个等待/接收数据的时间段内进程可以干其他的事情,只要等着被通知就可以了。

打开App,阅读手记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓与Linux共存,Android和Linux重新合并成一个操作系统

Linux又回到了Android中,Android又回到了Linux中。Android一直都是Linux,但多年来Android项目走了自己的路,它的代码没有被合并回主Linux树中。现在,比Linux的创始人和主要开发人员Linux的预期要快得多,Android已经正式…

edit控件自动换行 mfc_VS2010/MFC编程入门:如何创建对话框模板和修改对话框属性?...

创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。在本节…

linux vim tag,Vim基础知识之ctags 及 Taglist 插件

Vim基础知识之ctags 及 Taglist 插件1. 我的界面2. ctagsexuberant ctags是一般Linux系统上缺省的ctags我的ctags版本:Exuberant Ctags 5.9~svn20110310简单介绍Used in at least 50 countries in all 7 continents (including Antarctica!)Supports 41 programming…

c语言程序设计整人,C语言进程间通信练习作品 - 整人小程序之剪切板

主程序界面:程序介绍:如果对方执行了主程序生成的【server.exe】,【server.exe】会自复制、自启动、自删除(仿木马)。【server.exe】会后台每秒/次检测对方的剪切板,一有文本数据则在尾部加入【附加内容】,达到&#x…

Android怎么自定义充电铃声,安卓手机怎么自定义充电提示音_自定义安卓充电提示音教程_3DM手游...

安卓手机其实也是可以设置充电提示音的,我们只需要下载一个第三方软件,然后在APP中进行一些简单的设置,就可以实现自定义更换手机充电提示音了。安卓手机怎么自定义充电提示音?下面小编就为大家带来了详细的教程,希望能…

android logcat 根据包名过滤,adb logcat通过包名过滤(dos命令find后跟变量)

过滤条件:该app在运行实现原理:1、获取该app运行时的pid2、通过find命令,过滤pid的日志,就是该包的运行日志实现:1、在同一目录建立一文件:getpid.batecho offadb shell "ps | grep com.example.testp…

android 最新的框架搭建,Android之Mvp模式框架搭建

前言在做Android开发时,我们通常为了更合理,更高效,优质的开发项目,并不是直接上来就开始开发功能,而是先搭建好自己的一个开发框架,一个好的开发框架,通常会让我们事倍功半,它就好比我们去建造一个房子,如果你的地基打的越深,越牢固,那么就可以建造出很高很大的房子.在搭建一个…

英特尔nuc能代替主机吗_python编程,热度为什么越来越高,python能代替JAVA吗?...

大家好,我是你们的软件主讲老师宁彤天,python编程是这几年刚火起来了,这可能是这几年人工智能的普及吧,现在是人工智能非python,没有第二,当能其它语言也能实现人工智能,但python的代码量能用最…

mix2s 升级android p,小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?...

原标题:小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?今天上午,小米推送了小米MIX2S的稳定版更新,版本号为MIUI V10.0.4.0,体积为2GB,这一次更新将系统底层更新至了Android P,不…

python求出五位数的回文数_python之递归

#codingutf-8#题目:打印出如下图案(菱形)nu 1 # 开始值k 2 # 变量值while nu > 0:print(int((7 - nu) / 2) * * * nu)nu kif nu 7:k -k#题目:有一分数序列:2/1 ,3/2 ,5/3 ,8/5 ,1…

html正则判断全数字,javascript如何判断是不是数字?

javascript判断是不是数字的方法:方法一、使用js自带的全局函数isNaN()判断是不是数字。方法二、使用正则表达式判断是不是数字。方法三、通过typeof的返回值判断。JavaScript中判断是不是数字方法详解:第一种方法:isNaN()使用js自带全局函数…

law是什么的缩写_Lawyer和Attorney 有什么不同?

据美国劳工统计局(Bureau of Labor Statistics)预计,2016年至2026年间,律师的就业增长率为8.2%。在此期间,预计将新增6.5万个就业岗位。而且美国律师行业的,律师行业在US.NEWS 的Best Social Services Jobs中排名第一,…

选择座位html,影厅座位预览效果(css3)_html/css_WEB-ITnose

查看 demo 下载源码你可能对那些购买时需要选择座位的订票系统比较熟悉。通常在比赛,电影,搏击或者演唱会售票的时候需要这样做。如果能有一种座位的预览效果该有多酷啊,比如能够从你选择的位置的角度去预览舞台或者屏幕。这个问题引出了今天…

html 使用百度搜索,百度搜索uzer,进入主页

windows7的uzer.me怎么 安全上网百度搜索uzer,进入主页下载完成以后,点击,快捷方式,运行。登陆后,首先出现的是文档库,点击文档库。UZER上的软件和文件都打不开,网络没问题。因为安装的软件版本…

2021曲靖高考成绩查询时间,2021年曲靖高考成绩排名及成绩公布时间什么时候出来...

曲靖高考结束后,每年都有很多家长和考试不知道曲靖高考成绩排名如何查询、曲靖高考成绩什么时候公布以及查询方式,本文小编整理了曲靖高考成绩查询排名的相关知识。一、曲靖高考成绩公布时间及查询方式根据往年曲靖高考成绩公布时间预测,2021…

uniapp打包成html5包个ios壳,HBuilder之uni-app打包App方法

HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE。该软件既可以支持web代码编写,也可以将已经编写好的项目代码打包为手机APP。HBuilder提供的打包有云端打包和本地打包两种,云端打包的特点是DCloud官方配置好了原生的打包环境,可…

彭山计算机培训,彭山2021年初中生学计算机

建校以来,我校一直秉承“让每一个学生具备生存发展的能力,让更多学生体验成功”的办学理念,坚持“诚信、务实、精技、立业”和“先做人、后做事”为校训,多年来优秀的办学质量和成绩屡获***、教育主管部门、专家、家长等社会各界的…

计算机控制系统开关,电脑远程开关机控制器

原标题:电脑远程开关机控制器SPD-M05电脑远程开机/关机/复位远程控制器斯必得SPD-M05电脑远程开机/关机/复位控制器是专为各种服务器及无人值守机房电脑远程遥控开机/关机/复位所开发。该控制器采用电话远程遥控操作,无论你何时何地只要你拔打一个电话即…

caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)

深度学习 Caffe 初始化流程理解(数据流建立)之前在简书的文章,搬迁过来 ^-^本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处。#Caffe FeatureMap数据流的建立 ##用语解释FeatureMap: 输入的图片信息或者…

函数计算机怎么去掉fix,excel怎么使用fix函数取整

fiv函数的作用是取整,在excel当中该如何使用呢?下面就跟学习啦小编一起看看吧。excel使用fix函数取整的步骤1、首先我们打开一个工作样表作为例子。2、使用altf11组合快捷键进入vbe编辑器,插入一个新的模块,并在模块中输入以下代码&#xff…