linux学习--第七天(多路复用IO)

多路复用IO

-阻塞IO与非阻塞IO

    -IO模型

        IO的本质时基于操作系统接口来控制底层的硬件之间数据传输,并且在操作系统中实现了多种不同的IO方式(模型)比较常见的有下列三种:

        1.阻塞型IO模型

        2.非阻塞型IO模型

        3.多路复用IO模型

-阻塞型IO

    概念:当进程发出IO请求后,阻塞进程(让进程进入睡眠状态),资源就绪后唤醒进程继续执行(一般默认的IO操作都是阻塞型IO

    特点:会一直等待,直到数据就绪

-非阻塞型IO

        特点:程序不会等待用户输入,会立即返回

        当进程发出IO请求后,无论资源是否就绪都立即返回,相应的模型如下;

    实现非阻塞型IO,需要设置O_NONBLOCK标志

    fcntl函数通过命令字(cmd)来设置文件描述符

-多路复用IO

-多路复用IO简介

    本质:就是通过复用一个进程来处理多个IO请求

    基本思想:由内核来监控多个文件描述符是否可以进行I/O操作,如果就绪的文件描述符,将结果告知用户进程,则用户在进程相应的I/O操作

-多路复用I/O方案

    目前在linux系统有三种多路复用I/O的方案

        1.select方案

        2.poll方案

        3.epoll方案

-select多路复用IO

-设计思想

   1.通过单进程创建一个文件描述符集合,将需要监控的文件描述符,添加到这个集合中

   2. 由内核负责监控文件描述符是否可以进行读写,一旦可以读写,则通知相应的进程进行相应的IO操作

    select函数监控一组文件描述符,阻塞当前进程,由内核监测相应的文件描述符是否就绪,一旦文件描述符就绪,将就绪的文件描述符拷贝给进程,唤醒进程处理

   超时时间的说明:

        1.如果timeout之后,文件描述符集合中没有任何就绪的文件描述符,select函数就会返回0

        2.超时之后,timeout会被select函数修改,表示超时时间已经使用完

          如果想继续使用使用超时间,需要备份之前的struct timval

 超时之后,,表示没有就绪的文件描述符,此外文件描述符集合被赋值为空

因此,需要将之前的文件描述符集合进行备份

-select底层原理分析

-文件描述符集合

    文件描述符集合的数组最终在储存时,使用了位图的方式来记录相应的文件描述符,具体原理如下:

        1.数组中没有直接存储文件描述符,而是使用某一位来表示该文件描述符是否需要监控

        2.需要监控的文件描述符需要转成数组的某一个元素的某一位,然后将对应的位设置为1

    例如: fd = 60 的成员需要监控,则需要将数组的第0个成员的第 [60] bit 设置为1,当 fd = 64时,则需要将数组的第1个成员的第[0] bit 设置为1

    (从上面的文件描述符集合内管理可以分析,select最终只能存储1024个文件描述符)

select基本原理如下:

select() 函数中一共需要使用三个文件描述符集合,分别是:

        1.in: 需要进行读的文件描述符的集合

        2.out需要进行写的文件描述符的集合

        3.exp其他文件描述符集合

调用了select() 函数,内核做了如下事情:

        1.从用户空间将集合的文件描述符拷贝到内核空间

        2.循环遍历fd_set中所有的文件描述符,来检测是否有文件描述符可进行I/O操作

            1>如果文件描述符可进行I/O操作,则设置返回的文件描述符集合对应位为1(res_in,res_out,res_exp),跳出循环,直接返回。最终会赋值给in,out,exp 文件描述符集合

            2>如果没有文件描述符可进行IO操作,则继续循环检测,如果设置timeout,则在超时后返回,此时select()函数返回0

        select()函数减少了多进程/多线程的开销,但仍然有多缺点:

            1.每次调用select()函数都需要将fd集合拷问到内核空间,这个开销在fd很多时就越大

            2.每次都需要遍历所有的文件描述符集合,这个开销在fd很多时就越大

            3.支持的文件描述符只有2024

        整体流程

-poll多路复用IO

    基本原理

        1.在应用层是以struct polled数组的形式来进行管理文件描述符,在内核中基于链表对数组进行扩展

    特点:

        1.poll将请求与就绪事件通过结构体进行分开

        2.select将请求与就绪文件描述符存储在同一个集合,导致每次都需要进行重新赋值才能进行下一次监控

        3.在内核中仍然使用的是轮询的方式,与select相同,当文件描述符越来越多时,则会影响效率

        POLLIN普通数据可读

        POLLOUT普通数据可写

    总体流程

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

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

相关文章

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测 开源项目地址:https://gitcode.net/EricLee/yolo_v3 示例:

【C++】多态(下)

个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…

开放式耳机哪个品牌好?分享几款不错的开放式蓝牙耳机

相信很多人戴入耳式耳机时间一久,就不是很舒服。经常会有闷热、不透气的感觉,甚至有的朋友会因为佩戴入耳式耳机滋生细菌,导致最后炎症的发生。总之,入耳式耳机真的不适合长时间佩戴,而且佩戴的场景也有很多限制。 那…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么? 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别: 1、新建项目 Maven: Gradle: 2、配置项目 Maven: Gradle: 3、构建项目——生成项目的jar包 Gradle&…

Linux 信号详解

目录 一.前置知识 1.前台进程和后台进程 a.概念理解 b.相关指令 2.信号的前置知识 a.Linux 系统下信号的概念 b.进程对信号的处理方式 3.信号的底层机制 二.详解信号 1.信号的产生 a.键盘组合键 b.kill 指令和系统调用接口 ① kill 指令 ② kill() 系统调用接口 ③ raise() 系统…

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清: 1.首先,tcp四次挥手只有主动和被动方之分,没有客户端和服务端的概念 2.其次,发送报文段是tcp协议栈的行为,用户态调用close会陷入到内核态 3.再者,图中的情况前提是双…

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], k 4 输出&#x…

栏目二:Echart绘制动态折线图+柱状图

栏目二:Echart绘制动态折线图柱状图 配置了一个ECharts图表,该图表集成了数据区域缩放、双Y轴显示及多种图表类型(折线图、柱状图、象形柱图)。图表通过X轴数据展示,支持平滑折线展示比率数据并自动添加百分比标识&…

从原理到代码:如何通过 FGSM 生成对抗样本并进行攻击

从原理到代码:如何通过 FGSM 生成对抗样本并进行攻击 简介 在机器学习领域,深度神经网络的强大表现令人印象深刻,尤其是在图像分类等任务上。然而,随着对深度学习的深入研究,研究人员发现了神经网络的一个脆弱性&…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 10月3日,星期四

每天一分钟,知晓天下事! 2024年10月3日 星期四 农历九月初一 1、 应急管理部:10月华北东南部等部分地区洪涝和风雹灾害风险较高,可能有1-2个台风登陆或明显影响我国。 2、 中国海警舰艇首次进入北冰洋,与俄海警展开联…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景: 2.字符串函数 字符串函数使用场景: 3.数学函数 4.控制流函数 1.日期函数 函数示例: 1.在日期的基础上加日期 在该日期下,加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

C#知识|基于反射和接口实现抽象工厂设计模式

哈喽,你好啊,我是雷工! 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中; 02 抽象工厂组成 抽象工厂包括抽象产品(即业务接口,可以通过抽象类或抽象接口设计)…

C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 前面说过纹理贴图能够大幅提升游戏画面质量,但纹理贴图是没有叠加的。在一些游戏场景中,要求将非常不同的多个纹理(如泥泞的褐色地面、绿草植密布的地面、碎石遍布的地面)叠加(混合)起来显示,实现纹理间能…

基于微信的乐室预约小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

信息安全工程师(24)网络安全体系建设原则与安全策略

一、网络安全体系建设原则 网络空间主权原则:维护网络空间主权是网络安全的首要原则。这要求国家在网络空间的管理、运营、建设和使用等方面具有完全自主的权利和地位,不受任何外部势力的干涉和侵犯。网络安全与信息化发展并重原则:网络安全与…

影视cms泛目录用什么程序?苹果cms二次开发泛目录插件

影视CMS泛目录一般使用的程序有很多种,(maccmscn)以下是其中几种常见的程序: WordPress:WordPress是一个非常流行的开源内容管理系统,可以通过安装一些插件来实现影视CMS泛目录功能。其中,一款常…

Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

vulnhub-Replay 1靶机

vulnhub:https://www.vulnhub.com/entry/replay-1,278/ 导入靶机,放在kali同网段,扫描 靶机在192.168.81.8,扫描端口 开启了三个端口,存在网站服务,访问 网页上有个超链接,点击后下载了这样一个…

Python开发环境配置(mac M2)

1. 前言 作为一名程序员,工作中需要使用Python进行编程,甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python,如何给Pycharm(IDE)配置对应的interpreter等,都成为一个 “不熟练工” 的难…

Docker版MKVtoolnix的安装及中文显示

本文是应网友 kkkhi 要求折腾的,只研究了 MKVtoolnix 的安装及中文显示,未涉及到软件的使用; 什么是 MKVtoolnix ? MKVToolnix 是一款功能强大的多媒体处理工具,用于在 Linux、其他 Unix 系统和 Windows 上创建、修改和…