linux的网络IO驱动模型

应用程序需要等待内核将数据从套接字缓冲区中复制到进程空间

当应用程序从套接字接收数据时,数据首先被复制到内核的套接字接收缓冲区中。然后,当应用程序调用类似于 read() 系统调用时,内核会将数据从套接字接收缓冲区复制到相应的应用程序的进程空间中。

网络 I/O 模型确实是根据数据在网络缓冲区和进程空间之间传输的具体步骤来划分的

阻塞 I/O

在阻塞 I/O 模型中,应用程序在进行 I/O 操作(read)时会被阻塞,直到数据从网络缓冲区复制到进程空间完成,内核返回响应。这意味着应用程序在等待 I/O 操作完成时无法执行其他任务。(会让出cpu)

非阻塞 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 操作后立即返回,并在数据传输完成时收到通知。这种模型通常需要操作系统或硬件设备的支持。

select()、poll() 和 epoll() 都是用于实现 I/O 多路复用的系统调用

select() 和 poll() 是阻塞的轮询文件描述符的方式来实现 I/O 多路复用的。

对于 select() 和 poll(),内核会在等待过程中阻塞,直到其中一个或多个监视的文件描述符上发生了 I/O 事件。

在没有事件发生时,应用程序仍然会被阻塞,而且需要周期性地轮询所有监视的文件描述符

epoll() 采用了事件驱动的方式,在有事件发生时立即通知应用程序,而不需要应用程序进行轮询。

对于 epoll(),内核会立即返回,并允许应用程序继续执行其他任务。当其中一个或多个文件描述符上发生了 I/O 事件时,内核会通知应用程序。

相关推荐
学长毕设17 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw19 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号19 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场20 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠20 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David21 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放21 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog21 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261351 天前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长1 天前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节