网络编程之IO多路复用

news2024/9/27 23:29:57

目录

一. 同步与阻塞

1.1 同步阻塞

1.2 同步非阻塞

1.3 异步阻塞

1.4 异步非阻塞

1.5 I/O多路

二.多路复用的技术

2.1 UNIX I/O Models

2.1.1 blocking I/O

2.1.2 nonblocking I/O

2.1.3 I/O Multiplexing Model

2.1.4 SIGIO

2.1.5 asynchronous I/O

2.2 IO多路复用

2.2.1 从同步阻塞到同步非阻塞

2.2.2 select

2.2.3 poll

2.2.4 epoll

REF


一. 同步与阻塞

同步是针对调用者的操作行为来说的,阻塞是针对这个行为所使用的接口来说的。

例如你是某场竞赛的主考官,需要监考考生A、B、C、D、E五位考生现场答题。你的操作就是走到每位考生面前去收试卷,而每位考生的答题情况(例如是否答完试卷)是不同的,有的可能在你走到的时候很快就交卷了,有的可能需要很长时间才能完成。

1.1 同步阻塞

到了收卷的时间,你要依次去收A,B,C,D,E考生的试卷。假说收到C考生的时候,他还未能答完试卷且他想答完题了再交给你,你又必须得等C交卷了才能去收D和E考生的试卷,那么这时候就是同步阻塞的。

对应Java中BIO(Block IO)。

1.2 同步非阻塞

到了收卷的时间,你要依次去收A,B,C,D,E考生的试卷。假说收到C考生的时候,他还未能答完试卷,你跳过C直接去收 D、E 的试卷,那么这时候就是同步非阻塞的。

1.3 异步阻塞

暂时没听说有这种场景。

1.4 异步非阻塞

你收卷的时候不用刻意去等某个学生交卷,学生交卷又迅速。

1.5 I/O多路

select/poll:考生做完了试卷,大喊了一声“我要交卷”,但是你不知道谁喊的,这时候你需要一个个地去询问,这个就是select/poll。

epoll:考生做完了试卷,大喊了一声“我要交卷”而且还举手了,你直接去收卷。

二.多路复用的技术

2.1 UNIX I/O Models

https://masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch06lev1sec2.html

  • blocking I/O:阻塞式I/O -- BIO

  • nonblocking I/O:非阻塞式I/O  -- NIO,AIO(AIO是在BIO的包里)

  • I/O multiplexing (select and poll):I/O复用

  • signal driven I/O (SIGIO):信号驱动式I/O

  • asynchronous I/O (the POSIX aio_functions):异步I/O  --AIO
     

UNIX I/O Models阻塞/非阻塞对应JAVA IO说明
blocking I/O阻塞BIO
nonblocking I/O非阻塞NIO
I/O multiplexing阻塞AIO和NIO的底层都是用epoll,这是JDK又进行了一层封装使之成为了非阻塞式的。
asynchronous I/O非阻塞AIO
SIGIO非阻塞

在介绍I/O models前,先对Socket的读取操作做简单说明,通常来说包括如下两个操作:

1. wait for data:等待数据从网络中到达,当数据到达后就会将器复制到内核中的某个缓冲区;

2. copy data from kernel to user:把数据从内核缓冲区复制到应用进程的缓冲区,这个过程虽然阻塞的,但是这个内存的拷贝是及其快的

2.1.1 blocking I/O

 

 由上图可知,应用进程从调用recvfrom()到它返回的这整段时间内都是阻塞的,主要阻塞在wait for data这个过程。当应用进程有返回值(return OK)的时候,应用进程已经读完数据了。

当然也可能因系统调用被信号终端导致调用发生错误。

2.1.2 nonblocking I/O

由上图可知,应用进程调用recvfrom的时候没有数据可返回则立即返回EWOULDBLOCK,而不是一直等着。

2.1.3 I/O Multiplexing Model

IO多路复用也是阻塞式的,应用进程阻塞在select调用,等待数据报套接字变为可读后,应用进程才会立即调用recvfrom读取数据。

从这里看I/O多路复用还不如BIO,因为它比BIO多一次select的系统调用,BIO只有一次recvfrom的系统调用。从后面的IO多路复用的进一步描述可知select的优势在于可以等待多个fd描述符就绪。

2.1.4 SIGIO

 非阻塞式IO。应用进程通过sigaction的系统调用告知内核在数据就绪发送SIGIO信号来通知下,这个sigaction调用完就立马返回了。等内核数据就绪后,内核在通过信号告知应用进程来取数据。

2.1.5 asynchronous I/O

AIO和SIGIO一样也是非阻塞的,与SIGIO的差别在于:SIGIO是由内核通知应用进程什么时候去启动recvfrom这个IO操作,而AIO是由内核通知应用进程I/O操作何时完成(即这时候数据已经从内核拷贝到了用户态),可以仔细对比下两张图。

2.2 IO多路复用

以TCP socket通信为例来介绍从"BIO"到"I/O多路复用"的引进过程。

2.2.1 从同步阻塞到同步非阻塞

如上示例为"单线程+BIO"。由于accept()和read()都会阻塞,所以当client1在与server交互的过程中,client2就会被阻塞住。例如client1在connect()连接握手耗时或者是client1一直在write发数据到server,这时候client2就会一直阻塞等待。

Q:那么是否可以通过多线程来解决多client被阻塞的问题呢?

A:可以但不完全可以。因为多线程可能会存在线程浪费,线程调度也是个麻烦事。例如来一个client连接就建立一个线程,如果有1000个client就得创建1000个线程,但是实际上可能只有两三个client和server端在通信,这时候就会浪费很多线程资源。

 那么我们再来看看,不阻塞会怎样呢?

 不阻塞accept(),client1调用connect()的时候client2也可以调用,当他们connect()成功了就将socket fd放到fd_list集合里,后面再去轮询这个list集合,通过系统调用去读每个fd看是否有数据到达(在上面“UNIX I/O Models”中介绍过socket数据读取的两个主要过程)。

这种不阻塞的方式虽然能解决“单个 socket 阻塞影响其他socket的问题”,但是不断的遍历,不断的进行系统调用是会有一定的开销的,特别是在没有数据到来却一直在进行系统调用的时候,这种方式的缺点表现地尤为明显。

如何优雅的解决呢?这时候就引入了I/O多路复用。

2.2.2 select

(TODO)

2.2.3 poll

(TODO)

2.2.4 epoll

(TODO)

REF

1.《UNIX Network Programming Volume 1, Third Edition: The Sockets Networking API》

I/O Models章节

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

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

相关文章

【拓扑排序】课程表问题

一、拓扑排序问题描述 给定:一系列任务 (A,B,C …) 任务间的依赖关系 (B 和 C 必须在 A 之前完成, …) 输出:这些任务间的合法执行顺序 (C – B – A – …) 总之&am…

「图文讲解」浏览器原理与页面渲染过程

相信大家在面试的时候面试官总是会问一个问题:“可以说下浏览器从输入url到渲染页面完成过程吗?”,非官方标准答案来啦~ 那我们首先需要先来讲一下浏览器是什么,浏览器其实就是一个应用软件,在学习操作系统…

《数据结构、算法与应用C++语言描述》线性表-数组描述

《数据结构、算法与应用C语言描述》线性表-数组描述 5表示在 数据结构算法与应用C语言描述 书中所在章节。 本文包含了《数据结构、算法与应用C语言描述》第五章主要练习题答案,给出了线性表数组描述完整测试代码。 5.1 数据对象 5.1.1 定义 数据对象(data obj…

java开发的师生评教小程序学生对老师评价老师对班级评价打分题单选题意见框系统选课系统

简介 源码1.0(源码2.0选课功能,请往下看) 师生评教小程序,学生可以对老师进行评价,老师可以对班级行进评级。管理员可以创建不同的评教模板(单选题0分或者10分,打分题0-10分,意见框…

三分钟彻底搞懂paint,repaint,update!

最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析…

2022卡塔尔世界杯感想

一、概述 说说我个人吧!在体育活动上面真是没什么兴趣,篮球,足球...等等竞技运动不敏感! 今年稍微关注了点世界杯比赛!什么原因呢?我有一个爱买彩票/赌球的一个同事!随着世界杯的进行&#xf…

风力发电机组机械功率Pm与转子转速Wm关系(Matlab实现)

目录 1 数学模型 2 代码 3 结果 1 数学模型 风力机空气动力学模型 风力涡轮机的动态输出机械扭矩表示为: 其中是空气密度 , A是叶片扫掠面积 , R是风力涡轮机的转子半径 (m), 是风速 (m/s)。是叶片的功率系数,它是叶片桨距…

linux内网渗透:docker逃逸

Docker逃逸 前言 Docker 逃逸在渗透测试中面向的场景大概是这样,渗透拿到shell后,发现主机是docker环境,要进一步渗透,就必须逃逸到“直接宿主机”。甚至还有物理机运行虚拟机,虚拟机运行Docker容器的情况。那就还要…

基于VUE.JS的招聘系统

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):本文是基于Vue.js对招聘系统的设计与实现,对招聘系统管理员、个人用户、企业用户三个模块功能的完善…

kubernetes学习之路--污点容忍度横向主节点

参考:K8s污点容忍度横向主节点-安全客 - 安全资讯平台 一.kube-scheduler调度 kube-scheduler是Kubernetes 集群的默认调度器,并且是集群控制面(master)的一部分。对每一个新创建的Pod或者是未被调度的Pod,kube-scheduler会选择一个最优的N…

[附源码]Nodejs计算机毕业设计基于图书管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

43_SDIO基础知识

目录 SDIO协议简介 SDIO设备分类 SD卡物理结构 SD卡寄存器列表 SDIO总线拓扑 SDIO总线 SDIO总线协议 SDIO命令 命令格式 命令类型 响应 SD卡的操作模式 卡识别模式 数据传输模式 STM32 SDIO功能框图 命令通道 命令状态机 数据通道 数据状态机 数据FIFO SDI…

自定义java注解案例

今天与大家分享java注解的基本使用,如有哪里有问题,望大家指教。 目录 1. 什么是java注解 2. java注解的分类 2.1 JDK基本注解 2.2 JDK元注解 3. 自定义注解 3.1 自定义注解语法 4. 注解示例 4.1 定义注解 4.2 拦截器 4.3 使用注解 4.4 测试 …

Kali Linux渗透测试演示——DNS欺骗

目录 一、DNS欺骗 1.介绍 2.原理 二、环境和工具 1.kali Linux和靶机(这里选择windows 7) 2.ettercap 三、攻击过程 1.首先确认一下Kali和靶机的IP地址以及网关 2.进入ettercap的配置文件 3.打开ettercap,进行主机发现 总结 一、DNS…

MR案例:计算学生成绩

计算学生成绩一、提出任务二、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录(二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动…

adb常用命令(二)

adb:Android下面一个通用的调试工具管理设备或者手机模拟器的状态,进行手机操作:安装软件、卸载软件、系统升级、运行shell命令等adb命令:一、环境配置1,Java--JDK java -version2,SDK adb versionsdk版本管理(SDK与…

Spark-RDD(转换算子、行动算子、序列化、依赖关系、持久化、分区器、文件读取和保存、累加器、广播变量)

文章目录RDDRDD特点核心属性执行原理RDD创建RDD并行度与分区内存数据的分区文件数据的并行度和分区RDD转换算子Value类型mapmapPartitionsmapPartitionsWithIndexflatMapglom(获取分区数组)groupByfilterdistinctcoalesce(缩小/扩大分区)repartition(扩大分区)sortBysample双 V…

人工智能 之 机器学习(Machine Learning)

目录 一:机器学习概述 二:机器学习算法 三:机器学习模型 四:机器学习过程 五:机器学习模型验证 六:sklearn模块 一:机器学习概述 程序化处理和机器学习处理; 主观思维和客观思…

python利用read()、readline()、readlines()读取文件

目录 1.语法和用法 2.实例 1.语法和用法 with open(file,moder,encodingNone) as f:#①读取所有文本data1 f.read()#②读取第一行数据data2 f.readline() #③读取所有文本数据 data3 f.readlines() 说明: with …… as ……:用于命名&#xff0c…

2022年总结:打开新世界,踏上新征程

一、前言 于我而言,2022年是我的幸运年,人生发生转折的关键点。同时,也可能是互联网行业、社会经济状况开始扭转的一年。因此,打算在CSDN开始记录下我的第一篇年总结。当然除了是意义特殊外,也还有现实实在的意义&…