IO模型:同步阻塞、同步非阻塞、同步多路复用、异步非阻塞

目录

stream和channel对比

同步、异步、阻塞、非阻塞

线程读取数据的过程

同步阻塞IO

同步非阻塞IO

同步IO多路复用

异步IO

优缺点对比

stream和channel对比

  • stream不会自动缓冲数据,channel会利用系统提供的发送缓冲区、接收缓冲区。
  • stream仅支持阻塞API,channel同时支持阻塞、非阻塞API,网络channel可配合selector实现多路复用。
  • stream和channel均为全双工,读写可以同时进行。

同步、异步、阻塞、非阻塞

  • 同步异步强调的是结果的获取是主动还是被动的:
    • 同步:线程自己去获取结果。【一个线程】
    • 异步:线程自己不去获取结果,而是由其他线程推送结果。【至少两个线程】
  • 阻塞非阻塞表示获取这个动作是否可以立即返回而不需要等待:关注的是线程的状态。
    • 阻塞:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会恢复运行。
    • 非阻塞:不能立即得到结果之前,该调用不会阻塞当前线程。

举例:

        同步就是烧开水,要自己来看开没开;异步就是水开了,然后水壶响了通知你水开了 (回调通知)。阻塞是烧开水的过程中,你不能干其他事情,必须在旁边等着;非阻塞是烧开水的过程里可以干其他事情。

        异步阻塞没有实际意义,所以组合后只有同步阻塞、同步非阻塞、异步非阻塞。考虑IO多路复用则有同步多路复用。

线程读取数据的过程

        当用户线程发起一次系统调用(如channel.read()、stream.read())后,会由用户态切换至操作系统内核态完成真正数据的读取操作。数据读取又分为两个阶段:

  1. 等待数据阶段:等待内核将数据由物理设备(磁盘)拷贝至内核缓冲区。
  2. 复制数据阶段:将数据由内核缓冲区拷贝至用户缓冲区。

同步阻塞IO

        阻塞I/O(同步阻塞IO):两个阶段都必须等待。①从硬件设备读取数据到内核空间;②将内核空间中的数据拷贝到用户缓冲区。

同步非阻塞IO

        非阻塞I/O(同步非阻塞IO):用户系统调用操作会立即返回结果而不是阻塞用户进程。不断进行轮询查看数据是否已由物理设备拷贝至内核缓冲区,当数据准备就绪后,将数据从内核缓冲区拷贝至用户缓冲区仍然是阻塞的。

        非阻塞I/O第一个阶段系统调用请求直接返回,可能误认为和阻塞I/O没有区别,实则非阻塞I/O直接返回后,其他进程也可以执行系统调用。

同步IO多路复用

        I/O多路复用:利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知。从而避免无效的等待,充分利用CPU资源。

异步IO

        异步I/O(Asynchronous IO【AIO】):用户线程通过系统调用,向内核注册某个IO操作,内核在整个IO操作(包括数据准备、数据复制)完成后,通知用户程序,执行后续的业务操作。在异步IO模型中,整个内核的数据处理过程中,包括①将数据从物理设备拷贝到内核缓冲区;②将数据从内核缓冲区拷贝到用户缓冲区,用户线程都不需要阻塞。当内核的IO操作完成后,内核会通知应用程序读取数据。

优缺点对比

  1. 同步阻塞IO
    1. 优点:程序开发简单;在阻塞等待数据期间,用户线程挂起,不占用CPU资源。
    2. 缺点:一个线程维护一个IO流的读写,在高并发应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会十分巨大,BIO模型在高并发场景下是不可用的。
  2. 同步非阻塞IO
    1. 优点:内核缓冲区没有数据的情况下,发起的系统调用不会阻塞,用户程序不会阻塞,实时性较好。
    2. 缺点:需要不断地重复地发起IO调用,这种不断轮询,不断询问内核的方式,会占用CPU大量的时间,资源利用率比较低;在内核缓冲区有数据的情况下,也是阻塞的。NIO模型在高并发场景下是不可用的。
  3. IO多路复用
    1. 优点:select/epoll可以同时处理成百上千的连接,与之前的一个线程维护一个连接相比,IO多路复用则不需要创建线程,也就不需要维护,从而减少系统开销.
    2. 缺点: select/epoll系统调用,属于阻塞的模式。读写事件就绪之后,用户自己进行读写,这个读写过程也是阻塞的。
  4. 异步IO
    1. 优点:在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的。
    2. 缺点:需要事件的注册,就需要操作系统。

 

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

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

相关文章

轻松拿捏C语言——【字符函数】字符分类函数、字符转换函数

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🌈感谢大家的阅读、点赞、收藏和关注💕 🌹如有问题,欢迎指正 感谢 目录👑 一、字符分类函数🌙 二、字符转换函数…

hive3从入门到精通(二)

第15章:Hive SQL Join连接操作 15-1.Hive Join语法规则 join分类 在Hive中,当下版本3.1.2总共支持6种join语法。分别是: inner join(内连接)left join(左连接)right join(右连接)…

力扣HOT100 - 136. 只出现一次的数字

解题思路: class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }

基于卷积神经网络的交通标志识别(pytorch,opencv,yolov5)

文章目录 数据集介绍:resnet18模型代码加载数据集(Dataset与Dataloader)模型训练训练准确率及损失函数:resnet18交通标志分类源码yolov5检测与识别(交通标志) 本文共包含两部分, 第一部分是用re…

C++学习笔记(21)——继承

目录 1. 继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 继承的概念总结: 2. 基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数知识点:派生类中6个默认成员函数…

win11 wsl ubuntu24.04

win11 wsl ubuntu24.04 一:开启Hyper-V二:安装wsl三:安装ubuntu24.04三:桥接模式,固定IP四:U盘使用五:wsl 从c盘迁移到其它盘参考资料 一:开启Hyper-V win11家庭版开启hyper-v 桌面…

Pytorch-01 框架简介

智能框架概述 人工智能框架是一种软件工具,用于帮助开发人员构建和训练人工智能模型。这些框架提供了各种功能,如定义神经网络结构、优化算法、自动求导等,使得开发人员可以更轻松地实现各种人工智能任务。通过使用人工智能框架,…

虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。

问题: 虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。 分析: 该虚拟机环境之前使用的VMware版本与你所使用的VMware版本不一致。大概率你使用的是刚从别人电脑里拷过来的虚拟机环境。 解决&…

游戏后台开发技术全面解析

在这个数字时代,游戏产业已经成为全球最受欢迎的娱乐方式之一。从简单的手机游戏到复杂的大型多人在线角色扮演游戏(MMORPG),游戏的世界正变得越来越丰富和多样化。而这一切的背后,都离不开强大的游戏后台技术支持。在…

Java重写

方法重写的意义 在java中,子类可以继承父类中的方法,而不需要重新编写相同的方法,但是有时子类并不想原封不动的继承父类方法,需要做一定的修改,这时候就需要使用方法重写 方法重写的定义 在继承的前提下 子类可以根据…

Python使用连接池操作MySQL

测试环境说明:Python版本是 3.8.10 ,DBUtils版本是3.1.0 ,pymysql版本是1.0.3 首先安装指定版本的连接池库DBUtils 、还有pymysql pip install DBUtils3.1.0 pip install pymysql1.0.3创建文件 sqlConfig.py # sqlConfig.pyimport pymysql…

YOLOv10论文解读:实时端到端的目标检测模型

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

618购物节快递量激增,EasyCVR视频智能分析助力快递网点智能升级

随着网络618购物节的到来,物流仓储与快递行业也迎来业务量暴增的情况。驿站网点和快递门店作为物流体系的重要组成部分,其安全性和运营效率日益受到关注。为了提升这些场所的安全防范能力和服务水平,实施视频智能监控方案显得尤为重要。 一、…

蓝桥杯嵌入式国赛笔记(2):拓展板按键程序设计

目录 1、前言 2、电路原理 3、代码编写 3.1 读取Btn电压 3.2 检索按键 3.3 main文件编写 3.3.1 进行变量定义 3.3.2 AD_Key函数 3.3.3 LCD函数 3.3.4 main函数 3.3.5 完整代码 4、测试 5、总结 1、前言 本文进行拓展板按键程序设计,拓展板的按键是通…

人生苦短,我学python之数据类型(下)

个人主页:星纭-CSDN博客 系列文章专栏:Python 踏上取经路,比抵达灵山更重要!一起努力一起进步! 目录 一.集合 1.1子集与超集 1.2交集,并集,补集,差集 1.intersection(英文&a…

webman使用summernote富文本编辑器

前言 Summernote富文本编辑器功能强大,可以直接从word直接复制内容过来而不破坏原有的文档格式,非常适合做商品详情等内容的编辑工具。本文将展示如何在php高性能框架webman中使用summernote编辑器。 下载 去Bootstrap 中文网、Summernote、jQuery官网…

【设计模式】JAVA Design Patterns——Converter(转换器模式)

🔍目的 转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。此外,Converter模式引入了双向集合映射,从而将样板代码减少到最少 🔍解释 真实世界例子 在真实…

低代码开发:拖拽式可视化构建工业物联网系统

什么是低代码? 低代码(Low Code)是一种可视化的软件开发方法,通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面,从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…

Pandas 创建层次化索引

1.创建多层次索引 1.1 隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 # 导入pandasimport numpy as npimport pandas as pd​data np.random.randint(0,100,size(6,6))​# 行索引index [ ["1班","1班","1班&qu…

【全网最全】2024电工杯数学建模B题53页成品论文+完整matlab代码+完整python代码+数据预处理+可视化结果等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片链接,那是获取资料的入口! 【全网最全】2024电工杯数学建模B题53页成品论文完整matlab、py代码19建模过程代码数据等(后续会更新)「首先来看看目前已有的资…