IO 原理

20 篇文章 1 订阅
订阅专栏

【作用】

Netty之所以受青睐,是因为Netty提供异步的、事件驱动的网络应用程序框架和工具。 作为一个异步框架,Netty的所有IO操作都是异步非阻塞的,通过Future- Listener机制, 用户可以方便地主动获取或者通过通知机制获得IO操作结果

【io读写原理】

1.大家知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用。
在不同的操作系统中,IO读写的系统调用的名称可能不完全一样,但是基本功能是一样的。
2.这里涉及一个基础的知识: read系统调用,并不是直接从物理设备把数据读取 到内存中;write系统调用,也不是直接把内存数据写入到物理设备
上层应用无论是调用操作系统的read,还是调用操作系统的write,都会涉及缓冲区。
具体来说, 调用 操作系统的read,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是 把数据从进程缓冲区复制到内核缓冲区
3.也就是说, 上层程序的IO操作,实际上不是物理设备级别的读写,而是缓存的 复制
read&write两大系统调用,都不负责数据在内核缓冲区和物理设备(如磁盘)之间的交换, 这项底层的读写交换,是由操作系统内核(Kernel)来完成的。
注:本书后文如果没有特别指明,内核即指操作系统内核。
4.在用户程序中,无论是Socket的IO、还是文件IO操作,都属于上层应用的开发,它们的输入(Input)和输出(Output)的处理,在编程的流程上,都是一致的。

【内核缓冲/进程缓冲】

为什么设置那么多的缓冲区,为什么要那么麻烦呢? 缓冲区的目的,是为了减 少频繁地与设备之间的物理交换。其实和数据库的page缓存落盘到持久化存储一个道理。
大家都知道,外部设备的直接读写,涉及操作系 统的中断。发生系统中断时,需要保存之前的进程数据和状态等信息,而结束中断 之后,还需要恢复之前的进程数据和状态等信息。
为了减少这种底层系统的时间损 耗、性能损耗,于是出现了内存缓冲区
有了内存缓冲区,上层应用使用read系统调用时,仅仅把数据从内核缓冲区复 制到上层应用的缓冲区(进程缓冲区);.
上层应用使用write系统调用时,仅仅把数 据从进程缓冲区复制到内核缓冲区中。
底层操作会对内核缓冲区进行监控,等待缓 冲区达到一定数量的时候,再进行IO设备的中断处理,集中执行物理设备的实际IO 操作,这种机制提升了系统的性能。
至于什么时候中断(读中断、写中断),由操 作系统的内核来决定,用户程序则不需要关心。
从数量上来说,在Linux系统中, 操作系统内核只有一个内核缓冲区。而每个用户程序(进程),有自己独立的缓冲区,叫作进程缓冲区。所以,用户程序的IO读写程序,在大多数情况下,并没有进行实际的IO操作,而是在进程缓冲区和内核缓冲区之间直接进行数据的交换。

【接触linux句柄限制】

文件句柄,也叫文件描述符。在Linux系统中,文件可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(File Descriptor)是内核为了高效管理已被打开的文件所创建的索引,它是一个非负整数(通常是小整数),用于指代被打开的文件。所有的IO系统调用,包括socket的读写调用,都是通过文件描述符完成的。在Linux下,通过调用ulimit命令,可以看到单个进程能够打开的最大文件句柄数量,这个命令的具体使用方法是:
ulimit -n

【4种io模型】

1.同步阻塞IO(Blocking IO)

在阻塞式IO模型中, Java应用程序从IO系统调用开始,直到系统调用返回,在 这段时间内,Java进程是阻塞的。返回成功后,应用进程开始处理用户空间的缓存区数据。
举个例子,在Java中发起一个socket的read读操作的系统调用,流程大致如下:
(1) 从Java启动IO读的read系统调用开始,用户线程就进入阻塞状态
(2)当系统内核收到read系统调用,就开始准备数据。一开始,数据可能还没有到达内核缓冲区(例如,还没有收到一个完整的socket数据包),这个时候内核就要等待。
(3)内核一直等到完整的数据到达,就会将数据从内核缓冲区复制到用户缓冲区(用户空间的内存),然后内核返回结果(例如返回复制到用户缓冲区中的字节数)。
(4)直到内核返回后,用户线程才会解除阻塞的状态,重新运行起来。总之,阻塞IO的特点是:在内核进行IO执行的两个阶段,用户线程都被阻塞了。
阻塞IO的优点是: 应用的程序开发非常简单;在阻塞等待数据期间,用户线程 挂起。在阻塞期间,用户线程基本不会占用CPU资源
阻塞IO的缺点是: 一般情况下,会为每个连接配备一个独立的线程;反过来 说,就是一个线程维护一个连接的IO操作。在并发量小的情况下,这样做没有什么问题。但是,当在高并发的应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会非常巨大。因此,基本上阻塞IO模型在高并发应用场景下是不可用的。

2.同步非阻塞NIO(None Blocking IO)

socket连接默认是阻塞模式,在Linux系统下,可以通过设置将socket变成为非阻塞的模式(Non-Blocking)。使用非阻塞模式的IO读写,叫作同步非阻塞IO(None Blocking IO),简称为NIO模式。在NIO模型中,应用程序一旦开始IO系统调用,会出现以下两种情况:
(1) 在内核缓冲区中没有数据的情况下,系统调用会立即返回,返回一个调 用失败的信息。后面会继续重复调用直到有数据
(2) 在内核缓冲区中有数据的情况下,是阻塞的,直到数据从内核缓冲复制 到用户进程缓冲。复制完成后,系统调用返回成功,应用进程开始处理用户空间的 缓存数据
注:不同于java中的额NIO(new io)。 可以发现情况相比于同步阻塞[类比于一直等待],同步非阻塞[类比于多次轮询]
举个例子。发起一个非阻塞socket的read读操作的系统调用,流程如下:
(1)在内核数据没有准备好的阶段,用户线程发起IO请求时,立即返回。 以,为了读取到最终的数据,用户线程需要不断地发起IO系统调用
(2)内核数据到达后,用户线程发起系统调用,用户线程阻塞。内核开始复制数据,它会将数据从内核缓冲区复制到用户缓冲区(用户空间的内存),然后内核返回结果(例如返回复制到的用户缓冲区的字节数)。
(3)用户线程读到数据后,才会解除阻塞状态,重新运行起来。也就是说,用户进程需要经过多次的尝试,才能保证最终真正读到数据,而后继续执行。同步非阻塞IO的特点:应用程序的线程需要不断地进行IO系统调用,轮询数据是否已经准备好,如果没有准备好,就继续轮询,直到完成IO系统调用为止。同步非阻塞IO的优点:每次发起的IO系统调用,在内核等待数据过程中可以立即返回。用户线程不会阻塞,实时性较好。 同步非阻塞IO的缺点:不断地轮询内核,这将占用大量的CPU时间,效率低
总体来说,在高并发应用场景下,同步非阻塞IO也是不可用的。一般Web服务器不使用这种IO模型。这种IO模型一般很少直接使用,而是在其他IO模型中使用非阻塞IO这一特性。在Java的实际开发中,也不会涉及这种IO模型。这里说明一下,同步非阻塞IO,可以简称为NIO,但是,它不是Java中的NIO,虽然它们的英文缩写一样,希望大家不要混淆。
为了避免NIO的轮询带来的cpu性能开销,Java的NIO(New IO), 叫作 IO多路复用模型(IO Multiplexing)出来了。

3.IO多路复用模型(IO Multiplexing)

NIO的每个发起read请求的线程自己去进行数据是否就绪的轮询,而IO多路复用是专门找了一个线程去帮其他所有的read请求轮询数据是否就绪
在IO多路复用模型中, 引入了一种新的系统调用,查询IO的就绪状态[linux中是select/epoll]。通过该系统调用,一个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是内核缓冲区可读/可写),内核能够将就绪的状态返回给应用程序。随后,应用程序根据就绪的状态,进行相应的IO系统调用。
目前支持IO多路复用的系统调用,有select、epoll等等。select系统调用,几乎在所有的操作系统上都有支持,具有良好的跨平台特性。epoll是在Linux 2.6内核中提出的,是select系统调用的Linux增强版本。
在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不 断地轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作。
通过拔开关的方式,实现分时复用:
和NIO模型相似,多路复用IO也需要轮询。 负责select/epoll状态查询调用的线 程,需要不断地进行select/epoll轮询,查找出达到IO操作就绪的socket连接。IO多路复用模型与同步非阻塞IO模型是有密切关系的。 对于注册在选择器上的 每一个可以查询的socket连接,一般都设置成为同步非阻塞模型。仅是这一点,对于用户程序而言是无感知的。
IO多路复用模型的优点:与一个线程维护一个连接的阻塞IO模式相比,使用select/epoll的最大优势在于,一个选择器查询线程可以同时处理成千上万个连接(Connection)。系统不必创建大量的线程,也不必维护这些线程,从而大大减小了系统的开销。
Java语言的NIO(New IO)技术,使用的就是IO多路复用模型。在Linux系统上,使用的是epoll系统调用。
IO多路复用模型的缺点: 本质上,select/epoll系统调用是阻塞式的,属于同步 IO。都需要在读写事件就绪后,由系统调用本身负责进行读写,也就是说这个读写 过程是阻塞的
如何彻底地解除线程的阻塞,就必须使用异步IO模型。

4.异步IO模型(Asynchronous IO)

异步IO模型(Asynchronous IO,简称为AIO)。AIO的基本流程是: 用户线程 通过系统调用,向内核注册某个IO操作。内核在整个IO操作(包括数据准备、数据 复制)完成后,通知用户程序,用户执行后续的业务操作
在异步IO模型中,在整个内核的数据处理过程中,包括内核将数据从网络物理设备(网卡)读取到内核缓冲区、将内核缓冲区的数据复制到用户缓冲区,用户程序都不需要阻塞。
异步IO模型的特点:在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的。 用户线程需要接收内核的IO操作完成的事件,或者用户线程需要注册一个 IO操作完成的回调函数。正因为如此,异步IO有的时候也被称为信号驱动IO
异步IO异步模型的缺点: 应用程序仅需要进行事件的注册与接收,其余的工作 都留给了操作系统,也就是说,需要底层内核提供支持。 理论上来说,异步IO是真正的异步输入输出,它的吞吐量高于IO多路复用模型 的吞吐量
就目前而言,Windows系统下通过IOCP实现了真正的异步IO。
而在Linux系统 下,异步IO模型在2.6版本才引入,目前并不完善,其底层实现仍使用epoll,与IO多 路复用相同,因此在性能上没有明显的优势。
大多数的高并发服务器端的程序,一般都是基于Linux系统的。因而,目前这类 高并发网络应用程序的开发,大多采用IO多路复用模型。 大名鼎鼎的Netty框架,使用的就是IO多路复用模型,而不是异步IO模型
IO原理
qq_28854219的博客
07-10 1804
目录IO设备分类IO设备组成设备控制器直接存储器存储(DMA)中断 IO设备分类 I/O设备一般分为两种: 块设备:每个块都有自己的地址,传输依次是以块为单位进行的通常在512-32768之间,典型的就是磁盘 字符设备:没有固定的地址,每次以字符为单位接收或发送一个字符流。如键盘,鼠标 IO设备组成 I/O设备一般由机械部分和电子部分组成,电子部分就称为设备控制器或者适配器 设备控制器 设备控制器...
Base32 的 draw.io 原理
10-22
文本 Hello 进行 Base32 编码的原理
磁盘IO原理讲解以及开销
05-12
讲解了计算机磁盘的io原理以及开销,有助于分析持久化存储数据结构的定义
【Java 基础篇】Java IO流详解
繁依Fanyi的博客
06-26 2516
本文详细介绍了Java IO流的原理、分类、使用场景和常用类。IO流提供了一种统一的方式来处理输入和输出操作,无论是从文件、网络连接还是内存中。通过使用不同的IO流类,我们可以实现数据的读取和写入,满足不同的需求。希望本文对你理解和应用Java IO流有所帮助!
IO流程解析与基本原理
11-09
希望对学习块设备的同学有帮助了通过/proc/devices 能够看到这个块设备驱动注册了. kobject_add在sys/block/下面建立文件
为什么我觉得 Java 的 IO 很复杂?
jinshitou2012的专栏
02-20 153
最近又把流的概念,原理复习了一下,发现一片文章写得很好,转载记录一下。侵删。 作者:安馁碗 链接:https://www.zhihu.com/question/67535292/answer/1248887503 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 初学者觉得复杂是很正常的,归根结底是因为没有理解JavaIO框架的设计思想: 可以沿着这条路想一想: 1,学IO流之前,我们写的程序,都是在内存里自己跟自己玩。比如,你声明个变量,创建个数组,创建个..
io的基本原理-nio
loserbai的博客
02-12 813
操作系统将内存(虚拟内存)划分为两部分:一部分是内核空间(Kernel-Space),另一部分是用户空间(User-Space) 应用程序不允许直接在内核空间区域进行读写,也不允许直接调用内核代码定义的函数。每个应用程序进程都有一个单独的用户空间,对应的进程处于用户态,用户态进程不能访问内核空间中的数据,也不能直接调用内核函数,因此需要将进程切换到内核态才能进行系统调用。
说说IOIO原理与解析.zip
09-02
内容概要:IO的分层;IO模型;IO性能的重要指标;文件系统;逻辑卷管理;Driver & IO Channel;RAID;三分天下 适用人群:Java开发人员 使用场景:想学习JavaIO以及在IO开发中遇到瓶颈 目标:通过本教程的讨论与解析...
Base16 编码的 draw.io 原理图的原文件
最新发布
10-22
将文本 Hel 进行 base16 编码的原理图,使用 draw.io 绘制
W5500IO原理图-集成.pdf
12-23
W5500IO原理图-集成.pdf
彻底搞懂 IO 底层原理
vivo互联网技术
11-30 2269
武侠小说里有很多的“心法”和“招式”。计算机技术里的“心法”和“招式”呢,我们可以简称为“道”和“术”; “道”最基础的计算机理论,隐藏于表象之下,非常抽象、晦涩难懂,需要用具象化的事物加以理解; “术”具体的技艺,它有可能是一门语言,比如:python 出手见效快; 我们今天要给大家讲的底层的IO就属于“道”的范畴,看上去简单,实则抽象。并且在它之上衍生出了语言层面用于实战的技术,比如我们熟悉的java语言中的NIO或者像Netty这样的框架。 一、混乱的 IO 概念 IO是Input...
2. IO原理
hanzong110的博客
01-26 307
1 VFS VFS:虚拟文件系统 是一个软件,启动后被加载进内存 树型结构,树上节点可以映射到不同文件上 VFS的诞生是为了解耦,对于访问不同类型的文件,提供一套统一接口 cd / #1. 看整个目录树 ll #2. 查看不同目录挂在哪个物理设备 df -h #3. Filesystem:物理文件系统,一个硬盘分为四个分区,分别为sda1、sda2、sda3、sda4 #4. Mounted On:文件系统挂载在虚拟文件系统的哪个目录上 #5. kernel首先将/dev/sda2挂载在了/
IO原理理解与IO模型
lhrimperial的专栏
09-05 6522
基本概念 Linux内核将所有外部设备都看做一个文件来操作。那么我们对与外部设备的操作都可以看做是对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符),对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符)。描述符就是一个数字(可以理解为一个索引),指向内核中一个结构体(文件路径...
Java io 工作原理
yangych0801的专栏
03-22 573
1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:1.1 以字节为导向的stream以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:1. input stream
Java IO操作(原理详细)
qq_50835054的博客
04-14 222
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Java IO操作 前言 Java中把输入(Input)/输出(Output) 称为I/O ,也称为流(Stream) 相关的类型被封装的java.io包中 什么是流: 从起点到终点有序的数据序列 一、pandas是什么? 二、流的分类: 按照方向划分: 输入流: 我们只会从流中读取数据,也就是只读的 输出流: 我们只会向流中写入数据,也就是只写的; 按照处理的数据分: 字节流: 以字节为单位,也就是在读取/写入的时候,以字节为单
I/O硬件原理
crazy_scott的博客
05-20 3782
从程序员的角度简单介绍I/O的硬件组成和原理。 操作系统的主要功能之一是控制所有的输入输出,必须向设备发出指令,捕获中断并进行错误处理,还要提供一个设备与系统其余部分简单的接口。 I/O设备 I/O设备在速度上覆盖了巨大的范围,这给数据传输的性能保持上造成了巨大压力。 按交互对象分类 人机交互设备:视频显示设备、键盘、鼠标、打印机 与计算机或其他电子设备交互的设备:磁盘、...
socket io原理
06-01
Socket.IO 是一个基于 Node.js 的实时网络库,提供了实时、双向、基于事件的通信。它允许在客户端和服务器之间建立一个实时的...它的实现原理主要是基于 WebSocket 协议以及其他一些技术,如轮询、长轮询和 JSONP 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • RabbitMQ 实现 Mqtt 协议 42031
  • 使用 java-onnx 部署 yolovx 目标检测 18651
  • 【PostgreSQL】检查点机制 CheckpointerMain() 16425
  • 【Elasticsearch】ES机器学习源码分析 16228
  • kafka 请求 Produce、二次Fetch 处理、ISR维护 15757

分类专栏

  • Thingsboard 源码 付费 45篇
  • 支付平台 付费 14篇
  • 深度学习/机器学习/强化学习 20篇
  • 音视频处理算法 9篇
  • ElasticSearch 源码分析 8篇
  • PostgreSQL 源码分析 2篇
  • Kafka 源码分析 6篇
  • HotSpot JVM 源码分析 12篇
  • Redis 源码分析 5篇
  • Netty 20篇
  • 后端开发 6篇

最新评论

  • DJL 强化学习(附带 FlappyBird示例)

    0x13: 参考这个 https://github.com/kingyuluk/RL-FlappyBird ,我改了网络、reward、和训练部分。

  • DJL 强化学习(附带 FlappyBird示例)

    CSU529: 大佬 你这个例子有完整代码吗表情包

  • 使用 java-onnx 部署 yolovx 目标检测

    qq_46730446: 你这个原因是pt文件转换到onnx的时候有问题,不要加--train就可以了

  • 使用 java-onnx 部署 yolovx 目标检测

    qq_46730446: upup,我也是这个问题。这个可以在pt到onnx的时候更改shape吗?

  • Elasticsearch 混合检索优化大模型 RAG 任务

    普通网友: 引领技术潮流,是不可多得的好文,十分值得借鉴和参考。期待博主未来能够持续分享更多好文【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

大家在看

  • m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
  • [春秋云镜] Initial
  • Java 多线程创建:三种主要方法
  • 对人工智能技术GPT-4o的初步认知
  • 一切皆是映射:TensorFlow 和 PyTorch 实战对比

最新文章

  • 大模型 Agent 任务 ,如何开发一个 AI 代理?
  • Elasticsearch 混合检索优化大模型 RAG 任务
  • 中文nlp处理常用工具(ltp、apache-nlp、spark-nlp等)
2024年4篇
2023年41篇
2022年101篇
2021年2篇
2019年1篇
2018年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司合肥SEO按天扣费价格岳阳网络广告推广哪家好吉祥企业网站建设公司铁岭关键词排名包年推广多少钱抚州建设网站报价内江设计公司网站公司随州阿里店铺运营推荐南京网站推广推荐沧州seo价格南充外贸网站制作公司吉祥外贸网站建设永州建站多少钱张家口百度竞价包年推广报价新乡营销型网站建设哪家好郑州网站推广系统哪家好永湖模板制作哪家好盘锦关键词按天扣费哪家好阳泉企业网站改版多少钱西安百度竞价价格巴中网站优化按天扣费多少钱酒泉网站制作价格木棉湾百度关键词包年推广价格黄南外贸网站设计哪家好镇江百度爱采购哪家好莱芜网站推广工具迪庆外贸网站制作价格海北百度网站优化排名长葛网站改版多少钱玉树企业网站改版推荐荆州营销型网站建设推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化