Java-IO模型

news2024/12/25 2:26:15

所谓I/O就是计算机内存与外部设备之间拷贝数据的过程。由于CPU访问内存的速度远远高于外部设备,因此CPU是先把外部设备的数据读到内存里,然后再进行处理。对于一个网络I/O通信过程,比如网络数据读取,会涉及两个对象,一个是调用这个I/O操作的用户线程,另外一个就是操作系统内核。一个进程的地址空间分为用户空间和内核空间,用户线程不能直接访问内核空间。

IO模型分类

常见的IO模型主要有下面4种:同步阻塞I/O、同步非阻塞I/O、I/O多路复用和异步I/O。

首先理解一下同步异步,非阻塞/阻塞。

同步异步
同步异步的关键是IO设备状态需要自己轮询,还是内核主动通知
同步:用户线程轮询去发起IO请求。
异步:当内核IO操作就绪后,内核主动把数据写入用户程序指定的Buffer。

阻塞非阻塞
阻塞非阻塞描述的是用户线程调用内核IO操作的方式。(仅数据准备阶段)
阻塞:IO操作需要彻底完成后才返回到用户空间。
非阻塞:IO操作被调用后立即返回给用户一个状态值,不需要等到IO操作彻底完成。

当用户线程发起I/O操作后会经历两个阶段:

  1. 数据准备阶段:内核等待数据就绪,将数据从网卡拷贝到内核空间。

  2. 数据拷贝阶段:内核将数据从内核空间拷贝到用户空间。

1. 阻塞IO(Blocking IO)

Linux中默认的Socket IO都是阻塞的,在阻塞IO模式下,读数据的流程如下:
Blocking IO.png
从上图看Blocking IO模式在数据准备和数据拷贝两个阶段,用户程序都是堵塞的。

一个简单的改进方案是在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。但也存在问题,如果要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源, 例如线程占用一定的内存, 线程调度带来额外的CPU开销等,降低系统对外界响应的效率。

2. 非阻塞IO(Non-Blocking IO)

非阻塞IO模式下,读数据的流程如下:
Non-Blocking IO.png
在Non-Blocking模式下,调用recvfrom时,如果内核还没有准备好数据,会直接返回EWOULDBLOCK错误。用户程序可以继续发起调用,直到内核数据已经准备好,就会把数据拷贝到用户内存空间,并返回成功。所以在Non-Blocking模式,用户程序需要通过轮询来查看数据是否准备好,而且数据拷贝阶段还是堵塞的。
由于用户程序需要轮询,轮询会大量占用CPU时间,所以非阻塞模式一般不被推荐使用,而是采用内核自带轮询的IO多路复用技术

3. IO多路复用(IO Multiplexing) 重点!!!

多路是指网络连接, 复用是指用的同一个线程。

IO多路复用,又叫事件驱动IO(Event-Driver IO),底层使用了内核提供的select/poll/epoll等系统调用。IO多路复用模式下,读数据的流程如下:
IO Multiplexing.png
当调用了select后,用户程序会堵塞,同时内核监控此select负责的所有Socket,当任意一个进入读就绪状态时,select函数就会返回。用户程序再逐个调用读就绪的Socket的recvfrom函数,把数据从内核拷贝到用户内存。

IO多路复用模型和阻塞IO的模型其实并没有太大的不同,事实上还更差一些。因为这里需要使用两个系统调用(select和recvfrom),而阻塞IO只调用了一个系统调用(recvfrom)。但是,用select的优势在于它可以同时处理多个连接。所以,如果处理的连接数不是很高的话,可能延迟还更大;select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

在多路复用IO模型中,对于每一个socket,一般都设置成为非阻塞的,但整个用户的进程其实是一直被阻塞的。只不过进程是被select这个函数阻塞,而不是被socket IO阻塞。因此使用select()的效果与非阻塞IO类似。

此模式虽然用户程序不在需要轮询了,但是内核还是需要去轮询Socket,消耗大量CPU。

4. 异步IO(Asynchronous I/O)

用户线程发起read调用的同时注册一个回调函数,read立即返回,等内核将数据准备好后,再调用指定的回调函数完成处理。在这个过程中,用户线程一直没有阻塞。异步IO模式下,读数据的流程如下:
Asynchronous IO.png

IO模型总结

Comparison of IO models.png
堵塞IO、非堵塞IO、IO多路复用、信号驱动IO都是同步IO,在拷贝数据阶段还是堵塞的;

异步IO发完请求后,用户程序就返回了,数据准备和数据拷贝两个阶段都由内核来完成。

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

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

相关文章

VMware复制Ubuntu虚拟机后网卡失效的问题

为了在个人电脑上搭建集群,我使用了多台VMware虚拟机来模拟集群主机。之前虚拟机的操作系统是Redhat时,我复制虚拟机后网卡功能没有问题,但这次换成Ubuntu操作系统,我复制了虚拟机后同时启动这两台虚拟机,其中一台虚拟…

软件测试谣言二三事,认真你就输了

软件测试在近几年关注度日益升高,这得益于行业快速发展,以及很多公司和国际接轨后,对质量要求的增高。 在网上相关的讨论中,有许多观点并不符合我在这个行业的感知,针对一些观点,在这里结合我自己多年的从事经验,给大家辟辟谣。 谣言一:软件测试入门容易,会点点点就…

vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果 当鼠标放在左侧图标上时,可以拖动整个列表元素,调整顺序 思路介绍 使用draggable可以设置元素可拖动,然后分别设置三个事件处理函数,监听onDragstart、onDragover、onDragend三个事件 注意&#xff1a…

基于STM32的智能温度监控系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据采集与处理温度监控与报警显示功能应用场景结论 1. 引言 温度监控系统在许多应用场景中具有重要作用,例如工业、农业以及家居生活。通过使用STM32微控制器、温度传…

Excel:常用函数

一、DAYS(返回两个日期之间的天数) 以下演示是在windows操作系统环境,office软件进行操作的 1.1 单元格设置日期格式 1.2 设置Days函数 公式:DAYS(C2,B2) 全部天数 二、SUM(求和) 公式:SUM(…

第二届两岸新经济产业发展研讨会闭幕,爱迪斯通董事长发表演讲

9月29日,第二届两岸新经济产业发展研讨会在福州高新区圆满落幕。此次研讨会由清华大学两岸发展研究院主办,福州市招商行动领导小组办公室、福州高新区承办,汇聚了两岸的专家学者及企业家代表近200人,共同探讨新质生产力的发展与两…

宠物医院微信小程序源码

文章目录 前言研究背景研究内容一、主要技术?二、项目内容1.整体介绍(示范)2.系统分析3.数据表信息4.运行截图5.部分代码介绍 总结 前言 随着当代社会科技的迅速发展,计算机网络时代正式拉来帷幕,它颠覆性的影响着社会…

【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验

前言 分析时Tessy的报错 1.fatal error: Tricore/Compilers/Compilers.h: No such file or directory 2.error: #error "Compiler unsupported" 3.warning: invalid suffix on literal;C11 requires a space between literal and string macro 4.error: unknown…

YOLOv7改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

优化Mysql

目录 Mysql优化就四种:定位慢查询/sql执行计划/索引/Sql优化经验... 2 1Mysql如何定位慢查询?... 2 2Sql语句执行很慢,如何分析呢?... 3 2.1那这个SQL语句执行很慢,如何分析呢?. 3 3.了解过索引吗?(什么是索引)…

DC00018基于java swing+MySQL花卉信息管理系统

1、项目功能演示 DC00018基于java swingMySQL花卉信息管理系统java项目信息管理系统 2、项目功能描述 基于java swingMySQL花卉信息管理系统 系统包括用户信息管理以及花卉信息管理等功能。 3、项目运行截图 4、项目核心代码 4.1 日期格式化 package utils;import java.t…

C++ STL容器(四) —— vector底层剖析

这篇讲解vector,不说废话,直接开始! 文章目录 原理UML类图代码实现构造函数插入元素删除元素清空容器析构函数赋值运算符 案例分析 原理 这里简单说一下 vector 的大致思想,动态数组,即它的长度会随着我们插入元素而产…

【YOLO目标检测二维码数据集】共3112张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:3112 标注数量(txt文件个数):3112 标注类别数:1 标注类别名称:qrcode 数据集下载:二维码数据集 图片示例 数据集图片: 数据集…

【开源免费】基于SpringBoot+Vue.JS微服务在线教育系统(JAVA毕业设计)

本文项目编号 T 060 ,文末自助获取源码 \color{red}{T060,文末自助获取源码} T060,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【hot100-java】【合并两个有序链表】

记忆中,两个指针合并即可。 建立哨兵节点dum /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { t…

idea启动项目报错Command line is too long

idea启动项目报错 Command line is too long. Shorten command line for Idmap5CoreApplication or also for Spring Boot default configuration? 选择出问题的项目,shorten command line 选项选择 JAR manifest 或者 classpath file 选项

用责任链模式改造 if else

我的上一篇文章,因为if else 多了,捣鼓很久,今天用责任链模式改造一下。 代码写着写着,if else if 逻辑忘记了,哎。。。-CSDN博客 责任链模式(Chain of Responsibility Pattern) 1. 什么是责任…

SpringBoot之Profile的两种使用方式

0. 需求 通常项目开发过程中,会经历多种环境转换,典型的如开发环境(dev)、测试环境(test)和生产环境(prod)。在这三种不同的环境下,连接数据库时使用的配置信息是不同的,即三个不同环境对应三个不同的数据库。 现在的需求是&#…

【论文导读】Graphusion (LLM + KGC)

序言 第一次论文出现在 《Leveraging Large Language Models for Concept Graph Recovery and Question Answering in NLP Education》 论文地址:https://arxiv.org/abs/2402.14293 七月份的时候应该是又改进了一次。但是又发了一篇新的地址:《Graphu…

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用

1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…