<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/doc/base/IO/NIO/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/doc/base/IO/NIO/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/doc/base/IO/NIO/scalable-io-in-java/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/base/IO/NIO/scalable-io-in-java/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introscalable-io-in-java">
 Intro(Scalable IO in Java)
 &lt;a class="anchor" href="#introscalable-io-in-java">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>Scalable network services&lt;/li>
&lt;li>Event-driven processing&lt;/li>
&lt;li>Reactor pattern
&lt;ol>
&lt;li>Basic version&lt;/li>
&lt;li>Multithreaded versions&lt;/li>
&lt;li>Other variants&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>Walkthrough of java.nio nonblocking IO APIs&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;h3 id="network-services">
 Network Services
 &lt;a class="anchor" href="#network-services">#&lt;/a>
&lt;/h3>
&lt;div class="alert flat tip">&lt;p class="title"> &lt;/p>&lt;p> &lt;strong>Web services, Distributed Objects, etc. Most have same basic structure:&lt;/strong>
&lt;br>   &lt;code>Read request&lt;/code> ➠ &lt;code>Decode request&lt;/code> ➠ &lt;code>Process service&lt;/code> ➠ &lt;code>Encode reply&lt;/code> ➠ &lt;code>Send reply&lt;/code>
&lt;br>&lt;strong>&amp;quot; But differ in nature and cost of each step XML parsing, File transfer, Web page generation, computational services, &amp;hellip;&lt;/strong>&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/base/IO/NIO/zero-copy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/base/IO/NIO/zero-copy/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introzero-copy">
 Intro(ZERO COPY)
 &lt;a class="anchor" href="#introzero-copy">#&lt;/a>
&lt;/h2>
&lt;div class="alert callout attention">&lt;p class="title">&lt;span class="icon icon icon-attention">&lt;/span> Caution &lt;/p>&lt;p> 下述零拷贝内容翻译自 


 &lt;a href="https://developer.ibm.com/articles/j-zerocopy/" rel="noopener" target="_blank">Efficient data transfer through zero copy&lt;/a>&lt;/p>
&lt;/p>&lt;/div>
&lt;ul>
&lt;li>
&lt;h3 id="概览">
 概览
 &lt;a class="anchor" href="#%e6%a6%82%e8%a7%88">#&lt;/a>
&lt;/h3>
&lt;p class="warn">许多 Web 应用程序提供大量的就静态内容，这相当于从从磁盘读取数据并将完全相同的数据写回响应的 socket。此活动似乎只需要相对较少的 CPU 活动，但是在某种程度上是低效的。内核从磁盘读取数据，并将其跨越内核用户边界推送到应用程序，然后再跨越一次推送到需要被写的 socket。实际上，应用程序充当一个低效的中介，将数据从磁盘文件传输到 socket。
&lt;br>&lt;br>每一次数据从用户内核空间移动的时候，必须被复制，这会消耗 CPU 循环和内存带宽。幸运的是，你可以通过一个叫 &lt;code>ZERO COPY&lt;/code> &lt;strong>零拷贝&lt;/strong> 的技术减少这些复制。使用零拷贝的应用程序请求内核直接将数据从磁盘文件复制到 socket，而不需要经过应用程序。零拷贝极大的提高了应用程序的性能和减少了用户内核空间上下文切换的次数。
&lt;br>&lt;br>Java 类库通过&lt;code>java.nio.channels.FileChannel&lt;/code>中的&lt;code>transferTo()&lt;/code>方法在 Linux 和 Unix 系统上支持零拷贝。你可以使用&lt;code>transferTo()&lt;/code>方法直接传输数据从被调用的 channel 到另外一个可写的 channel，而不需要数据流经应用程序。这篇文章首先演示了通过传统复制进行简单文件传输所带来的开销，然后展示了使用&lt;code>transferTo()&lt;/code>的零拷贝技术如何获得更好地性能。&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="数据传输传统方式">
 数据传输：传统方式
 &lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e4%bc%a0%e8%be%93%e4%bc%a0%e7%bb%9f%e6%96%b9%e5%bc%8f">#&lt;/a>
&lt;/h3>
&lt;p class="warn">思考一种场景：从文件中读取数据并通过网络将数据传输到另一个程序。（此场景描述了许多服务器应用程序的行为，包括提供静态内容的 Web 应用程序，FTP 服务器，邮件服务器等。）该操作的核心在清单1 中的两个调用中。或者下载 


 &lt;a href="https://s3.us.cloud-object-storage.appdomain.cloud/developer/default/articles/j-zerocopy/static/j-zerocopy.zip" rel="noopener" target="_blank">完整的样例代码&lt;/a>&lt;/p>
&lt;h4 id="清单1拷贝字节从文件到socket">
 清单1，拷贝字节从文件到socket
 &lt;a class="anchor" href="#%e6%b8%85%e5%8d%951%e6%8b%b7%e8%b4%9d%e5%ad%97%e8%8a%82%e4%bb%8e%e6%96%87%e4%bb%b6%e5%88%b0socket">#&lt;/a>
&lt;/h4>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">File.read(fileDesc, buf, len);
Socket.send(socket, buf, len);
&lt;/code>&lt;/pre>&lt;/div>
&lt;p>虽然清单1 在概念上很简单，但在内部，拷贝操作需要在用户模式和内核模式之间进行四个上下文切换，并在操作完成之前将数据复制四次。
&lt;br>下图显示了数据在内部移动从一个文件到 socket&lt;/p></description></item></channel></rss>