当前位置: 首页 > news >正文

网银网站模板网站建设怎么制作模板

网银网站模板,网站建设怎么制作模板,荥阳网站建设,百度广告安装入口目录 一#xff1a;了解IO基础概念 二#xff1a;数据流动的层次结构 三#xff1a;零拷贝 1.传统IO文件读写 2.mmap 零拷贝技术 3.sendFile 零拷贝技术 一#xff1a;了解IO基础概念 理解CPU拷贝和DMA拷贝 ​ 我们知道#xff0c;操作系统对于内存空间了解IO基础概念 二数据流动的层次结构 三零拷贝 1.传统IO文件读写 2.mmap 零拷贝技术 3.sendFile 零拷贝技术 一了解IO基础概念 理解CPU拷贝和DMA拷贝 ​         我们知道操作系统对于内存空间是分为用户态和内核态的。用户态的应用程序无法直接操作硬件需要通过内核空间进行操作转换才能真正操作硬件。这其实是为了保护操作系统的安全。正因为如此应用程序需要与网卡、磁盘等硬件进行数据交互时就需要在用户态和内核态之间来回的复制数据。而这些操作原本都是需要由CPU来进行任务的分配、调度等管理步骤的早先这些IO接口都是由CPU独立负责所以当发生大规模的数据读写操作时CPU的占用率会非常高。 之后操作系统为了避免CPU完全被各种IO调用给占用引入了DMA(直接存储器存储)。由DMA来负责这些频繁的IO操作。DMA是一套独立的指令集不会占用CPU的计算资源。这样CPU就不需要参与具体的数据复制的工作只需要管理DMA的权限即可。 ​ DMA拷贝极大的释放了CPU的性能因此他的拷贝速度会比CPU拷贝要快很多。但是其实DMA拷贝本身也在不断优化。 ​ 引入DMA拷贝之后在读写请求的过程中CPU不再需要参与具体的工作DMA可以独立完成数据在系统内部的复制。但是数据复制过程中依然需要借助数据总进线。当系统内的IO操作过多时还是会占用过多的数据总线造成总线冲突最终还是会影响数据读写性能。 ​ 为了避免DMA总线冲突对性能的影响后来又引入了Channel通道的方式。Channel是一个完全独立的处理器专门负责IO操作。既然是处理器Channel就有自己的IO指令与CPU无关他也更适合大型的IO操作性能更高。 ​ 这也解释了为什么Java应用层与零拷贝相关的操作都是通过Channel的子类实现的。这其实是借鉴了操作系统中的概念。 channel知识点 在计算机系统中“通道”Channel 的具体作用范围取决于上下文如硬件架构、操作系统或编程框架。以下是不同场景下的解释 通道是 数据传输的路径或抽象机制通常不直接等同于“操作系统内存 ↔ 外设”的物理传输而是分层协作中的一环。 (1) 硬件层的通道如传统大型机 功能 某些系统如 IBM 大型机的 I/O 通道 是专用硬件直接管理外设磁盘、磁带与内存的传输。 特点 通道是独立于 CPU 的处理器可执行复杂的 I/O 指令如协议解析、数据分块。 直接与外设控制器交互完成物理数据传输类似增强版 DMA。 示例 大型机中通道从磁盘读取数据到内存无需 CPU 干预。 (2) 操作系统层的通道如设备驱动 功能 操作系统通过 设备驱动 和 内核 I/O 子系统 管理外设与内存的交互。 特点 通道在此上下文中更接近 逻辑抽象如 /dev 下的设备文件。 实际数据传输依赖 DMA 或 PIO编程 I/O。 (3) 编程框架中的通道如 Java NIO 功能 Java NIO 的 Channel如 FileChannel、SocketChannel是 用户空间与内核空间之间的桥梁。 特点 通过系统调用与内核交互数据在用户缓冲区如 ByteBuffer和内核的 Page Cache 之间传输。 不直接操作外设物理传输由操作系统和 DMA 完成。 二数据流动的层次结构 计算机系统中数据从程序到磁盘或反向的流动通常经过以下层级 程序中的 IO 流 → 用户空间缓冲区 → 操作系统缓存页内核空间 → 磁盘驱动 → 物理磁盘 示意图 程序代码 用户空间 内核空间 硬件层 ┌───────────┐ ┌─────────────┐ ┌──────────────┐ ┌────────┐ │ IO 流 │ → → → │ 用户缓冲区 │ → → → │ Page Cache │ → → → │ 磁盘 │ └───────────┘ └─────────────┘ └──────────────┘ └────────┘程序层 操作系统层 物理层 而零拷贝技术是减少用户空间和内存空间之间数据传输的次数接下来将进入零拷贝的讲解。 三零拷贝 零拷贝Zero-copy 是一种优化技术旨在 减少或消除数据在内存中的冗余复制操作从而提升 I/O 性能。它主要作用于 用户空间内存与内核空间内存之间的数据传输但最终目标是减少整个数据链路从磁盘到网络、或内存到外设中的复制次数。 对于Java应用层来说零拷贝有mmap和sendFile两种方式。 1.传统IO文件读写 说零拷贝技术之前要先了解传统的IO文件读写是怎么样的才能更好的理解零拷贝技术下面先说传统IO的读写工作流程。 传统IO文件读写 传统IO文件读写如下图1-1所示 图1-1 传统IO文件读写流程图 传统IO文件读写工作流程 整体流程 Java 程序 → 用户空间 → 内核空间Page Cache → 磁盘修改数据 ↑↓读写 DMA 传输 流程分三个阶段读取数据 → 修改数据 → 写回数 详细步骤与层级交互 (1) 打开文件 Java 代码使用 FileInputStream、FileChannel 或 RandomAccessFile 打开文件。 系统调用open()触发内核创建文件描述符建立程序与文件的连接。 (2) 读取数据磁盘 → 内核空间 → 用户空间 磁盘到内核空间Page Cache DMA 传输磁盘控制器通过 DMA直接内存访问 将文件数据直接读取到内核的 Page Cache无需 CPU 参与。 触发方式Java 调用 FileChannel.read(ByteBuffer) 或 InputStream.read()底层触发 read() 系统调用。 内核空间到用户空间 数据拷贝内核将 Page Cache 中的数据复制到用户空间的缓冲区如 byte[] 或 ByteBuffer。 性能开销此拷贝由 CPU 完成是小文件读取的主要性能瓶颈。 (3) 修改数据用户空间内操作 Java 操作在用户空间的缓冲区中修改数据如字符串替换、字节操作。 示例 String content new String(buffer.array(), StandardCharsets.UTF_8); String modifiedContent content.replace(old, new); byte[] newData modifiedContent.getBytes(StandardCharsets.UTF_8); (4) 写回数据用户空间 → 内核空间 → 磁盘 用户空间到内核空间Page Cache 数据拷贝用户空间的修改后数据通过 FileChannel.write(ByteBuffer) 或 OutputStream.write() 触发 write() 系统调用将数据复制到内核的 Page Cache。 延迟写入数据暂存于 Page Cache不会立即写入磁盘。 内核空间到磁盘 DMA 传输操作系统通过 DMA 将 Page Cache 中的数据异步写入磁盘。 刷盘时机 定时刷盘由内核线程如 pdflush定期将脏页修改过的数据写入磁盘。 强制刷盘调用 FileChannel.force(true) 触发 fsync() 系统调用确保数据持久化。 (5) 关闭文件 Java 代码调用 close() 释放文件描述符。 系统调用close()释放内核资源。 2.mmap 零拷贝技术 mmap 零拷贝技术 的核心是通过内存映射文件Memory-Mapped File将文件内容直接映射到用户空间的虚拟内存从而避免传统 I/O 中用户空间与内核空间之间的数据拷贝。 mmap零拷贝技术IO读写 IO文mmap零拷贝技术文件读写如下图1-2所示 图2-1 mmap零拷贝技术文件读写流程图 mmap零拷贝IO文件读写工作流程 工作流程概述 磁盘 → Page Cache →内存映射→ 用户空间虚拟内存 →修改数据→ Page Cache → 磁盘 详细步骤 1. 打开文件并创建内存映射 用户空间 使用 FileChannel.map() 将文件映射到用户空间的虚拟内存。 内核空间 内核将文件的磁盘块映射到 Page Cache并建立用户空间虚拟内存与 Page Cache 的映射关系。 代码示例 FileChannel channel FileChannel.open(Paths.get(file.txt), StandardOpenOption.READ, StandardOpenOption.WRITE); MappedByteBuffer buffer channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size()); 2. 读取数据 用户空间 用户程序直接通过 MappedByteBuffer 访问数据无需显式调用 read()。 内核空间 若数据未加载到 Page Cache触发缺页中断内核从磁盘读取数据到 Page Cache。 零拷贝 数据直接从 Page Cache 映射到用户空间无需复制到用户缓冲区。 3. 修改数据 用户空间 用户程序直接修改 MappedByteBuffer 中的数据。 内核空间 修改后的数据标记为 脏页Dirty Page暂存于 Page Cache。 4. 写回磁盘 用户空间 调用 buffer.force() 强制将脏页刷回磁盘。 内核空间 内核将脏页从 Page Cache 写回磁盘的对应位置。 代码示例 buffer.force(); // 强制刷盘 5. 关闭映射 用户空间 关闭 FileChannel释放映射的内存区域。 内核空间 解除内存映射释放相关资源。 代码示例 channel.close(); 3.sendFile 零拷贝技术 早期的sendFile其实和mmap一样实现机制还是依靠CPU进行页缓存与socket缓存区之间的数据拷贝如图3-1所示。 图3-1 早期的sendFile 读写流程图 从Linux内核2.6.33版本开始引入了对 Scatter-Gather DMA分散-聚集 DMA 的支持优化了实现机制在拷贝过程中并不直接拷贝文件的内容而是只拷贝一个带有文件位置和长度等信息的文件描述符FD这样子就大大减少了需要传递的数据。而真实的数据内容会交由DMA控制器从页缓存中打包异步发送到socket中。如图3-2所示。 图3-2 Linux内核2.6.33 版本 sendFile 读写流程图 注意: sendfile 系统调用 的主要设计目标是 将文件数据高效地发送到网络套接字因此它 不支持将用户空间的数据直接写入磁盘。 工作流程概述 磁盘 → Page Cache →sendfile→ 网卡 详细步骤 1. 打开文件 用户空间 使用 FileChannel 打开文件。 内核空间 内核将文件的磁盘块映射到 Page Cache。 代码示例 FileChannel fileChannel new FileInputStream(file.txt).getChannel(); 2. 打开网络套接字 用户空间 使用 SocketChannel 打开网络连接。 内核空间 内核创建 Socket Buffer用于管理网络数据。 代码示例 SocketChannel socketChannel SocketChannel.open(new InetSocketAddress(host, 8080)); 3. 使用 sendfile 发送数据 用户空间 调用 FileChannel.transferTo()底层使用 sendfile 系统调用。 内核空间 数据直接从 Page Cache 通过 DMA 发送到网卡绕过用户空间。 代码示例 fileChannel.transferTo(0, fileChannel.size(), socketChannel); // 零拷贝发送 4. 关闭资源 用户空间 关闭 FileChannel 和 SocketChannel释放资源。 内核空间 释放 Page Cache 和 Socket Buffer 资源。 代码示例 fileChannel.close(); socketChannel.close();
http://www.ho-use.cn/article/10821329.html

相关文章:

  • 广州模板网站建设费用备案变更网站信息
  • wordpress建一个网站吗福永医院网站建设
  • 上海免费建网站深圳画册设计工作室
  • 网站建设咨询有客诚信网站建网站半年了 没有流量
  • 网站治做啊app房屋租赁系统网站开发
  • 什么叫做响应式网站网络营销网站设计
  • 30天网站建设实录素材wordpress标签是什么
  • 网站设计培训学校找哪家头像制作器在线制作
  • 毕业设计和论文网站做网站公司项目的流程
  • 昆明优化网站公司网站技术方案
  • 上海外贸网站制作花瓣网免费素材图库官网
  • 做一份seo网站诊断美工网站做兼职
  • windows 2003做网站浏览器正能量网站免费
  • 深圳市城乡建设部网站首页网站建设品牌策划方案
  • 地区网站建设服务周到官方网站如何建立
  • 门户网站建设管理工作的意见公司官网怎么做的
  • 做调研的网站一般有哪些电子商务网站制作步骤
  • 生活分类信息网站大全百度搜索优化平台
  • 如何给自己的公司做网站wordpress自动alt图片
  • 导航网站没有内页没有了企业网站不备案
  • 交易平台网站建设项目需求常德软件开发
  • 网站首页制作流程网站前台乱码
  • 怎样建设网络游戏网站做英文网站常用的字体
  • 网站建设与设计ppt模板下载建平台网站费用
  • dede视频网站模板网站介绍流程
  • 工厂拿货回家加工合肥seo网站优化培训
  • 公司建站费用广告海报图片
  • 如何实现网站开发手机验证码网站是否上线
  • 济南网站建设优化熊掌号网站建设与维护项目六
  • 电子商务网站的设计工具0735郴州新网招聘