Linux网络编程(五-IO模型)

目录

一、同步I/O

二、异步I/O  

三、阻塞I/O 

四、非阻塞I/O

五、信号驱动I/O 

​六、多路复用IO


一、同步I/O

在操作系统中,程序运行的空间分为内核空间用户空间, 用户空间所有对io操作的代码(如文件的读写、socket的收发等)都会通过系统调用进入内核空间完成实际的操作。而且我们都知道CPU的速度远远快于硬盘、网络等I/O。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到I/O操作,如读写文件、发送网络数据时,就需要等待 I/O 操作完成,才能继续进行下一步操作,这种情况称为同步 I/O。

在某个应用程序运行时,假设需要读写某个文件,此时就发生了I/O操作,在I/O操作的过程中,系统会将当前线程挂起,而其他需要CPU执行的代码就无法被当前线程执行了,这就是同步I/O操作,因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们可以使用多线程或者多进程来并发执行代码,即当某个线程/进程被挂起后,不会影响到其他线程或进程。但多线程和多进程不能无限增加,且进程/线程之间切换的开销很大,而解决这个问题的另一种方法就是使用异步I/O。 

二、异步I/O  

当程序需要对I/O进行操作时,它只发出I/O操作的指令,并不等待I/O操作的结果, 然后就去执行其他代码了。一段时间后,当I/O返回结果时,再通知CPU进行处理。 这样子用户空间中的程序不需要等待内核空间中的 I/O 完成实际操作,就可执行其他任务,提高了CPU的利用率。总结就是用户不需要等待内核完成实际对I/O的读写操作就直接返回了

 

三、阻塞I/O 

当用户进程调用了 read()/recvfrom() 等系统调用函数,它会进入内核空间中,当这个网络I/O没有数据的时候,内核就要等待数据的到来,而在用户进程这边,整个进程会被阻塞,直到内核空间返回数据。当内核空间的数据准备好了,它就会将数据从内核空间中拷贝到用户空间,此时用户进程才解除阻塞的的状态,重新运行起来。 

阻塞I/O的特点就是在IO执行的两个阶段(用户空间于内核空间)都被阻塞了

四、非阻塞I/O

Linux下,可以通过设置socket使其变为非阻塞模式,这种情况下,当内核空间并无数据的时候,它会马上返回结果而不会阻塞,此时用户进程可以根据这个结果自由配置,比如继续请求数据,或者不再继续请求。

当用户进程调用 read()/recvfrom() 等系统调用函数时,如果内核空间中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个EWOULDBLOCK的错误码,表示数据没有准备好。此时用户进程会再次调用 read()/recvfrom() 等系统调用,当内核空间的数据准备好了,它就会将数据从内核空间中拷贝到用户空间,此时用户进程也就得到了数据。

非阻塞I/O的特点就是用户进程需要不断的主动询问内核空间的数据有没有准备好

五、信号驱动I/O 

信号驱动I/O的特点是内核将数据准备好的时候,使用SIGIO信号来通知应用程序进行I/O操作。(异步I/O是由内核在数据拷贝完成时, 通知应用程序,而信号驱动是告诉应用程序何时可以开始拷贝数据)

 六、多路复用IO

多路复用I/O就是我们说的 select、poll、epoll 等操作,复用的好处就在于单个进程就可以同时处理多个网络连接的I/O,能实现这种功能的原理就是 select、poll、epoll 等函数会不断的轮询它们所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程 ,从而大大减小了系统的开销。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间 

一般来说I/O复用多用于以下情况:

  1. 当客户处理多个描述符时。

  2. 服务器在高并发处理网络连接的时候。

  3. 服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。

  4. 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。

  5. 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。

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

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

相关文章

纯css+html实现拟态开关按钮面板

适合智能家居的开关面板UI 参考:https://drams.framer.website/

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

springboot+vue+mysql项目使用的常用注解

实体类常用注解 Data Data 是一个 Lombok 提供的注解&#xff0c;使用 Data 注解可以简化代码&#xff0c;使代码更加简洁易读。 作用&#xff1a;自动为类生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依赖 <depende…

Linux高级编程:网络

回顾&#xff1a; 进程间的通信&#xff1a; 同一主机内通信&#xff1a; 传统的进程间通信方式&#xff08;管道、信号&#xff09;&#xff1b; IPC对象&#xff08;共享内存&#xff0c;消息队列&#xff0c;信号量集&#xff09;&#xff1b; 不同主机间进程的通信&#…

C++ 链表OJ

目录 1、2. 两数相加 2、24. 两两交换链表中的节点 3、143. 重排链表 4、23. 合并 K 个升序链表 5、25. K 个一组翻转链表 解决链表题目常用方法&#xff1a; 1、画图 2、引入虚拟"头”结点 便于处理边界情况方便我们对链表操作 3、大胆定义变量&#xff0c;减少连接…

STM32CubeMX软件界面花屏,混乱的解决方案。

添加系统环境变量:J2D_D3D 值:false 即可解决。

MySQL:一行记录如何

1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成&#xff0c;InnoDB存储引擎的逻辑存储结构大致如下图&#xff1a; 行 数据库表中的记录都是按「行」进行存放的&#xff0c;每行记录根据不同的行格式&#xff0c;有不同的存储结构。 页…

机器学习中类别不平衡问题的解决方案

类别不平衡问题 解决方案简单方法收集数据调整权重阈值移动 数据层面欠采样过采样采样方法的优劣 算法层面代价敏感集成学习&#xff1a;EasyEnsemble 总结 类别不平衡&#xff08;class-imbalance&#xff09;就是指分类任务中不同类别的训练样例数目差别很大的情况 解决方案…

信呼OA普通用户权限getshell方法

0x01 前言 信呼OA是一款开源的OA系统&#xff0c;面向社会免费提供学习研究使用&#xff0c;采用PHP语言编写&#xff0c;搭建简单方便&#xff0c;在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…

码住!微信自动回复的实现方式

对于很多企业和个人来说&#xff0c;如何高效地回复微信客户消息是一个非常重要的问题。在这样的需求下&#xff0c;使用微信管理系统的机器人自动回复功能成为了一种不错的选择。 1、自动通过好友 当有大量的好友请求时&#xff0c;手动处理好友申请会变得非常繁琐。而微信管…

C++max函数的使用案例20个

文章目录 1. **基本用法&#xff1a;**2. **比较浮点数&#xff1a;**3. **比较字符串&#xff1a;**4. **使用自定义比较函数&#xff1a;**5. **比较容器中的元素&#xff1a;**6. **使用std::initializer_list&#xff1a;**7. **变长参数版本&#xff08;C11及以上&#xf…

Elasticsearch搜索引擎

目录 初识elasticsearch 了解ES 什么是elasticsearch elasticsearch的发展 搜索引擎技术排名&#xff1a; 总结 倒排索引 正向索引和倒排索引 正向索引 倒排索引 总结 es的一些概念 文档 索引 概念对比 架构 总结 安装es&#xff0c;kibana 安装es 安装kiba…

Redis的三种集群模式(图解)

主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能&#xff0c;但是从属节点只提供读取功能。 主从复制的数据同步过程如下&#xff1a; &#xff08;1&#xff09;首先主节点启动&#xff0c;然后从属节点启动&#xff0c;从属节点会连接主节点并发送SYNC命令以…

Android多线程实现方式及并发与同步,Android面试题汇总

一. 开发背景 想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样。 我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序&#xff0c;再由桌面程序来控制不同的硬件设…

python 蓝桥杯填空题

文章目录 字母数判断列名&#xff08;进制问题&#xff09;特殊日期大乘积星期几 字母数 由于是填空题&#xff0c;那么寻找的话&#xff0c;就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名&#xff08;进制问题&#xff09; 这道题目&#xff0c;我们可…

Claude 3家族惊艳亮相:AI领域掀起新浪潮,GPT-4面临强劲挑战

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-agd7RSCGMblYxo85 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

chatgpt-3的文章生成器有哪些?可以批量生成文章的生成器

GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;作为人工智能领域的一项重大突破&#xff0c;开启了新一代的文本生成技术。同时市面上也涌现出了一些GPT-3文章生成器&#xff0c;为用户提供了快速、高效地生成各种类型文章的工具。本文将介绍一些中国的GP…

[BUG]vscode插件live server无法自动打开浏览器

问题描述&#xff1a; 点了open with live server但是浏览器没有自动跳出来 http://127.0.0.1:5500/里面是有东西的 解决方法&#xff1a; 配置环境变量&#xff0c;在path中添加program files

2023天津公租房网上登记流程图,注册到信息填写

2023年天津市公共租赁住房网上登记流程图 小编为大家整理了天津市公共租赁住房网上登记流程&#xff0c;从登记到填写信息。 想要体验的朋友请看一下。 申请天津公共租赁住房时拒绝申报家庭情况会怎样&#xff1f; 天津市住房保障家庭在享受住房保障期间&#xff0c;如在应申…

闰年导致的哪些 Bug

每次闰年对程序员们都是一个挑战&#xff0c;平时运行好好的系统&#xff0c;在 02-29 这一天&#xff0c;好像就会有各种毛病。 虽然&#xff0c;提前一天&#xff0c;领导们都会提前给下面打招呼。但是&#xff0c;不可避免的&#xff0c;今天公司因为闰年还是有一些小故障。…