【编程基础知识】网络I/O模型详解:从阻塞到异步
引言
网络I/O模型是网络编程的核心,它们决定了应用程序如何进行读写操作以与网络进行数据交换。了解不同的网络I/O模型对于设计高效、可扩展的网络应用程序至关重要。
一、阻塞I/O(Blocking I/O)
1. 定义
- 阻塞调用:当应用程序执行I/O操作时,如果数据没有准备好,调用会阻塞,直到数据到达或操作完成。
2. 适用场景
- 简单客户端/服务端:适用于简单的程序,但扩展性较差。
3. 缺点
- 线程限制:每个连接都需要一个独立的线程或进程。
流程图:阻塞I/O
二、非阻塞I/O(Non-blocking I/O)
1. 定义
- 非阻塞调用:允许应用程序在数据未准备好时不必等待,可以继续执行其他任务。
2. 实现方式
- 轮询检查:应用程序需要定期检查I/O操作是否完成。
3. 适用场景
- 高并发:适用于高并发场景,但编程复杂度较高。
流程图:非阻塞I/O
三、I/O复用(I/O Multiplexing)
1. 定义
- 多路监控:使用select、poll或epoll等系统调用来监控多个I/O流。
2. 工作机制
- 事件通知:当其中一个I/O流有数据可读或可写时,系统调用返回。
3. 适用场景
- 多连接管理:适用于在单个线程内管理多个连接。
流程图:I/O复用
四、事件驱动I/O(Event-driven I/O)
1. 定义
- 异步I/O:应用程序将I/O请求交给操作系统,然后立即返回。
2. 事件通知
- 操作系统通知:当I/O操作完成时,操作系统会通知应用程序进行处理。
3. 适用场景
- 高性能服务器:适用于构建高性能的网络服务器。
流程图:事件驱动I/O
五、信号驱动I/O(Signal-driven I/O)
1. 定义
- 信号通知:使用信号机制来通知应用程序I/O操作的完成。
2. 实现方式
- 信号处理:应用程序通过设置信号处理函数来响应I/O操作的完成。
流程图:信号驱动I/O
六、多路复用I/O(Multiplexed I/O)
1. 定义
- 高效多路复用:使用epoll这样的高效多路复用技术。
2. 优势
- 性能和可扩展性:特别是在处理大量并发连接时。
流程图:多路复用I/O
七、异步I/O(Asynchronous I/O, aio)
1. 定义
- 异步操作:应用程序在发起I/O请求后立即返回,操作系统会在I/O操作完成后通知应用程序。
2. 优势
- 高并发性:允许应用程序在等待I/O操作完成时继续执行其他任务。
流程图:异步I/O
八、内存映射文件I/O(Memory-mapped I/O)
1. 定义
- 内存映射:将文件或设备映射到内存地址空间,应用程序可以像访问普通内存一样对文件进行操作。
2. 优势
- 性能提升:提高文件I/O的性能。
流程图:内存映射文件I/O
九、线程池(Thread Pool)
1. 定义
- 预先创建线程:通过预先创建一定数量的线程来处理I/O任务。
2. 优势
- 减少开销:避免了频繁创建和销毁线程的开销。
流程图:线程池
十、事件循环(Event Loop)
1. 定义
- 事件处理核心:在事件驱动和异步I/O模型中,事件循环是处理I/O事件的核心机制。
2. 工作机制
- 循环等待和处理:应用程序在一个循环中等待和处理各种事件。
流程图:事件循环
总结
每种I/O模型都有其适用场景和优缺点。选择合适的I/O模型可以显著提高网络应用程序的性能和可扩展性。随着现代操作系统和编程语言的发展,开发者可以选择更多高效的方式来处理网络I/O。
汇总表格
| I/O模型 | 描述 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 阻塞I/O | 调用阻塞,直到数据到达 | 简单客户端/服务端 | 简单易用 | 扩展性差 |
| 非阻塞I/O | 应用程序不必等待 | 高并发场景 | 编程复杂度较高 | 需要轮询检查 |
| I/O复用 | 使用select、poll、epoll监控I/O流 | 多连接管理 | 比阻塞I/O高效 | 需要在数据到达时处理I/O操作 |
| 事件驱动I/O | 异步I/O,操作系统通知 | 高性能服务器 | 适用于高性能服务器 | 编程模型复杂 |
| 信号驱动I/O | 使用信号机制通知 | 高并发网络服务 | 响应速度快 | 实现复杂 |
| 多路复用I/O | 使用epoll等技术 | 大量并发连接 | 性能和可扩展性好 | 技术复杂 |
| 异步I/O | 操作系统完成后通知 | 高并发网络服务 | 最高并发性 | 编程模型复杂 |
| 内存映射文件I/O | 映射文件到内存地址空间 | 文件访问 | 性能提升 | 通常用于文件而非网络I/O |
| 线程池 | 预先创建线程处理I/O任务 | 高效I/O操作 | 减少线程创建和销毁开销 | 需要管理线程 |
| 事件循环 | 处理I/O事件的核心机制 | 事件驱动和异步I/ |
相关文章:
【编程基础知识】网络I/O模型详解:从阻塞到异步
引言 网络I/O模型是网络编程的核心,它们决定了应用程序如何进行读写操作以与网络进行数据交换。了解不同的网络I/O模型对于设计高效、可扩展的网络应用程序至关重要。 一、阻塞I/O(Blocking I/O) 1. 定义 阻塞调用:当应用程序…...
yolo自动化项目实例解析(六)自建UI(主窗口、预览窗口)
前面我们大致把各个代码块梳理出来了,但是还是不知道从那块开始,我们这里主要先通过ui页面的元素去推理整个执行过程,我们首先需要知道ui功能里面有那些组件 qt设计师基础控件 Qt Designer 是一个图形界面设计工具,用于创建 Qt 应…...
Unity优质教程分类汇总 【持续更新中】
以下收录的均为作者自己看过的觉得比较好的教程 基础 Unity入门: https://www.bilibili.com/video/BV1HX4y1V71E?p13 生命周期 https://docs.unity.cn/cn/2022.3/uploads/Main/monobehaviour_flowchart.svg https://zhuanlan.zhihu.com/p/551294000 编程技巧…...
真正掌握left join on 和 where 的差别
总结 用 where 是先连接然后再筛选用 on 是先筛选再连接数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下: on条件是在生成临时表…...
神经网络在多分类问题中的应用
作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~个人主页:小高要坚强的博客当前专栏:Python之机器学习本文内容:神经网络在多分类问题中的应用作者“三要”格言:要坚强、要努力、要学习 目录 1. 引言 2.数据构造 3.划分数据集 4.神经网络实现多…...
nginx的安装和使用
源码安装 1.环境准备:卸载其他方式安装的web应用,防止端口冲突 2.下载nginx源码包 wget https://nginx.org/download/nginx-1.20.2.tar.gz 3.源码编译安装 yum install -y gcc pcre-devel zlib-devel #安装依赖包 useradd -M -s /sbin/nologin ngi…...
js采用覆盖键、覆盖鼠标滑动事件实现禁止网页通过 ctrl + +/- 和 ctrl + 滚轮 对页面进行缩放
一、兼容电脑端的禁止通过 ctrl /- 和 ctrl 滚轮 对页面进行缩放 const keyCodeMap {// 91: true, // command61: true,107: true, // 数字键盘 109: true, // 数字键盘 -173: true, // 火狐 - 号187: true, // 189: true, // -};二、覆盖ctrl||command ‘’/‘-’ // 覆…...
某客户Oracle RAC无法启动故障快速解决
某日,9:50左右接到好友协助需求,某个客户Oracle RAC无法启动,并发过来一个报错截图,如下: 和客户维护人员对接后,远程登录服务端进行故障分析。 查看hosts信息,首先进行心跳测试,测…...
【计算机网络 - 基础问题】每日 3 题(二十八)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
探索甘肃非遗:Spring Boot网站开发案例
1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…...
产品管理- 互联网产品(6):产品测试
可用性测试 招募有代表性用户作为测试代表参与者,评估某产品符合特定可用性及符合程度。以具有代表性的用户为测试样本。 测试中多关注用户表情与动作。多鼓励与测试的用户更多的操作以用户角度发现问题。同时要做好询问工作,耐心聆听用户的意见&#x…...
奖金高达 110 万元,Spatial Joy 2024 全球 AR 应用开发大赛启动
今年是AR应用开发大赛第三届,恰逢Rokid成立十周年,我们推出全新的大赛品牌“Spatial Joy”,引领开发者享受开发乐趣,为其打造充满挑战和惊喜的开发之旅,逐渐成为空间计算时代全球最大AR应用开发大赛。回顾大赛发展&…...
git add成功后忘记commit的文件丢了?
本文目标:开发人员,在了解git fsck命令用法的条件下,进行git add成功但由于误操作导致丢失的文件找回,达到找回丢失文件的程度。 文章目录 1 痛点2 解决方案3 总结/练习 1 痛点 开发过程中,分支太多(基线分…...
Python Web 开发中的DevOps 实践与自动化运维
Python Web 开发中的DevOps 实践与自动化运维 📚 目录 🔧 基础设施即代码(IaC) 使用 Terraform、AWS CloudFormation 实现基础设施即代码使用 Python 进行云服务资源的管理与自动化配置编写和部署基础设施的自动化脚本 …...
探索私有化聊天软件:即时通讯与音视频技术的结合
在数字化转型的浪潮中,企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信,作为音视频通信技术的佼佼者,凭借其强大的即时通讯与音视频SDK(软件开发工具包)结合能力,为企业量身打造了私有化聊天…...
性能调优知识点(mysql)三
SQL底层执行原理 MySQL的内部组件结构:大体来说,MySQL 可以分为 Server 层和存储引擎层store两部分 Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数…...
TinyWebSever项目面试题整理
TinyWebSever项目面试题整理 1.为什么要做这样一个项目? 满足高并发和高性能需求:现代Web应用面对大量用户,Web服务器需要高效处理并发连接。比如通过线程池、非阻塞I/O、事件驱动机制(如epoll),Web服务器…...
维修保养记录接口-维修保养记录API-汽车接口
维修保养记录接口的使用主要涉及到API对接和在线查询两种方式。以下是详细的使用步骤和注意事项: 一、API对接 注册与申请: 首先,你需要在提供维修保养记录接口的平台(如挖数据平台、第三方数据服务商等)进行注册&…...
基于 RealSense D435相机实现手部姿态检测
基于 RealSense D435i相机进行手部姿态检测,其中采用 Mediapipe 进行手部检测,以下是详细步骤: Mediapipe 是一个由 Google开发的开源框架,专门用于构建多媒体处理管道,特别是计算机视觉和机器学习任务。它提供了一系列…...
linux 下mailx 的使用。发送短信
1. 安装 mailx yum install -y mailx 2.请求数字证书 163 邮箱 mkdir -p /root/.certs/ ####创建目录,用来存放证书 echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne /-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p >…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
