libevent(3)IO模型基础知识

news2024/11/9 10:12:56

一、用户态和内核态

    我们知道现在的操作系统是分层的,内核封装了与底层的接口,通过系统调用提供给上层应用使用。 当进程运行在内核空间时,它就处于内核态;当进程运行在用户空间时,它就处于用户态。

    当我们需要进行IO操作时,如读写硬盘文件、读写网卡数据等,进程需要切换到内核态。一般情况下,应用不能直接操作内核空间的数据,需要把内核态的数据拷贝到用户空间才能操作。

    应用程序向操作系统发出IO请求:应用程序发出IO请求给操作系统内核,操作系统内核需要等待数据就绪,这里的数据可能来自别的应用程序或者网络。 一般来说,一个IO分为两个阶段:

    先读取到内核缓存,等待数据准备好。再读取到用户进程,将数据从内核读取到用户空间。

    1、等待数据: 数据可能来自其他应用程序或者网络,如果没有数据,应用程序就阻塞等待。

    2、拷贝数据: 将就绪的数据拷贝到应用程序工作区。

    在Linux系统中,操作系统的IO操作是一个系统调用recvfrom(),即一个系统调用recvfrom包含两步,等待数据就绪和拷贝数据。

二、2个容易混淆的概念

1、阻塞与非阻塞

    阻塞和非阻塞是针对进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式。
(1)阻塞指的是当试图对该文件描述符进行读写时,如果当时没有东西可读,或暂时不可写,程序就进入等待状态,直到有东西可读或可写为止。 比如我们去窗口办事的时候,发现工作人员碰巧不在,然后我们就在原地等待,一直等到工作人员回来为止。
(2)非阻塞指的是如果没有东西可读,或不可写,读写函数马上返回,而不会等待。 去银行办业务时,领取一张小票,之后我们可以去干其他的事情,当轮到我们时,银行会通知,这时候我们就可以去办业务了。

2、同步与异步

    同步和异步是针对应用程序和内核的交互而言的。
(1)同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。 例如:自己亲自干这件事,别的事干不了。
(2)异步指的是用户进程触发IO操作以后便开始做其他的事情,而当IO操作已经完成的时候会得到IO完成的通知。 例如:告诉朋友自己合适衣服的尺寸、颜色、款式,委托朋友去买,然后自己可以去干别的事。(使用异步I/O时,将I/O读写委托给OS处理,需要将数据缓冲区地址和大小传给OS)。

三、IO模型

1、同步阻塞(同步IO)

 在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当IO操作完成之后,用户进程才能运行。 

2、同步非阻塞(同步IO)

在此种方式下,用户进程发起一个IO操作以后就可返回做其它事情,但是用户进程需要时不时地询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引起不必要的CPU资源浪费。 

3、多路复用(同步IO)

多路复用中,通过select函数,可以同时监听多个IO请求的内核操作,只要有任意一个IO的内核操作就绪,就可以通知select函数返回,再进行系统调用recvfrom()完成IO操作。

我们通常所说的select,epoll就是这种方式。多路复用中,通过select函数,可以同时监听多个IO请求的内核操作,只要有任意一个IO的内核操作就绪,都可以通知select函数返回,再进行系统调用recvfrom()完成IO操作。

注意:
    当一个服务器 在处理多个客户时,绝对不能阻塞于单个客户相关的系统函数调用。否则导致服务器端程序被挂起,不能为其它客户提供服务。解决方法如下: 
(1)使用非阻塞式I/O。

(2)对每个客户有单独的控制进程提供服务。

(3)对每个I/O操作设置一个超时。 

4、信号驱动IO(同步IO)

应用程序发起IO请求时,可以给IO请求注册一个信号函数,请求立即返回,操作系统底层则处于等待状态(等待数据就绪),直到数据就绪,然后通过信号通知主调程序,主调程序才去调用系统函数recvfrom()完成IO操作。

信号驱动IO的特点:

(1)相比前面的非阻塞式IO模型,信号驱动式IO模型不需要轮询检查底层IO数据是否就绪,而是被动接收信号,然后再调用recvfrom执行IO操作。

 (2)相比多路复用IO模型来说,信号驱动IO模型针对的是一个IO的完成过程, 而多路复用IO模型针对的是多个IO同时进行时候的场景。

注意:

(1)对于TCP套接字:信号驱动式IO不适合处理TCP套接字,因为信号产生的过与频繁,在TCP中,连接请求完成、断开连接发起、断开连接完成、数据到达、数据送走。。。都会产生SIGIO。但是我们真正只需要它在数据到达或者数据送走的时候才产生信号。 
(2)对于UDP套接字:SIGIO信号在数据报到达套接字以及套接字上发生异步错误才会发生。(UDP套接字推荐使用)。 

5、异步IO

    异步IO将整个IO操作(包括等待数据就绪,复制数据到应用程序工作空间)全都交给操作系统完成。 数据就绪后操作系统将数据拷贝进应用程序运行空间之后,操作系统再通知应用程序,这个过程中应用程序不需要阻塞。

 四、IO模型对比

举一个现实生活中的例子:
如果你想吃饭。
同步阻塞:你到饭馆点餐,然后在那儿等着,还要一直喊:好了没啊!
同步非阻塞:在饭馆点完餐,就去遛狗了。不过遛一会儿,就回饭馆喊一声:好了没啊!
多路复用:在多个饭馆点餐,然后查看哪家饭馆先做好,谁先做好就吃谁的。
信号驱动:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。
异步非阻塞:饭馆打电话说,我们知道您的位置,一会儿给你送过来,安心遛狗就可以了。

五:总结

(1)阻塞、非阻塞、多路IO复用,都是同步IO。
(2)异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。
(3)真正的异步IO需要CPU的深度参与。 换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行,全部都交给CPU去完成,而只需要等待一个完成信号的时候,才是真正的异步IO。 所以,fork子线程去轮询、死循环或者使用select、poll、epoll,都不是异步。
(4)阻塞方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
(5)非阻塞方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
(6)异步方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

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

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

相关文章

【小沐学Python】网络爬虫之requests

文章目录 1、简介2、requests方法2.1 get2.2 post 3、requests响应信息4、requests的get方法4.1 url4.2 headers4.3 params4.4 proxies4.5 verify4.6 timeout4.7 cookies4.8 身份验证 3、测试代码3.1 获取网页HTML(get)3.2 获取网页HTML(带he…

【LeetCode热题100】打卡第26天:最大矩形

文章目录 最大矩形⛅前言🔒题目🔑题解 最大矩形 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数…

随着ChatGPT、文言一心的大火,未来可能的生活工作方式

前面的文章笼统的扯了一些ChatGPT、文言一心的差异化,感觉还是不够明白直观。特地找了一份资料,通过基础能力、进阶能力、和一些垂直领域的几百个各种问题,来对比分析两者的回答情况,让大家可以有个更接地气的了解。 由于问题太多…

无限脉动:释放音乐和区块链在音乐领域的力量

音乐是一种永恒的通用语言,它将人们聚集在一起,超越了边界,在我们灵魂深处产生共鸣,创造联系。在当今数字时代,随着区块链技术和去中心化网络的出现,音乐世界正在经历一场深刻的变革。 我们在与艺术家合作&…

动态规划 DP (二)

3.二维动态规划 1) 力扣https://leetcode.cn/problems/minimum-path-sum/第一行的的路径只与左边的元素有关,第一列的路径只与上面的元素有关。 除了第一行和第一列,其他元素的路径取决于左边和上面元素的最小值。 只要每次都选择值最小的路径&#…

2021电工杯数学建模B题解题思路(光伏建筑一体化板块指数发展趋势分析及预测)

目录 一、前言 二、问题背景 三、具体问题 四、解题思路 (一)整体思路 (二)问题一 (三)问题二 (四)问题三 (五)问题四 (六)…

2023最新谷粒商城笔记之秒杀服务篇(全文总共13万字,超详细)

秒杀服务 秒杀具有瞬间高并发的特点,针对这一特点,必须要做限流异步缓存(页面静态化)独立部署 限流方式: 前端限流,一些高并发的网站直接在前端页面开始限流,例如:小米的验证码设计Nginx 限流&#xff0c…

ChatGPT从入门到精通,深入认识Prompt

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定让ChatGPT帮你高效实现职场办公!行动起来吧1、ChatGPT从入门到精通,一站式掌握办公…

Unity 中的旋转、targetFrameRate、 vSyncCount、Time

1. 旋转: Unity 中的旋转用eulerAngle 表示,但在内部是以quaternion存储。欧拉角旋转围绕三个轴进行三次独立旋转,依次是z、x、y。To convert from Euler angles to quaternions, you can use the Quaternion.Euler function.To convert a q…

Linux 文件操作

文章目录 一、task_struct 和 file 的关系二、文件操作的系统调用三、进程默认打开的三个文件四、文件重定向五、Linux 下一切皆文件 文件是在磁盘上创建出来的,当我们想进行文件操作时,根据冯诺依曼体系结构,CPU 只和内存交互,为…

【裸机开发】Reset 中断服务函数(汇编实现)

目录 一、Reset 中断服务函数的实现步骤 二、汇编实现 Reset 中断服务函数 1、禁止/打开全局中断 2、设置SP指针 3、清除 .bss 段 4、完整 Reset 中断服务函数 一、Reset 中断服务函数的实现步骤 实现 Reset 中断服务函数的基本步骤如下: 设置各个模式下的S…

关联式容器set和map

文章目录 一.容器二.set的介绍1.insert2.lower_bound&&upper_bound3.find和countfindcount 三. multiset四.map最特别的operator[] 四.multimap,因为允许键值冗余,所以它没有operator[],它的find返回的是中序遍历第一次遇到的节点五.…

ChatGPT办公自动化实战

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公!行动起来吧 1、ChatGPT从入门到精通,一站式掌握办…

对象的销毁

析构函数 C 中的类可以定义一个特殊的清理函数 这个特殊的清理函数叫做析构函数析构函数的功能与构造函数相反 定义&#xff1a;~ClassName() 析构函数没有参数也没有返回值类型声明析构函数在对象销毁时自动被调用 析构函数使用初探 #include <stdio.h>class Test …

Threadlocal 必会的9个知识点

1.什么是ThreadLocal&#xff1f;它在多线程环境下有什么用处&#xff1f; ThreadLocal是在多线程环境下提供的一种简单的机制&#xff0c;使得每个线程都能拥有一个独立的变量副本。它避免了线程安全问题&#xff0c;并提高了程序的并发性能。 2.ThreadLocal是如何工作的&am…

规则引擎--规则逻辑形如“1 (2 | 3)“的抽象设计

目录 规则下逻辑表达和条件的抽象表达逻辑的编码和抽象 规则规则下的条件操作符抽象定义规则类规则执行表达式遍历进行操作符计算添加规则下一个具体条件的执行 规则执行完成后得到最后的结果 规则下逻辑表达和条件的抽象 对于任何一个规则&#xff0c;当然包括多个条件&#…

市面上最强PDF:GcPDF 6.1.4 Grapecity -Crack

适用于 .NET 6 的功能丰富的 PDF API 库 完全控制 PDF - 快速生成文档、提高内存效率且无依赖性。 在代码中生成、加载、编辑和保存 PDF 文档 支持多种语言的全文、段落格式和字体 使用新的编辑工具编辑 PDF 中的内容 支持数百种PDF功能 Windows、macOS 和 Linux 完全支持所有…

PhotoShop Beta(爱国版)安装教程-内置AI绘画功能

PS beta版安装教程 Window和Mac版都有&#xff0c;里面内置AI绘画功能 ps Beta版真的太爽了&#xff0c;今天来和大家分享下安装教程。 很多人拿这资料卖5块 9.9 19.9&#xff0c;球友们直接用&#xff0c;建议赶紧装&#xff0c;以免PS更新后&#xff0c;很多pojie程序没法用了…

ChatGPT数据分析与可视化实战

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公&#xff01;行动起来吧1、ChatGPT从入门到精通&#xff0c;一站式掌握办…

docker安装drone

目录 Drone简介docker安装drone创建Drone-server容器创建Drone-runner-docker容器 访问drone-server面板操作 Drone简介 Drone是基于GO语言开发的持续集成&#xff08;Continuous integration&#xff0c;CI&#xff09;引擎&#xff0c;它可以借助Docker容器技术&#xff0c;…