当前位置: 首页 > news >正文

【网络编程】五种网络IO模式

 对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,会经历两个阶段:

  1、等待数据准备

        2、将数据从内核拷贝到进程中

linux系统产生了下面五种网络模式的方案

  1、阻塞IO(blocking IO)

  2、非阻塞IO(nonblocking IO)

  3、IO多路复用(IO multiplexing)

  4、信号驱动IO(signal driven IO)不常用

       5、异步IO (asynchronous IO)

1、阻塞IO(blocking IO)

     这种IO模型是同步的,在linux 中,默认情况下所有的socket都是blocking IO, 一个典型的读操作流程: 

 2、非阻塞IO(nonblocking IO)

非阻塞IO模型 只有是检查无数据的时候是非阻塞的在数据到达的时候依然要等待复制数据到用户空间,因此它还是同步IO

当用户线程发起一个read操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error(errno == EAGAIN || EWOULDBLOCK)时,它就知道数据还没有准备好,于是它可以先做别的事情然后再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。

所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。

 

设置非阻塞常用方式:

方式一: 创建socket 时指定

int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);

方式二: 在使用前通过如下方式设定

fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);

3、IO多路复用

当用户进程调用了select,那么整个进程就会被block,而同时,kernel会 “监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

所以,IO多路复用的特点是通过一种机制,一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入就绪状态,select()函数就可以返回。

这里需要使用两个system call(select 和 recvfrom),而blocking IO只调用了一个system call(recvfrom)。但是,用select的优势在于它可以同时处理多个connection。

如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用mutil-threading + blocking IO的web server性能更好,可能延迟还更大。

select/epoll 的优势并不是对于单个连接能处理得更好,而是在于能同时处理更多的连接。

下面这幅图形象的说明了select/poll和epoll的区别。

select/poll

  • 委托内核进行操作
  • 只会通知有几个任务可用,但不知道具体哪几个任务,还需遍历

epoll

  • 委托内核进行操作
  • 会通知具体有哪几个任务可用

 关于根据的IO多路复用问题,将在另外的文章做详细的说明。

4、信号驱动IO

     使用信号驱动I/O时,当网络套接字可读后,内核通过发送SIGIO信号通知应用进程,于是应用可以开始读取数据。该方式并不是异步I/O,因为实际读取数据到应用进程缓存的工作仍然是由应用自己负责的。 

 

5、异步IO

当用户进程发起一个read操作后,内核收到该read操作后,首先它会立刻返回,所以不会对用户进程 阻塞,然后它会等待数据的准备完成,再把数据拷贝到用户内存,完成之后,它会给用户进程发送一个信号,告诉用户进程read操作已完成.

 

相关文章:

【网络编程】五种网络IO模式

对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,会经历两个阶段: 1、等待数据准…...

面试总结-2023版

本文受众主要为,互联网技术研发人员。 技术面试一般三面和HRBP面不太会卡人,主要都是停在了一面和二面上。我这次换工作前期主要是一面通过率比较低,后面主要是二面通过低。 总结影响面试通过的几点因素: 是否真的招人&#xf…...

bigemap在草原行业的应用案例

一.为什么选择Bigemap 1.使用软件一般都用于套坐标以及空间规划图,方便于项目选址和居民建房报建 2.在卫星图上找到用地范围,然后打点,导出点位范围的2000坐标,用于汇报出图 3.CGCS2000坐标系通过矢量转换转成地方坐标系...

DevOps系列文章之 java调用python脚本

在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 简单介绍 官网地址 首页 | (jython.org) Jython项目提供了Java中的Python实现, 为Python提供了…...

PHP异步框架总结

目前主要有: 国产 swoole workerman 国外 framework-x revoltrevolt reactphp amphp async...

vsto excel 可以异步写入值么

在 VSTO (Visual Studio Tools for Office) 中,Excel 可以使用异步方式写入值。异步编程允许您在后台线程中执行耗时的操作,而不会阻塞主线程,从而提高程序的响应性能。 从 .NET 4.5 开始,可以使用异步和 await 关键字来简化异步…...

Android Gradle 骚操作,将两个项目合并到一个项目中

1. 前言 在工作中,由于各种原因,导致需要将两个可单独运行的App项目,合并到一个git仓库里,且单独的App项目里还有其他Module模块。 如果只是将两个项目复制到同一个文件夹下,还是得单独打开各个项目,是很不…...

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一,设备故障的频发严重影响企业的正常生产,那么如何分析设备故障时间和次数,查找设备故障原因,协助企业打破生产瓶…...

SVN代码迁移到Git方法

1.在SVN上新增一个项目 一、点击新建项目 二、创建空白项目 三、填入项目信息 四、myProject项目模板创建成功 2.将代码提交到Git 一、新建一个文件夹myProject,将从SVN下载过来的代码复制一份拷贝到该文件夹下,注意:不要把.SVN文件拷…...

Linux更换阿里云yum源

1、备份 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.backup2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo如果出现解析错误 Could not resolve host: mirrors.a…...

【1.3】Java微服务:Spring Cloud版本说明

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 微服务 ✨特色专栏: 知识分享 &#x…...

OpenMP

官方文档:OpenMP | LLNL HPC Tutorials OpenMP总览 统一内存访问:OpenMP、Pthreads 非统一内存访问:MPI OpenMP与Pthread OpenMP原理 串行区到达并行区后会派生多个线程,并行区代码执行完后进行线程合并,剩下主线程 编…...

Eureka 学习笔记4:EurekaClient

版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口&#xff0c;拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能&#xff1a; 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…...

前端后端路径问题详解

加了项目名&#xff0c;访问所有页面都是 在 项目名下 出来的路径 不加项目名&#xff0c;访问所有页面都不用加项目名&#xff0c;然后前后端的加/的效果都一样&#xff0c;都是在根目录下没有项目名的路径&#xff01;&#xff01;&#xff01; 后端 一、MVC 1.不管是转发…...

@vue/composition-api原理解析

前言 上一篇文章介绍了vue/composition-api是什么&#xff0c;以及为什么要用&#xff0c;现在来系统地解析一下 vue/composition-api 的实现原理&#xff0c;希望可以加深对其工作机制的理解。 老规矩先分享下AI评价&#xff1a;对vue/composition-api实现原理的介绍整体上非…...

Kubernetes(K8s)从入门到精通系列之三:K8s的基本概念和术语之资源对象概述

Kubernetes K8s从入门到精通系列之三&#xff1a;K8s的基本概念和术语之资源对象概述 K8s中的基本概念和术语大多是围绕资源对象(Resource Object)来说的&#xff0c;而资源对象在总体上可分为以下两类&#xff1a; 某种资源的对象&#xff0c;例如节点(Node)、Pod、服务(Serv…...

cc2652在使用过程中的一些注意事项

可能不只是cc2652有这些坑&#xff0c;估计cc26xx系列都存在。 CCS的预编译宏配置位置 时钟获取 时钟获取__STATIC_INLINE uint32_t SysCtrlClockGet( void )在sys_ctrl.h中&#xff0c;sys_ctrl.h没有在工程路径下面&#xff0c;在其sdk中 节拍时间获取 ICall_getTicks(); …...

YAPI接口自动鉴权功能部署详解

目录 安装准备 在线安装 离线安装 配置使用 安装准备 以下操作&#xff0c;默认要求自己部署过yapi&#xff0c;最好是部署过yapi二次开发环境。 无论是选择在线安装或者是本地安装&#xff0c;都需要安装client工具。 1、yapi-cli&#xff1a;npm install yapi-cli –g…...

【雕爷学编程】Arduino动手做(180)---Seeeduino Lotus开发板3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…...

搜索与图论(二)

最短路 单源最短路 所有边权都是正数 朴素Dijkstra算法 基本思路:从1号点到其他点的最短距离 步骤: 定义一个s集合包含当前已确定最短距离的点 1、初始化距离dis[1] 0,dis[其它] 正无穷 2、for i 0-n循环n次 2.1找到不在s中的距离最近的点 ->t 2.2把t加到s当中去…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...