IO实现方式(同步阻塞、同步非阻塞、IO多路复用)

1. 同步阻塞IO

同步阻塞io在数据在数据拷贝到两个阶段都是阻塞的,即把socket的数据拷贝到内核缓冲区和把内核缓冲区的数据拷贝到用户态到应用程序缓冲区都是阻塞的。用户线程在这个期间不能处理其他任务。
在这里插入图片描述

优点:简单易用
缺点:为每一次io请求都要分配一个线程,如果获取不到数据会一直阻塞

2. 同步非阻塞

同步非阻塞不会像同步阻塞那样两个阶段都阻塞,它在第一个阶段中向内核请求数据时如果此时内核还没准备好数据,那么它会直接返回一个错误,不会一直等待下次。等待一定时间后会继续发起io请求。
在这里插入图片描述

优点:允许单个线程处理多个io请求,线程可以执行其他任务
缺点:频繁的轮询请求会消耗cpu资源

3. IO多路复用

io多路复用本质上和同步非阻塞模式一样,它解决了同步非阻塞中用户线程不断轮询请求而消耗cpu资源的问题。io多路复用增加了一个select / poll / eoll 系统调用,由内核来实现请求线程本来该做的轮询操作。具体来说,执行系统调用时,会将已经建立连接的socket放在一个文件描述符的集合中,然后把这个fd集合拷贝到内核态,让内核来检查是否有io事件已经准备好了。再把检查好的fd集合拷贝到用户态到缓冲区中。

3.1 select实现方式

它采用位数组BitsMap来存储已建立连接到socket请求,构成fd集合,把fd集合拷贝到内核态,内核态遍历整个fd集合,若数据准备就绪,则对应标志位设置为1。遍历完成后,再把fd集合拷贝到用户缓冲区。
缺点:监听的 socket 集合 数量受位数组大小的限制,每次拷贝要拷贝全部fd集合,检查时要从头到尾遍历所有的 fd 集合

3.2 poll的实现方式

poll针对select监听fd集合的数量限制进行了改进,采用了结构体 + 链表的形式来组织fd集合,与select没有太大区别

3.3 epoll的实现方式

● select和poll的实现存在以下问题:
a. 每次io请求需要把整个fd集合拷贝进内核态或者从内核态拷贝到用户态
b. 要遍历全部fd集合才能得到需要处理的数据集合
select 需要遍历所有注册的I/O事件,找出准备好的的I/O事件。 而 epoll 则是由内核主动通知哪些I/O事件需要处理,不需要用户线程主动去反复查询,因此大大提高了事件处理的效率。
它的实现主要通过在内核维护一个红黑树和就绪链表,红黑树用于记录所有待处理的fd集合,而就绪链表用于记录准备好的就绪事件。当有fd请求需要监听是,调用epoll_ctl ( )来添加监听,不要传递整个 fd 集合,传递要监听的 fd 即可 。当 epoll_wait() 调用发生并且检测到一个或多个事件就绪时,内核将这些就绪事件的数据从内核的事件列表拷贝到用户提供的 events 数组中。

3.3.1事件触发模式

● 水平触发(LT):默认工作模式,表示当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序可以不立即处理该事件;下次调用epoll_wait时,会再次通知此事件。
● 边缘触发(ET): 当epoll_wait检测到事件就绪并通知应用程序时,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次通知此事件。边缘触发只在状态由未就绪变为就绪时只通知一次。
LT模式和ET模式各有优缺点,无所谓孰优孰劣。使用 LT 模式,我们可以自由决定每次收取多少字节(对于普通 socket)或何时接收连接(对于侦听 socket),但是可能会导致多次触发;使用ET模式,我们必须每次都要将数据收完(对于普通socket)或必须理解调用accept接收连接(对于侦听socket),其优点是触发次数少。

参考:参考1
参考:参考2

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

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

相关文章

VScode远程连接虚拟机提示: 无法建立连接:XHR failed.问题解决方案

一问题描述 在vscode下载插件Remote-SSH远程连接虚拟机时提示无法建立连接 二.最大嫌疑原因: 我也是在网上找了许久,发现就是网络原因,具体不知,明明访问别的网页没问题,就是连不上,然后发现下载vscode的…

【电赛】自制模块2——偏置变幅器

一、理论基础 模电学习笔记——集成运算放大器https://mp.csdn.net/mp_blog/creation/editor/134449862 运放单双电源转换/运放单双电源供电详解https://mp.csdn.net/mp_blog/creation/editor/135884117 通过改变R4或R5的阻值改变正弦波的振幅。 根据公式 A表示放大倍数。 …

MAC上如何将某个目录制作成iso格式磁盘文件,iso文件本质是什么?以及挂载到ParallelDesktop中?(hdiutil makehybrid )

背景 ParallelsDesktop没有安装ParallelsTools的无法共享目录,可以通过ParallelsDesktop提供CD磁盘的方式共享进去 命令 # 准备文档 mkdir mytestdir cp xxx mytestdir# 生成iso hdiutil makehybrid -o output.iso mytestdir -iso -joliethdiutil是MAC提供的磁盘…

大白话!go语言中的指针、指针类型的方法接收器

go语言中的指针使用起来的比较简单。应用如下: 1.普通的对象取地址,获取对象值 符号&,取地址符,可以取变量的地址,或结构体对象的地址等。符号*,是从地址中取值(根据栈中存储地址&#xf…

Oracle中的视图

1- 什么是视图 视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户,订单,物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图 …

【数据仓库工具箱】DW/BI系统的核心元素和基本要求

核心元素 DW/BI 环境划分为4个不同的,各具特色的组成部分。分别是:操作型源数据,ETL系统,数据展现和商业智能应用。 操作型源数据 记录的是操作型系统,用于获取业务事务。源数据关注的是处理性能和可用性。源系统一般…

Jmeter-非GUI模式下运行jmeter脚本-适用于服务器上持续集成测试

背景 大部分Jmeter脚本都是部署在Linux上运行,利用Jenkins做接口自动化,定时巡检任务。 执行命令 1.进入jmeter的目录,bin文件夹 cd C:\path\to\jmeter\bin2.运行脚本文件 jmeter -n -t D:\{脚本文件目录}\xxx.jmx -l D:\{脚本文件目录}…

信息系统项目管理师0061:架构设计(5信息系统工程—5.1软件工程—5.1.1架构设计)

第五章 信息系统工程 信息系统工程是用系统工程的原理、方法来指导信息系统建设与管理的一门工程技术学科,它是信息科学、管理科学、系统科学、计算机科学与通信技术相结合的综合性、交叉性、具有独特风格的应用学科。当前信息系统工程的主要任务是研究信息处理过程内在的规律…

76.最小覆盖子串

题目描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数…

计算机视觉中,什么是上游任务、下游任务和pretext task?

在机器学习和深度学习的语境中,尤其是当涉及到预训练模型时,我们经常听到“上游任务”和“下游任务”这两个术语。 上游任务通常指的是模型在大量无标签或有标签的数据上进行预训练的任务,其目标是让模型学习到数据的内在规律和特征表示。 …

Java中的BIO、NIO与AIO

1.概述 I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。Java 共支持 3 种网络编程模型 I/O 模式:BIO、NIO、AIO。 2.Java BIO Java BIO(Blocking I/O):是传统的java io 编程&#…

密钥密码学(二)

原文:annas-archive.org/md5/b5abcf9a07e32fc6f42b907f001224a1 译者:飞龙 协议:CC BY-NC-SA 4.0 第十章:可变长度分数化 本章涵盖 基于摩尔斯电码的密码 混合字母和双字母 可变长度二进制码字 基于文本压缩的密码 本章涵盖…

【Redis(8)】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题

在缓存技术的挑战及设计方案我们介绍了使用缓存技术可能会遇到的一些问题,那么如何解决这些问题呢? 在构建缓存系统时,Spring Boot和Redis的结合提供了强大的支持,而Guava的LoadingCache则为缓存管理带来了便捷的解决方案。下面我…

【嵌入式】keil5安装(同时兼容C51和STM32)

最近在开发STM32的时候,安装Keil5,遇到STM32和C51的共存的问题,在网上找了很多方法,又遇到一些bug,最终还是弄好了。因此将处理的过程记录下来,希望对遇到相同问题的朋友一些启发。 1、下载安装包 Keil P…

基于FPGA的频率计与串口通信(二)

接上篇,本文章展示基于FPGA的频率计与串口通信项目部分核心代码。 顶层文件 top.bdf //#pragma file_not_in_maxplusii_format (header "graphic" (version "1.3")) (pin(input)(rect 80 328 248 344)(text "INPUT" (rect 133 0 1…

Spark---RDD的创建分类和基础操作算子详解

一、RDD的创建 原生api提供了两种创建方式,一种就是读取文件textFile,还有一种就是加载一个scala集合parallelize。当然,也可以通过transformation算子来创建的RDD。 //创建RDD//加载数据,textFile(参数1,…

新牛市新方向:探索加密货币生态的未来

序章:牛市来袭,新的探索 新的牛市来临,带来了加密货币世界的一次次惊喜。比特币、以太坊、Solana等生态系统在这场盛宴中展现出各自的独特魅力,带来了一场场引人入胜的探索之旅。让我们跟随着这些生态系统的脚步,一起…

基础算法前缀和与差分

前言 本次博客会介绍一维和二维的前缀和,以及一维二维差分的基本使用,尽量画图,多使用配合文字 使大家理解,希望有所帮助吧 一维前缀和 问题描述 这里有一个长度为n的数组,我们要算出【2,5】区间的元素和 暴力思…

Mogdb 5.0新特性:SQL PATCH绑定执行计划

前言 熟悉Oracle的dba都知道,生产系统出现性能问题时,往往是SQL走错了执行计划,紧急情况下,无法及时修改应用代码,dba可以采用多种方式针对于某类SQL进行执行计划绑定,比如SQL Profile、SPM、SQL Plan Base…

Linux——网络管理nmcli

nmcli 不能独立使用,需要对应的服务启动 1. NetworkManager.service 2. 网络配置和服务不相关 3. 通过 nmcl i 建立网络配置和网卡之前的映射关系 网卡 简称:nmcli d DEVICE :物理设备 TYPE: 物理设备类型 ethernet 以太网…