【Linux网络编程】高级I/O

目录

五种I/O模型

阻塞和非阻塞

非阻塞I/O

I/O多路复用之Select、Poll、与Epoll


本文目的是深入浅出理解高级I/O相关的知识,结尾附上代码加深理解相关知识。

五种I/O模型

1.阻塞I/O:在内核将数据准备好之前,系统调用会一直等待。所有的套接字默认都是阻塞方式。

2.非阻塞I/O:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。非阻塞I/O往往需要程序员利用循环的方式反复尝试读写文件描述符,这个过程称为轮询。这对cpu来说是较大的浪费,一般只有特定场景下才使用。

3.信号驱动I/O:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行I/O操作。

4.I/O多路转接:同时等待多个文件描述符的就绪状态。

5.异步I/O:由内核在数据拷贝给用户空间完成时,通知应用程序处理(这里和信号驱动I/O不同,信号驱动是通知应用程序何时可以开始拷贝数据)。所以异步是最偷懒的,只需要等待数据到来就可以,并不需要等待数据就绪,也不用拷贝,操作系统就帮上层做了。

总结:任何I/O过程中,都包含两个步骤,一是等待,二是拷贝。并且在实际的应用场景中,等待消耗的时间往往都远远高于拷贝的时间。为了让I/O更高效,最核心的办法就是让等待时间尽量少。

阻塞和非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。

非阻塞调用指在不能立即得到结果之前,该调用不会阻塞当前线程。

非阻塞I/O

fcntl函数

fcntl函数有五种功能:
1.复制一个现有的描述符(cmd=F_DUPFD)
2.获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
3.获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)
4.获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
5.获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)
我们此处只是用第三种功能 , 获取 / 设置文件状态标记 , 就可以将一个文件描述符设置为非阻塞。

下面是关于fcntl函数的代码: 因为放在这里有点长不太好看,我单独弄了一篇文章。

fcntl函数 非阻塞轮询_小鳄鱼爱吃薯片的博客-CSDN博客

I/O多路复用之Select、Poll、与Epoll

为了防止文章冗余,下面省略了select、poll的代码并附有链接。

Select:Select简易代码

Poll:Poll简易代码 

Epoll:

Select、Poll、Epoll的优缺点

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

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

相关文章

设计模式(5)-使用设计模式实现简易版springIoc

自定义简易版springIoc 1 spring使用回顾 自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。 数据访问层。定义UserDao接口及其子实现类 public interface UserDao {public void add(); }public…

mysql8创建用户并授予所有库的所有权限

要在 MySQL 8 中创建用户并授予所有库的所有权限,您可以按照以下步骤进行操作。请注意,为了执行这些操作,您需要具有足够权限的 MySQL 用户帐户。 登录到 MySQL 服务器: 使用具有足够权限的 MySQL 用户名和密码登录到 MySQL 服务器。您可以使…

CGO集成wireshark4.2.0动态链接库新错误col_set_cls_time: assertion “not reached“ failed

CGO集成wireshark4.2.0动态链接库新错误col_set_cls_time: assertion "not reached" failed 1.版本环境2.问题3.解决过程 1.版本环境 wireshark4.2.0golang1.21mac m1 和 ubuntu22 2.问题 在cgo调用wireshark进行协议解析时候遇到错误: ** (PID:73155…

django建站过程(5)添加导入导出功能

django建站过程(5)添加导入导出功能 后端添加导入导出功能django-import-export参考官方:安装命令settings.py添加到INSTALLED_APPS创建一个resource.py**配置Admin**定义导入导出的字段其他 后端添加导入导出功能 django-import-export 参…

基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码

基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于静电放电优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

Vue中给对象添加新属性时,界面不刷新怎么办?

文章目录 前言直接添加属性的问题原理分析解决方案总结后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:vue.js 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现…

微信个人号api

简要描述: 登录E云平台 请求URL: http://域名地址/member/login域名地址开发者账号密码:后台系统自助开通 请求方式: POST 请求头Headers: Content-Type:application/json 参数: 参数名必选类型说…

​如何使用ArcGIS Pro制作渐变河流效果

对于面要素的河流水系,制作渐变效果方法比较简单,如果是线要素的河流有办法制作渐变效果吗,答案是肯定的,这里为大家介绍一下制作方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的水系数…

quarkus的一些注解1

path 用于指定一个类或者方法的URL路径前缀。 Inject 将一个依赖注入到一个类或方法中 Get 用于指定一个处理HTTP GET请求 Produce 注解用于指定一个方法返回的内容类型。例如,Produces(MediaType.TEXT_PLAIN) 表示该方法返回一个纯文本类型的内容 QuarkusIn…

利用WebSocket +MQ发送紧急订单消息,并在客户端收到消息的用户的页面自动刷新列表

背景:在原有通知公告的基础上,把通知公共的推送服务修改为其他业务收到紧急订单发送公告到消息队列MQ,然后在js中创建一个socket去监听公告,收到公告后刷新所有在订单页面的用户的页面列表(重点就是用户在收到紧急订单…

《网络协议》07. 其他协议

title: 《网络协议》07. 其他协议 date: 2022-10-07 18:24:02 updated: 2023-11-15 08:00:52 categories: 学习记录:网络协议 excerpt: IPv6、WebSocket、WebService(SOAP,WSDL)、HTTPDNS、FTP、邮件(SMTP,…

基于单片机的温度控制器系统设计

**单片机设计介绍, 基于单片机的温度控制器系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的温度控制器系统是一种利用单片机来检测环境温度并控制温度的系统。它通常由以下几个部分组成&#xff…

CSDN每日一题学习训练——Python版(新浪微博热门话题、Z 字形变换)

版本说明 当前版本号[20231117]。 版本修改说明20231117初版 目录 文章目录 版本说明目录新浪微博热门话题题目解题思路代码思路参考代码 Z 字形变换题目解题思路代码思路参考代码 新浪微博热门话题 题目 ​ 新浪微博可以在发言中嵌入“话题”,即将发言中的话题…

Spring 设计模式-简洁版

Java 中包括以下设计模式: 其中Spring 用到的设计模式 1.简单工厂-BeanFactory 2.工厂方法FactoryBean 3.单例模式Bean实例 4.适配器模式SpringMVC中的HandlerAdatper 5.装饰器模式BeanWrapper 6.代理模式_AOP底层 7.观察者模式-spring的事件监听 8.策略横式exclud…

C#委托初步

委托可以很方便地实现对一个对象方法的扩展 PhotoFilters是一个类,有3个人方法: public void ApplyBrightness(Photo photo){Console.WriteLine("亮度增加");}public void ApplyContrast(Photo photo){Console.WriteLine("对比度增加&q…

【限时免费】20天拿下华为OD笔试之 【不定滑窗】2023B-字符串摘要【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路滑窗三问滑窗三答 代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个字符串的摘要算法,请输出给定字符串…

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

WPF如何实现应用程序托盘

在WPF中实现应用程序托盘图标和菜单功能通常需要使用System.Windows.Forms.NotifyIcon类,因为WPF本身并没有直接提供这样的控件。为了使用NotifyIcon,你需要添加对System.Windows.Forms的引用。以下是如何实现的步骤: 1. 添加对 System.Wind…

jedis连接redis

package com.wsd;import redis.clients.jedis.Jedis;import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties;public class Redis {public static void main(String[] args) {//读取properti…

Windows11 python3.12 安装pyqt6 pyqt6-tools

Windows11 python3.12 安装pyqt6比较容易,但pyqt6-tools一直安装不上去。出错信息如下: (venv) PS D:\python_project\pyqt6> pip install pyqt6-tools Collecting pyqt6-toolsUsing cached pyqt6_tools-6.4.2.3.3-py3-none-any.whl (29 kB) Collec…