Linux 五种IO模型

注:还有一种信号驱动IO,使用较少暂不讨论;

一,区分阻塞、非阻塞和同步、异步


看了很多文章对这两组概念解释和对比,说的太复杂了,其实没必要,两句话就能说清楚。
首先,对于读数据recv或read(写数据同理),分两个阶段
  1. 等待数据可读;
  2. 系统调用讲数据从内核拷贝到用户空间;
然后,对比两组概念:
  • 阻塞、非阻塞是对于等待数据可读、可写时,是否死等,即看第一阶段;
  • 同步、异步是对于数据在用户空间和内核传递时,是否等待完成,即看第二阶段;
可以得出结论:阻塞IO、非阻塞IO、多路复用都属于同步IO,区别于异步IO

二,关于多路复用


  • 多路复用介绍参考:万字图解| 深入揭秘IO多路复用-腾讯云开发者社区-腾讯云;
  • IO 多路复用的复用指的是复用线程,而不是IO连接,目的是让少量线程能够处理多个IO连接和读写;
  • 多路复用有两个会阻塞的阶段:第一阶段阻塞在select、epoll等系统调用,第二阶段阻塞在数据拷贝;
  • 多路复用首先是同步IO,但是阻塞还是非阻塞不同文章说法不一,如果从第一阶段是否卡住死等数据就绪来看,是阻塞IO
  • 注意区分系统调用(如select、epoll)的阻塞和socket本身的阻塞,一般来说使用select、epoll是需要将socket设置为非阻塞的,因为有时返回socket可读但执行recv时发现并没数据,如果阻塞就会卡住;再者避免由于一个FD的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。参考:使用epoll时需要将socket设为非阻塞吗?-腾讯云开发者社区-腾讯云

三,区分原生Socket的非阻塞和NIO


  • 原生Socket在创建的时候也可以指定为阻塞或非阻塞模式(区别只在第一个等待数据的阶段,第二个阶段调用recv拷贝数据都是一样的)。原生非阻塞Socket编程较复杂,比如可能需要循环判断send和recv的数据量是否完整,故一般不会轻易挑战。
  • 原生Socket也是可以编程实现多路复用的,参考:SOCKET编程与复用 | YuYoung's Blog
  • NIO底层实现也是操作的原生Socket,可以看作是对以上两点的包装,对使用者更友好。
=====================
点关注,不迷路,有缘再见!

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

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

相关文章

探索监管沙箱在金融科技行业中的应用

一、引言 随着金融科技的快速发展,传统金融机构与科技企业之间的竞争也日趋激烈。为了平衡金融科技创新与风险防控,各国监管机构纷纷引入监管沙箱(Regulatory Sandbox)机制。监管沙箱作为一个受监督的安全测试区,允许金…

在超线程CPU上切换到另一个线程

在超线程CPU上切换到另一个线程,主要涉及到的是上下文切换的过程。超线程技术允许单个CPU核心同时执行多个线程,提高了CPU的并行计算效率。当需要从一个线程切换到另一个线程时,CPU会进行一系列的操作来确保线程之间的顺利切换。 首先&#…

Linux字节对齐小程序

#include <stdio.h> // 默认对齐 struct DefaultAligned { char c; int i; }; // 按1字节对齐 #pragma pack(push, 1) struct OneByteAligned { char c; int i; }; #pragma pack(pop) // 恢复之前的对齐设置 int mai…

linux基础 - 内核的基础概念

目录 零. 前言 一. 源码简介 二. 存储管理 物理内存管理&#xff1a; 虚拟内存管理&#xff1a; 内存分配与回收&#xff1a; 三. CPU 和进程管理 进程管理&#xff1a; CPU 管理&#xff1a; 四. 文件系统 文件系统的概念 常见的 Linux 文件系统类型 文件系统的工…

Python日志管理利器:如何高效管理平台日志

一、为什么需要日志管理&#xff1f; 日志是应用程序的重要组成部分&#xff0c;它记录了应用程序的运行状态、错误信息以及用户交互等关键信息。良好的日志管理可以帮助开发人员及时发现和解决问题&#xff0c;提高应用程序的稳定性和可靠性。 项目在本地开发调试时&#xf…

Redis 有序集合(sorted set)

Redis 有序集合(sorted set) 引言 Redis&#xff0c;作为一个高性能的键值对数据库&#xff0c;提供了多种数据结构来满足不同的需求。其中&#xff0c;有序集合&#xff08;sorted set&#xff09;是一种特别的数据结构&#xff0c;它不仅具有集合&#xff08;set&#xff0…

CSS 计数器

CSS 计数器 CSS 计数器是 CSS 中一个强大但经常被忽视的功能。它们允许开发者创建和管理计数器,这些计数器可以在文档中自动递增,非常适合用于编号章节、列表项或其他文档元素。在本文中,我们将深入探讨 CSS 计数器的使用方法、优势和实际应用场景。 CSS 计数器的基本概念…

基于Sringboot+Vue的校园招聘系统【原创】【开源】

浏览器&#xff1a;Chrome或360浏览器 系统环境配置 前置条件&#xff1a;系统已经安装了Mysql5.7、Mysql工具&#xff08;Navicat&#xff09;、JDK1.8、Maven3.6.1、vue3.0以下开发环境、 Intellij Idea、 Chrome或360浏览器 1、导入数据库 2、编译前端代码vue 编译&…

C++笔记之通过CMakeLists.txt像使用boost库一样使用qt库中特有的模块来方便开发

C++笔记之通过CMakeLists.txt像使用boost库一样使用qt库中特有的模块来方便开发 code review! 文章目录 C++笔记之通过CMakeLists.txt像使用boost库一样使用qt库中特有的模块来方便开发1.文件结构2.CMakeLists.txt3.main.cpp4.运行1.文件结构 . ├── CMakeLists.txt └──…

设计模式--动态代理

动态代理是 Java 中一种常见的设计模式&#xff0c;它允许在运行时创建一个实现一组接口的代理类对象。Java 提供了 java.lang.reflect 包来支持动态代理的实现。在 JDK 中&#xff0c;可以使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来创建动…

Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南

文章目录 在Tez上优化Hive查询的指南调优指南理解Tez中的并行化理解mapper数量理解reducer数量 并发案例1&#xff1a;未指定队列名称案例2&#xff1a;指定队列名称并发的指南/建议 容器复用和预热容器容器复用预热容器 一般Tez调优参数 在Tez上优化Hive查询的指南 在Tez上优…

golang中的corn

引包 "github.com/robfig/cron/v3"使用 taskCron : cron.New(cron.WithSeconds()) _, err : taskCron.AddFunc("* * * * * *", func() {doing.work})每一个*的含义 秒&#xff08;Seconds&#xff09; 是 0–59 * / , - 分&#xff08;Minutes&#xff…

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

森林火灾扑救特类车辆有哪些_鼎跃安全

森林消防是在森林火灾发生时&#xff0c;为了保护森林资源&#xff0c;防止火势蔓延&#xff0c;采取了一系列的应用措施&#xff0c;针对自然环境中的火灾消防工作。森林灭火主要包括预警、预防措施、火情监测、火势控制和灭火等&#xff0c;森林火灾发生的地形往往复杂崎岖&a…

如何判断自己遇到的攻击是SQL注入攻击

要判断自己遇到的攻击是否是SQL注入攻击&#xff0c;可以从以下几个方面进行观察和分析&#xff1a; 攻击方式识别&#xff1a; 观察输入字段&#xff1a;如果攻击者在输入字段&#xff08;如用户名、密码框&#xff09;中输入了非正常的字符或语句&#xff0c;特别是与SQL语法…

【银河麒麟】高可用触发服务器异常重启,处理机制详解

1.服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 126G 【内核版本】 4.19.90-25.16.v2101.ky10.x86_64 【银河麒麟操作系统镜像版本】 Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619 Kylin-HA-10-SP2-Release-S…

NGINX_七 nginx 高级应用

七 nginx 高级应用 1 使用alias实现虚拟目录 location /test { # /var/www/qianfeng/index.htmlalias /var/www/qianfeng/;index index.html; }location /test { #/var/www/qianfeng/test/index.htmlroot /var/www/qianfeng/;index index.html; }2 通过 stub_status 模…

yolov10打包为exe

一、前言 本节实验将官方yolov10推理程序打包为exe运行 二、代码 首先下载官方代码至本机&#xff0c;并使用conda创建虚拟环境&#xff0c;并安装好yolov10所需库 conda create --prefix E:/pyenv/myYolo10 python3.8 pip install -r requirements.txt 下载官方模型权重 …

深入理解和实现Windows进程间通信(消息队列)

常见的进程间通信方法 常见的进程间通信方法有&#xff1a; 管道&#xff08;Pipe&#xff09;消息队列共享内存信号量套接字 下面&#xff0c;我们将详细介绍消息队列的原理以及具体实现。 什么是消息队列&#xff1f; Windows操作系统使用消息机制来促进应用程序与操作系…

Git 查看当前分支是基于哪个分支拉取(源头分支)

场景&#xff1a; 项目中使用 Git 管理代码仓库的时候&#xff0c;随着项目的持续迭代及项目的扩展&#xff0c;多版本并行开发是非常常见的事情&#xff0c;多版本并行开发就伴随着多分支&#xff0c;随着 Git 的分支越拉越多&#xff0c;这时候很容易造成分支的混乱&#xf…