Linux--IO模型与高级IO重要概念

news2024/11/26 3:54:36

什么是IO?

IO是指计算机系统与外部世界进行数据交换的过程。在计算机中,IO通常用于与外部设备通信,这些设备包括键盘、鼠标、打印机、显示器、网络等。通过IO操作,计算机系统可以接收来自外部设备的输入数据,也可以将处理后的数据输出到外部设备。

在网络通信上,主要表示在计算机与计算机之间能通过互联网来进行数据交换,从而实现远程数据与资源的共享。

五种IO模型

阻塞IO

在这里插入图片描述
用户线程在发起IO请求后会阻塞,直到IO操作完成(内核数据准备好)并返回结果。这种方式简单但效率低下,特别是在高并发场景下。

非阻塞IO

在这里插入图片描述
如果内核还没有准备好数据,内核也会进行返回,并且返回一个EWOULDBLOCK错误码;

非阻塞IO需要在代码中循环,不断的查询读写这个文件描述符,这种操作称为轮询。在特定场景中,才会进行使用,会比较浪费CPU资源。

信号驱动IO

在这里插入图片描述
当内核将数据准备好时,内核会向应用进程发送一个SIGIO信号,通知程序进行IO操作。

IO多路转接

在这里插入图片描述

系统调用允许单个线程同时监视多个文件描述符的IO就绪状态,从而提高了IO操作的效率。

异步IO

在这里插入图片描述

异步IO是指系统内核主动发起IO请求,用户空间的线程被动接受IO操作的结果。这种方式下,用户线程无需等待IO操作完成即可继续执行其他任务,当IO操作完成后,内核会通知用户线程处理结果。

小结

任何IO过程,都包含两个步骤:等待数据+拷贝数据

在实际应用中,等待消耗的时间往往大于拷贝消耗的时间。
所以,要想提高IO的效率,就要减少等待的消耗时间。

高级IO的重要概念

同步IO

同步IO是指需要等待前面程序完成后,才能继续执行后面的程序。这意味着当程序发起一个IO请求时,它会阻塞当前线程的执行,直到IO操作完成。

特点:

  • 阻塞性:同步IO在读写数据时会阻塞程序的执行,导致程序无法充分利用CPU资源。
  • 顺序性:同步IO按照程序指定的顺序依次执行IO操作,前一个IO操作完成后,下一个IO操作才会开始。
  • 简单性:同步IO的实现相对简单,因为程序只需按照顺序执行IO操作,无需处理复杂的并发逻辑。

同步IO在IO操作期间会阻塞程序执行,导致CPU资源无法得到充分利用。
当IO操作时间较长时,程序会处于等待状态,造成CPU资源的浪费。

同步IO适用于一些简单的、不需要高并发处理的场景。例如,批处理作业、简单计算和查询程序等。
在这些场景中,同步IO的阻塞性和顺序性并不会对程序的性能产生太大影响。

异步IO

异步IO是指在进行数据读写操作时,程序无需等待IO操作完成。程序会发起IO操作,并立即返回一个标识符或回调函数,用于指示IO操作的状态或结果。

特点:

  • 非阻塞性:异步IO允许程序在发起IO请求后继续执行其他任务,无需等待IO操作完成。
  • 并发性:异步IO可以同时处理多个IO请求,提高了程序的并发处理能力。
  • 复杂性:异步IO的实现相对复杂,因为程序需要处理IO完成的通知和管理异步操作的状态。这通常涉及到事件循环、回调函数等概念。

异步IO可以充分利用CPU资源,因为程序可以在IO操作期间执行其他任务。
异步IO通过并发处理多个IO请求,提高了系统的整体性能和资源利用率。

异步IO适用于需要处理大量并发IO请求的场景。例如,Web服务器、数据库访问、网络编程等。
在这些场景中,异步IO的非阻塞性和并发性能够显著提高程序的执行效率和并发处理能力。

非阻塞IO的实现

对于C语言/C++来说,默认都是阻塞IO,如果要改为非阻塞IO,就要通过特定函数来进行实现;

fcntl()

在Linux系统中用于操作文件描述符的库函数。

#include <fcntl.h>  
#include <unistd.h>  
  
int fcntl(int fd, int cmd, ... /* arg */ );

参数:

  • fd: 文件描述符,是一个非负整数,表示要操作的文件。
  • cmd: 一个命令,用于指定要执行的操作。不同的命令需要不同数量的附加参数。
  • … /* arg */: 根据 cmd 命令的不同,可能需要一个或多个附加参数。这些参数通常是一个指向数据的指针。

常用命令

  • F_DUPFD: 复制文件描述符。
  • F_GETFD: 获取文件描述符标志。
  • F_SETFD: 设置文件描述符标志。
  • F_GETFL: 获取文件状态标志(如只读、非阻塞等)。
  • F_SETFL: 设置文件状态标志。
  • F_GETLK: 获取文件锁的状态。
  • F_SETLK: 设置文件锁(非阻塞)。
  • F_SETLKW: 设置文件锁(阻塞)。
#include<iostream>
#include<unistd.h>
#include<fcntl.h>

void SetNonBlock(int fd)
{
    int fl = ::fcntl(fd, F_GETFL);//获取fd当前文件描述符状态,默认为阻塞IO
    if(fl < 0) 
    {
        return;
    }
    fcntl(fd, F_SETFL, fl | O_NONBLOCK);//将其设置为非阻塞IO
}
int main()
{
    char buffer[1024];
    SetNonBlock(0);//设置成非阻塞的
    while (true)
    {
        //读取标准输入流的数据
        ssize_t s = read(0, buffer, sizeof(buffer) - 1);
        if(s > 0)
        {
            buffer[s] = 0;
            std::cout << "Echo# " << buffer << std::endl;
        }
        else
        {
            //问题:我怎么知道是底层IO条件不就绪,还是读取错误了呢???
            // 底层IO条件就绪和读取错误采用的是同样返回值操作的
            if(errno == EWOULDBLOCK || errno == EAGAIN)
            {
                std::cout << "底层数据没有就绪, 下次在试试吧! 做做其他事情!" << std::endl;
                sleep(1);
                continue;
            }
            std::cout << "读取错误... s : " << s  << " errno: " << errno << std::endl;
            sleep(1);
        }
    }
    return 0;
}

在这里插入图片描述

在阻塞IO中,read函数如果没有接收到输入的数据,那么就会一直阻塞,直到有数据的输入;
在这里插入图片描述
非阻塞IO中,如果没有输入数据,那么read函数也不会阻塞,会因为while循环进行轮询,不断的执行当前主函数,一旦read函数收到数据,那么就会打印对应数据。

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

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

相关文章

黑马JavaWeb开发跟学(九)MyBatis基础操作

黑马JavaWeb开发跟学九.MyBatis基础操作 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.…

LeetCode刷题日记之二叉树(六)

目录 前言二叉搜索树中的众数二叉树的最近公共祖先二叉搜索树的最近公共祖先总结 前言 又是学习LeetCode二叉树的新一天&#xff0c;今天还是接着学习一下二叉搜索树的内容&#xff0c;希望博主记录的内容能够对大家有所帮助 &#xff0c;一起加油吧朋友们&#xff01;&#x…

【ubuntu】ubuntu20.04安装conda

1.下载 安装参考&#xff1a;https://blog.csdn.net/weixin_44119391/article/details/128577681 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 2.安装 sudo chmod 777 -R ./Anaconda3-5.3.1-Linux-x86_64.sh ./Anaconda3-5.3.1-Linux-x86_64.sh Enter键确认安装…

图的基本概念 - 离散数学系列(五)

目录 1. 图的定义 节点与边 2. 度与路径 节点的度 路径与圈 3. 图的连通性 连通图与非连通图 强连通与弱连通 连通分量 4. 实际应用场景 1. 社交网络 2. 城市交通系统 3. 网络结构 5. 例题与练习 例题1&#xff1a;节点的度 例题2&#xff1a;判断连通性 练习题…

计算机视觉中的3D变换:让虚拟与现实无缝对接

嘿&#xff0c;小伙伴们&#xff01;今天咱们聊聊计算机视觉中的3D变换&#xff0c;这是连接虚拟世界与现实世界的桥梁&#xff01;无论你是想为游戏开发增添真实感&#xff0c;还是希望在增强现实中实现精准定位&#xff0c;这篇教程都会让你受益匪浅。准备好了吗&#xff1f;…

python数据分析与可视化工具介绍-matplotlib库

众所周知&#xff0c;python的数据分析库主要是numpy&#xff0c;pandas&#xff0c;和matplotlib&#xff0c;而前面两个主要是数据处理工具库&#xff0c;最后一个才是真正的作图展示工具库。本节来学习一下matploatlib工具库的使用。 Matplotlib常用绘图函数 pyplot简介 m…

Kubernetes: kube-proxy 和 CNI 是如何协作的?

在 Kubernetes 中&#xff0c;kube-proxy 和 CNI 插件协同工作&#xff0c;确保集群内 Pod 之间的互联互通。 Kube-proxy & CNI 如上图所示&#xff0c;假设我们有一个类型为 ClusterIP 的 Service&#xff0c;它对应两个位于不同节点的 Pod。 当我们从 Pod A 对该 Servi…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点&#xff1a;2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c;结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

MFC工控项目实例二十三模拟量输入设置界面

承接专栏《MFC工控项目实例二十二主界面计数背景颜色改变》 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Construction public:SenSet(CWnd* pParent NULL); //…

aws(学习笔记第三课) AWS CloudFormation

aws(学习笔记第三课) 使用AWS CloudFormation 学习内容&#xff1a; AWS CloudFormation的模板解析使用AWS CloudFormation启动ec2 server 1. AWS CloudFormation 的模版解析 CloudFormation模板结构 CloudFormation是AWS的配置管理工具&#xff0c;属于Infrastructure as Co…

黑马javaWeb笔记重点备份2:mybatis基础(注解方式)、数据库连接池概念、lombok使用

以下均来自&#xff1a;【黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p75&share_sourcecopy_web&vd_source9332b8fc5ea8d349a…

AI 激活新势能,中小企业全媒体营销绽放无限可能

什么是全媒体营销&#xff1a; 全媒体营销是一种利用多种媒介渠道进行品牌、产品或服务推广的营销策略。它结合了传统媒体&#xff08;如电视、广播、报纸、杂志&#xff09;和新媒体&#xff08;如互联网、社交媒体、移动应用等&#xff09;的优势&#xff0c;以实现信息的广…

vivado 使用 UltraFast 设计方法系统级设计流程图

下图展示了 Vivado Design Suite 中包含的各种设计步骤以及特性。您可以通过赛灵思 Documentation Navigator“Design Hub View” 访问该图的互动版&#xff0c;单击每个步骤将链接至相关资源。 理解 UltraFast 设计方法概念 在设计开始初期就采取正确方法非常重要&#xf…

数据结构与算法笔记:概念与leetcode练习题

1、数组Array 时间复杂度 数组访问&#xff1a;O(1) 数组搜索&#xff1a;O(N) 数组插入&#xff1a;O(N) 数组删除&#xff1a;O(N) 特点 适合读&#xff0c;不适合写 数组常用操作 # 1、创建数组 a [] # 2、尾部添加元素 a.append(1) a.append(2) a.append(3) # 3、…

《Linux从小白到高手》理论篇:Linux的系统环境管理

List item 值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下&#xff0c;如果你下载并安装了应用程序&#xff0c;很有可能在键入它的名称时出现“command not found”的提示…

大语言模型(LLM)综述

大语言模型&#xff08;LLM&#xff09;综述 正如缩放定律&#xff08;Scaling Laws &#xff09;所预测的那样, LLM 的通用语言理解和生成能力是通过在大量文本数据上训练数十亿个模型参数获得的。基于 Transformer 的大型语言模型 (LLM) 的最新进展&#xff08;在 Web 规模的…

系统架构设计师⑧:软件工程-软件开发方法与模型

系统架构设计师⑧&#xff1a;软件工程-软件开发方法与模型 软件开发方法 常用的软件开发方法主要分为3类&#xff1a; 结构化法&#xff08;比如C语言开发-面向过程&#xff09;&#xff0c; 面向对象法&#xff08;比如C或者JAVA开发-面向对象&#xff09;&#xff0c; 面向…

永洪科技第八届全国用户大会,释放数据价值!

永洪科技&#xff0c;作为“致力于打造全球领先的数据技术厂商”&#xff0c;将于【2024年11月1日】&#xff0c;在【北京东方君悦大酒店】盛大召开“第八届永洪科技全国用户大会”。旨在通过AIBI的深入融合&#xff0c;更加智能且精准的展现及预测未来的数据走向&#xff0c;展…

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式&#xff0c;也是最简单的。存在多节点session丢失的情况&#xff0c;可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…

分层解耦-03.IOCDI-入门

一. IOC&DI入门 二.控制转移注解Component 因为dao和service接口的实现类对象需要传入到service和controller中&#xff0c;因此需要将dao和service代码加上Component注解&#xff0c;使之实现控制反转&#xff0c;将实现类对象交给IOC容器管理&#xff0c;成为IOC容器中…