什么是阻塞IO和非阻塞IO

news2024/10/7 18:23:09

一、IO模型

五种:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、异步IO

1.阻塞IO:一个应用程序执行I/O操作时,会被阻塞,直到数据准备好或操作完成。这种模型通常简单易用,但会造成资源浪费。因为CPU在等待I/O操作完成时无法做其他有用的工作。

2.非阻塞IO模型:应用程序执行I/O操作时不会被阻塞,可以立即返回,然后定期检查操作是否完成。这种模型需要应用程序不断轮询状态,可能会降低性能并增加复杂性。

3.I/O复用模型:通过select、poll或epoll等机制,应用程序可以同时监视多个I/O事件,当其中任何一个事件就绪时才进行处理。这种模型避免了阻塞和循环轮询的缺点,提高了效率。

4.信号驱动I/O模型:应用程序告知内核去等待某个事件发生,并且可以同时进行其他操作。当事件发生时,内核发送信号通知应用程序进行处理。这种模型适用于处理少量的连接和事件。

5.异步I/O模型:应用程序发起一个 I/O 操作后,可以继续执行其他操作,当 I/O 操作完成时会通知应用程序。这种模型减少了应用程序与内核的交互次数,提高了性能。

二、IO多路复用(select、epoll、poll)

  • select 是 Unix 系统中最早的 I/O 多路复用技术。它允许一个线程同时监视多个文件描述符,并等待某个文件描述符上的 I/O 事件(如可读、可写或异常)。select 的主要问题是性能受限,特别是在处理大量文件描述符时。这是因为它使用一个位掩码来表示文件描述符集,每次调用都需要传递这个掩码,并在内核和用户空间之间进行复制。

  • poll 是对 select 的改进。它使用一个文件描述符数组而不是位掩码来表示文件描述符集。这样可以避免 select 中的性能问题。然而,poll 仍然需要遍历整个文件描述符数组,以检查每个文件描述符的状态。因此,在处理大量文件描述符时,性能仍然受限。

  • epoll 是 Linux 中的一种高性能 I/O 多路复用技术。它通过在内核中维护一个事件表来避免遍历文件描述符数组的性能问题。当某个文件描述符上的 I/O 事件发生时,内核会将该事件添加到事件表中。应用程序可以使用 epoll_wait 函数来获取已准备好的 I/O 事件,而无需遍历整个文件描述符集。这种方法大大提高了在大量并发连接下的性能。

三、NIO与IO的区别

NIO就是New IO,这个库是在jdk1.4中引入。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率较高。在JAVA API中提供了两套NIO,一套是针对标准输入输出NIO,另一套是网络编程NIO。

四、NIO和IO的适用场景

NIO是为了弥补传统IO的不足而诞生的,NIO也有缺点,因为NIO是面向缓冲区的操作,每一次的数据处理都是对缓冲区进行的,在数据处理之前必须要判断缓冲区的数据是否完整或者已经读取完毕,如果没有,假设只读取了一部分,那么对不完整的数据处理没有任何意义。所以每次数据处理之前都要检测缓冲区数据。

  • 如果需要管理同时打开成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,这时候用NIO处理数据。

  • 如果是少量连接,而这些连接每次要发送大量的数据,这时候采用IO更合适。

  • 使用哪种处理数据,需要再数据的响应等待时间和检查缓冲区数据的时间上作对比。

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

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

相关文章

为什么要学习扣子(Coze)

🧙‍♂️ 诸位好,吾乃斜杠君,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &#…

2024大模型如何学习【附学习资料】

摘要: 通过深入了解本文中的这些细节,并在实际项目中应用相关知识,将能够更好地理解和利用大模型的潜力,不仅在学术研究中,也在工程实践中。通过不断探索新方法、参与项目和保持热情,并将其应用于各种领域&…

【Spring框架全系列】SpringBoot_基础_先知(详细)

文章目录 1.SpringBoot介绍2.创建一个SpringBoot项目3.parent标签 - 父工程4.starter依赖5.启动类和文件打包6.默认配置 1.SpringBoot介绍 Spring阶段最困扰大家的事情是什么? 配置 → 配置魔鬼 快速搭建一个独立的生产级别的Spring应用 快速引入项目相关依赖 开箱…

开源!过程控制与自动化系统

软件介绍 ProviewR是一个基于GPL许可的过程控制与自动化系统,最初由瑞典的Mandator和SSAB Oxelsund开发。作为一个成熟、集成且低成本的自动化解决方案,ProviewR在以Linux作为操作系统的标准PC上运行。该系统包含了顺序控制、调整、数据采集、通信、监控…

16、matlab求导、求偏导、求定积分、不定积分、数值积分和数值二重积分

1、matlab求导,diff()函数 1)一阶导数 语法:diff(f(x)):求一阶导数 //diff(f(x),n):求n阶导数(n为具体正整数) 以函数(cos(x)sin(x)-x^2)的一阶导数为例 一阶导数代码: yms x;%声明符号变量x f(x)cos(…

开源网关Apache APISIX启用JWT身份验证

说明: 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先,确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”,VS Code打开文件夹,打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

ros2笔记

Ros2 hello world ccreate packagehelloworld.cpp hello world pythonhelloworld.py file explainros2 cmdcreatebuildfindruninstall interfacesmsg filesrv fileaction file Topic hello world c mkdir -p {your workspace name}/src cd {your workspace name} #进入工作空间…

【CTF-Web】文件上传漏洞学习笔记(ctfshow题目)

文件上传 文章目录 文件上传What is Upload-File?Upload-File In CTFWeb151考点:前端校验解题: Web152考点:后端校验要严密解题: Web153考点:后端校验 配置文件介绍解题: Web154考点&#xff1a…

【Java】static 修饰成员方法

static 修饰成员方法 简介 应用 static 修饰成员方法 1.static 修饰成员方法2.内存原理3.main函数4.类方法的应用 1.static 修饰成员方法 测试类: package suziguang_d2_staticdemo;public class Test {public static void main(String[] args) {// 1.类方法使用/…

六西格玛培训,带你解锁职场超能力工具!

当提及六西格玛培训的精髓时,我们不得不提到那些强大而实用的工具,它们如同探险者的指南针,引导我们走向卓越。今天,就让我们一起揭开这些神秘工具的面纱,探寻六西格玛背后的智慧。 首先,DMAIC流程是六西格…

SpringBoot高手之路04-Aop

文章目录 AOP 基础AOP概述start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖都会下载下来 AOP快速入门AOP核心概念 切入点表达式-execution AOP 基础 AOP概述 AOP 对特定的方法做增强 AOP 快速入门 start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖…

LNMP网站架构部署

目录 一、LNMP架构部署(源码编译安装) ①实验准备 ②安装nginx服务 ③安装mysql服务,配置文件 ④安装php服务,修改配置文件 ⑤验证 静态页面测试访问 动态页面测试访问 调用数据库测试 二、LNMP架构应用实例 1.论坛网站…

网鼎杯 2020 玄武组 SSRFMe

复习一下常见的redis主从复制 主要是redis伪服务器的选择和一些小坑点 <?php function check_inner_ip($url) { $match_resultpreg_match(/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/,$url); if (!$match_result) { die(url fomat error); } try { …

安卓照片云备份:如何将Android照片备份到云服务

随着智能手机摄影技术的发展&#xff0c;我们每天都在手机上拍摄大量照片和视频。为了防止宝贵的回忆丢失&#xff0c;将这些照片备份到云服务上是一个明智的选择。我们有多种云服务可供选择&#xff0c;如华为云、小米云、腾讯云等&#xff0c;它们提供了安全、便捷的数据备份…

力扣2968.执行操作使频率分数最大

力扣2968.执行操作使频率分数最大 方法一&#xff1a;滑窗 前缀和 求前缀和数组s 求一个数组补齐到中位数的差值 枚举右端点 class Solution {public:int maxFrequencyScore(vector<int>& nums, long long k) {int res0,n nums.size();sort(nums.begin(),nums…

tomcat中管理环境变量之setenv.sh

tomcat配置spring profiles springboot打包war部署到外部tomcat的时候指定profile启动 windows 在%tomcat%/bin下创建setenv.bat文件 linux 在%tomcat%/bin下创建setenv.sh文件 使用JVM参数: windows set "JAVA_OPTS%JAVA_OPTS% -Dspring.profiles.activedev"in…

【ROS2大白话】三、给turtlebot3安装realsense深度相机

系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录效果展示一、修改model.sdf文件1. 路径位置2. 修改…

基于python的网上挂号预约系统-计算机毕业设计源码35796

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院当然也不例外。网上挂号预约系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用Py…

数据结构:详解二叉树(树,二叉树顺序结构,堆的实现与应用,二叉树链式结构,链式二叉树的4种遍历方式)

目录 1.树的概念和结构 1.1树的概念 1.2树的相关概念 1.3树的代码表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的存储结构 2.3.1顺序存储 2.3.2链式存储 3.二叉树的顺序结构和实现 3.1二叉树的顺序结构 3.2堆的概念和结构 3.3堆的特点 3…

Linux 35.5 + JetPack v5.1.3@ego-planner-swarm编译安装

Linux 35.5 JetPack v5.1.3ego-planner-swarm编译安装 1. 源由2. 编译&安装Step 1&#xff1a;依赖库安装Step 2&#xff1a;建立工程Step 3&#xff1a;编译工程Step 4&#xff1a;安装工程 3. 问题汇总3.1 组件ros-noetic-roslint问题3.2 uav_simulator/local_sensing -…