<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
    <title>bigfish的网络博客 - IO</title>
    <subtitle>记录技术和生活</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.laofu.online/tags/io/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.laofu.online"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2020-02-03T10:00:00+08:00</updated>
    <id>https://blog.laofu.online/tags/io/atom.xml</id>
    <entry xml:lang="zh">
        <title>Java 如何实现零拷贝</title>
        <published>2020-02-03T10:00:00+08:00</published>
        <updated>2020-02-03T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/zero-copy/"/>
        <id>https://blog.laofu.online/blog/zero-copy/</id>
        
        <summary type="html">&lt;h3 id=&quot;shen-me-shi-ling-kao-bei&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#shen-me-shi-ling-kao-bei&quot; aria-label=&quot;Anchor link for: shen-me-shi-ling-kao-bei&quot;&gt;什么是零拷贝&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在操作系统中，从内核的形态区分，可以分为内核态（Kernel Space）和用户态（User Space）。&lt;/p&gt;
&lt;p&gt;在传统的IO中，如果把数据通过网络发送到指定端的时候，数据需要经历下面的几个过程：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/zero-copy/01.png&quot; alt=&quot;IO&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;当调用系统函数的时候，CPU执行一系列准备工作，然后把请求发送给DMA处理（DMA可以理解为专门处理IO的组件），DMA将硬盘数据通过总线传输到内存中。&lt;/li&gt;
&lt;li&gt;当程序需要读取内存的时候，这个时候会执行&lt;code&gt;CPU Copy&lt;/code&gt;,内存会有内核态写入用户的缓存区。&lt;/li&gt;
&lt;li&gt;系统调用write()方法时，数据从用户态缓冲区写入到网络缓冲区(Socket Buffer)， 由用户态编程内核态。&lt;/li&gt;
&lt;li&gt;最后由DMA写入网卡驱动中，传输到网卡的驱动。&lt;/li&gt;
&lt;/ol&gt;</summary>
        
    </entry>
    <entry xml:lang="zh">
        <title>select、poll、epoll 的区别</title>
        <published>2020-01-26T10:00:00+08:00</published>
        <updated>2020-01-26T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/select-poll-epoll/"/>
        <id>https://blog.laofu.online/blog/select-poll-epoll/</id>
        
        <summary type="html">&lt;p&gt;在多路复用的IO的模型中，存在三种机制，分别是&lt;code&gt;select&lt;/code&gt;，&lt;code&gt;poll&lt;/code&gt;和&lt;code&gt;epoll&lt;/code&gt;.为了便于理解，可以使用简单的伪代码来表示一个原始的IO的读写：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;     while&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     {&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;          for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8&quot;&gt;Stream&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;:&lt;/span&gt;&lt;span&gt; streamArr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          {&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;               if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3&quot;&gt;i&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;isNotReady&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-13 z-d-8&quot;&gt;                    continue&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-6&quot;&gt;               doSomething&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     }&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
        
    </entry>
</feed>
