当前位置:首页 > 科技  > 软件

对IO概念模糊:计算机IO过程与零拷贝

来源: 责编: 时间:2023-10-08 07:04:51 358观看
导读一、前置知识1.1 内存分段现代计算机在加载操作系统、正常启动后,其内存会主要分成两大段:内核段用户段内核段:操作系统本质上是一个计算机的管理程序,该程序相关的所有资源,被存放在内核段中。用户段:用户段用来存放各个进

一、前置知识

1.1 内存分段

现代计算机在加载操作系统、正常启动后,其内存会主要分成两大段:cOz28资讯网——每日最新资讯28at.com

  • 内核段
  • 用户段

内核段:cOz28资讯网——每日最新资讯28at.com

操作系统本质上是一个计算机的管理程序,该程序相关的所有资源,被存放在内核段中。cOz28资讯网——每日最新资讯28at.com

用户段:cOz28资讯网——每日最新资讯28at.com

用户段用来存放各个进程的数据和指令。cOz28资讯网——每日最新资讯28at.com

根据所访问的内存段的不同,CPU会处于不同的态,访问用户段的时候处于用户态,访问内核段的时候处于内核态。cOz28资讯网——每日最新资讯28at.com

1.2 CPU的态

1.2.1 CPU的工作过程

CPU要执行的指令的地址存在寄存器中,指令存放在内存中,而CPU本质上就是一个去内存中根据地址取指令,然后执行指令的硬件。cOz28资讯网——每日最新资讯28at.com

举一个例子:cOz28资讯网——每日最新资讯28at.com

例如PC寄存器中存放50,CPU读到存放的50,发出一条取址指令,去取出地址为50的内存单元中的指令,再传回给CPU。cOz28资讯网——每日最新资讯28at.com

cOz28资讯网——每日最新资讯28at.com

cOz28资讯网——每日最新资讯28at.com

1.4 IO与内存

计算机进行IO的时候,本质上会为每一个IO设备在内存中分配一块空间,向这块空间里进行读写,即可完成IO。为什么给IO设备分配的内存会是在内核段里喃?主要是基于两点进行考虑的:cOz28资讯网——每日最新资讯28at.com

  • 安全性
  • 特权操作

1.4.1 安全性:

I/O 操作通常需要与计算机的外部设备(如磁盘、网络设备等)进行交互,如果允许各个进程自己私自与外部设备进行交互,IO的内存放在各个进程内部,太散了,不是很好进行安全控制,相反,如果将IO的内存放在内核段,就很便于集中管理,可以附加一些安全机制上去。cOz28资讯网——每日最新资讯28at.com

1.4.2 特权操作:

首先IO指令本身就是特权指令,会让CPU进入内核态,其次进行IO的时候会用到中断信号,也涉及到特权指令,也要求CPU处于内核态,所以如果IO内存是在内核段中,让CPU提前进入内核状态,也避免了后面来回切状态造成的时间浪费。cOz28资讯网——每日最新资讯28at.com

整个IO在内存中的流转过程如下:cOz28资讯网——每日最新资讯28at.com

读的时候磁盘拷贝到内核段、内核段拷贝到用户段,cOz28资讯网——每日最新资讯28at.com

写的时候用户段拷贝到内核段、内核段拷贝到磁盘。cOz28资讯网——每日最新资讯28at.com

一共四次复制。cOz28资讯网——每日最新资讯28at.com

cOz28资讯网——每日最新资讯28at.com

特别说明:cOz28资讯网——每日最新资讯28at.com

我知道其它很多地方这里将图画成了这个样子:cOz28资讯网——每日最新资讯28at.com

cOz28资讯网——每日最新资讯28at.com

之所以能实现这样的效果是得益于操作系统底层有两种读操作:cOz28资讯网——每日最新资讯28at.com

读取数据:常见的系统调用如 read()(用于文件描述符)或 recv()(用于套接字)用于从文件或套接字中读取数据。这些系统调用从相应的输入源(如磁盘、网络等)读取数据,并将其复制到应用程序提供的缓冲区中。这种方式涉及了数据的复制,因为数据需要从内核态复制到用户态缓冲区中。cOz28资讯网——每日最新资讯28at.com

读取映射:另一种方式是通过内存映射(Memory Mapping)来实现读取操作。通过将文件或设备的数据映射到进程的内存区域中,应用程序可以直接访问内存映射区域中的数据,而无需使用传统的 read() 系统调用。在这种情况下,应用程序可以通过直接读取内存映射区域中的数据来获取文件或设备的内容,避免了中间的数据复制。cOz28资讯网——每日最新资讯28at.com

特别说明:cOz28资讯网——每日最新资讯28at.com

还是和上文类似,画图的问题。这里为了涵盖,本地IO和网络IO两种情况,内核段没拆成几个设备的不同地址空间,但是如果是从磁盘中读,然后向网络中写,是跨了IO设备的,所以中间有个内核段地址间的复制过程,如下图:cOz28资讯网——每日最新资讯28at.com

cOz28资讯网——每日最新资讯28at.com

三、JAVA中的零拷贝

零拷贝需要进行系统调用才能实现,很明显要我们手写实现零拷贝是很底层、很麻烦的,好在JAVA在NIO中封装了mmap、SendFile两种零拷贝的API,当我们想在JAVA中使用零拷贝时,直接调API即可。cOz28资讯网——每日最新资讯28at.com

很多同学在NIO中老是搞不明白channel和buffer的关,容易晕,这里博主一句话总结一下:cOz28资讯网——每日最新资讯28at.com

JavaNlO中 的Channel就相当于操作系统中的内核缓冲区,而Buffer就相当于操作系统中的用户缓冲区。cOz28资讯网——每日最新资讯28at.com

mmap:cOz28资讯网——每日最新资讯28at.com

MappedByteBuffer mappedByteBuffer = new RandomAccessFile(file, "r")                                  .getChannel()                                 .map(FileChannel.MapMode.READ_ONLY, 0, len);

SendFile:cOz28资讯网——每日最新资讯28at.com

sendFile进行网络传输:cOz28资讯网——每日最新资讯28at.com

FileChannel sourceChannel = new RandomAccessFile(sourceFile, "rw").getChannel();SocketChannel socketChannel = SocketChannel.open(sa);sourceChannel.transferTo(0, sourceChannel.size(), socketChannel);

sendFile进行文件拷贝:cOz28资讯网——每日最新资讯28at.com

try (FileChannel srcChannel = new FileInputStream(src).getChannel();     FileChannel targetChannel = new FileInputStream(target).getChannel()) {     srcChannel.transferTo(0, srcChannel.size(), targetChannel ); } catch (IOException e) {     e.printStackTrace(); }


cOz28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12196-0.html对IO概念模糊:计算机IO过程与零拷贝

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深入了解快速排序:原理、性能分析与 Java 实现

下一篇: 三个杀手级VS Code插件

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
Top