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,一经查实,立即删除!

相关文章

在python语言中语句的续行符是_Python程序设计课后习题答案-第二单元(2页)-原创力文档...

习题 2一、选择题1.流程图中表示判断框的是( )。BA.矩形框 B .菱形框 C .平行四边形框 D .椭圆形框2 .下面不属于程序的基本控制结构的是( )。DA.顺序结构 B .选择结构 C &#xff0…

linux 终端显示白底,mac终端使用Item2无法显示颜色的解决方法

item2是mac,linux下非常好用的一款终端机,可自行配置主题并支持tab等多种功能。还在用单调的item吗?不妨试试item2吧!安装完后发现item2终端是没有颜色的(白底黑字),究其原因是Mac终端机预设是没有颜色区分的&#xff…

pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10

本文目的:记录一下整个折腾过程,整理一下实现这一过程中看的资料,最重要的是我怕过段时间我给忘了。。。 虽然参照了不少过来人写的教程,但是还是遇到不少坑,反反复复折腾了一个月的时间(平时上班,只有晚上和周末能整一会)。 unraid我也折腾过了,确实不错,但是我没搞通…

linux kears 切换后端,如何更改Keras后端(哪里是json文件)?

我安装了Keras,并希望将后端切换到Theano . 我检查了this post,但仍然不知道在哪里放置创建的json文件 . 另外,下面是我在Python Shell中运行 import keras 时遇到的错误:使用TensorFlow后端 . 回溯(最近一次调用最后一次)&#x…

openstack资源使用汇总_关于OpenStack的学习路线及相关资源汇总

首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更深层次的理解&#xff0c…

安卓与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…

linux ps2键盘不能用,解决usb鼠标与ps2键盘合用时开机键盘失效

昨晚熬夜安装mac os 10.6.3 ,跟着教程一步一步走,终于晚装完毕。进入mac后发现,ps2接口的键盘无法使用,usb鼠标正常使用。由于经常捣鼓windows和咱的机箱,下意识想到拔掉键盘再重新插上就行,试了下&#xf…

oracle数据库有几个服务_oracle数据库可以有几个数据库

《Oracle数据库管理与维护实战》——1.1 Oracle产品组成本节书摘来自异步社区出版社《Oracle数据库管理与维护实战》一书中的第1章,第1.1节,作者: 何伟娜 , 常建功,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.1 Or…

linux上如何永久关闭selinux,Linux临时关闭和永久关闭SELinux

查看SELinux状态:[rootlocalhost ~]# getenforceEnforcing临时关闭SELinux:[rootlocalhost ~]# setenforce 0[rootlocalhost ~]# getenforcePermissive永久关闭SELinux:在 /etc/sysconfig/ 目录下修改配置文件 selinux[rootlocalhost ~]# vim /etc/sysconfig/selinux配置文件内…

python监控windows日志_Python 监控日志的简单示例

这篇文章主要为大家详细介绍了Python 监控日志的简单示例,具有一定的参考价值,可以用来参考一下。对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!一个简易的日志监控的脚本,功能如下&a…

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

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

python安装lap_一个python脚本解决安装mq的依赖问题

import tarfileimport sys,osfrom _utils.patrol2 import run_cmdimport zipfiledef get_version(filename):cmd"rpm -U {}".format(filename)code,resrun_cmd(cmd,cwdpkg_unzip_path)if is already installed in res or 已安装 in res:return Trueelse:return False…

c语言如何关闭线程,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统,C语言实现多线程:#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );return …

linux8安装bbr_CentOS 7安装4.9内核开启BBR

最新的4.9内核合并了Google研发的BBR TCP阻塞算法,使用效果大概可以跟锐速相比。待4.9正式版发出前,CentOS并没有4.9的RPM包。那么我们可以手动编译内核,安装并启用。注意:内存小于512M的机器在编译内核bzImage的时候会出现错误。…

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

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

rfc方式的集成 sap_转载: 与SAP集成的接口方式比较:IDOC BAPI RFC 之间的区别

se37写出来的叫function,其中可以远程调用的叫rfc,remote-enabled function,abap语法和输入输出参数就会有一些限制。bapi是sap做好的实现特定业务操作的rfc。idoc是基于sap自己的类似xml格式的文档数据交换的方式。rfc必须在线的方式调用,一般做同步的,…

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

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

流浪的python博客园_python学习心得第一章

初始python1什么是程序计算机程序是一组执行某种动作的的指令。和那些电路、芯片、显卡、硬盘等不同,它不是计算机本身可以触摸的部分,而是隐藏在背后运行在硬件上面的东西。程序就是一系列告诉没有知觉的硬件该做什么事情的命令。软件就是这些程序的集合…