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

中职学校网站建设方案google开户

中职学校网站建设方案,google开户,wordpress 关闭自动更新,怎样用模板做网站前言 关于IO, 想必你听过很多中I/O方式, 有的是OS视角的, 有的是JDK本身支持的, 有的是纯实现视角。但是作为一个developer, 我希望你能先搞清楚上下文之后, 再去理解内容, 否则容易抬杠。这个上下文有横向和纵向两个维度。纵向维度包括JDK底层, JDK上层包装库, 开发框架(如Ne…

前言

关于IO, 想必你听过很多中I/O方式, 有的是OS视角的, 有的是JDK本身支持的, 有的是纯实现视角。但是作为一个developer, 我希望你能先搞清楚上下文之后, 再去理解内容, 否则容易抬杠。这个上下文有横向和纵向两个维度。纵向维度包括JDK底层, JDK上层包装库, 开发框架(如Netty)等。 横向的比如在JDK底层实现中支持BIO和NIO, 在JDK上层包装库维度支持BIO、NIO和AIO。开发框架Netty中包含BIO, NIO和OIO。在不同的上下文, 虽然字母缩写是一致的, 但内容却大相径庭。在这里, 我想聊的是JDK中提供的两种最基础的具体实现BIO和NIO。之所以写在这里, 因为这最基础的IO是上层所有IO方式的基础, 而打好基础非常关键。


一、BIO(Blocked I/O)

1. read过程

在这里插入图片描述

  1. 应用获取InputStream, 可能是FileInputStream或者Socket的InputStream;
  2. 应用创建user buffer;
  3. 应用调用InputStream的read(buffer)获取读取的字节数, JVM发起系统调用;
  4. 内核创建Kernel buffer, 读取目标文件描述符并将结果写入Kernel buffer;
  5. 内核将Kerne buffer中读取的数据复制到User buffer中。User buffer填充满或者读取结束后应用侧方法返回;
  6. 应用侧从buffer中获取读取的字节数, 做必要的业务处理;
  7. 重复3-6, 直到读取完成;

2. write过程

在这里插入图片描述

  1. 应用获取OutputStream, 可能是FileOutputStream或者Socket的OutputStream;
  2. 应用创建user buffer;
  3. 应用填充数据到user buffer;
  4. 应用侧调用OutputStream的write(buffer)写出, JVM发起系统调用;
  5. 内核创建Kernel buffer, 并复制User buffer中的数据, 然后将Kernel buffer中的数据写入目标文件描述符, 写入完成后系统调用结束, 应用侧方法调用返回;
  6. 重复3-5直到写入完成

3. 读取文件并发送到网络

在这里插入图片描述
这里我们尝试优化下:

  1. 咱们是读取并转发, 文件从Kernel Buffer复制到User buffer再复制到Kernel buffer, 但实际上应用侧未做任何加工, 因此文件内容不变, 3个buffer的内容是一样的。
  2. 从逻辑的角度, 应用层不需要参与具体IO, 仅仅是告诉内核从哪里Input然后Output到哪里即可。
  3. 从空间占用的角度, 重用一个Kernel Buffer, 将文件内容读取然后发送到Socket。由于复用同一个buffer, 又省去了内存拷贝的开销。
    其实这就是NIO的实现思路。

二、NIO

1.read(get)过程

在这里插入图片描述

  1. 应用获取Channel;
  2. 应用通过channel.map创建内存映射, 将文件的某个部分[offset, length] 和buffer对应起来。此外该buffer对应用和内核均可见;
  3. 应用调用channel.load加载目标内容片段, JVM发起系统调用通知内核加载目标内容。
  4. 内核加载完成后暴露一个内核管理的但是在应用侧又可操作性的buffer, 内核加载过程除了最终暴露的buffer不同其他与BIO过程一致。在load过程中当前线程也是阻塞的。
  5. 后续应用侧可以直接通过应用可见的MappedBuffer读取数据(由于该原因, 图中直接将读取描述为逻辑上与内核无关的操作)
  6. 此外, 对于内存映射文件, 我们不仅可以读取也可以写入, 而后通过force将变更刷新到文件, 相当于BIO中的flush。

2. write(put)过程

在这里插入图片描述

  1. 应用获取Channel;
  2. 应用创建buffer, 该buffer对内核也是可见的;
  3. 应用填充数据到buffer;
  4. 应用调用channel的put(buffer)写出, JVM发起系统调用;
  5. 内核不再创建自己的buffer, 而是直接把已有的buffer中的数据写入文件, 写入完成后系统调用返回;

3. 读取文件并发送到网络

在这里插入图片描述
从图中我们可以看到, 文件数据并没有在应用侧出现, 此外也仅创建了一个Kernel Buffer, 实现了从应用侧仅说明从哪里Input并Output到哪里, 内核完成了整个逻辑过程。

三、两者比较

BIO: 面向Stream, 读写以byte为单位, 需要user buffer和kernel buffer协同(必要时需要两者互相copy)。对内核和JDK版本没要求, 兼容性强, 但效率低。
NIO: 面向Channel, 读写以buffer为单位, user和kernel公用一个buffer(相比于BIO尽可能少copy)。对内核和JDK版本有要求, 兼容性差, 但效率高。


小结

以上就是今天想聊的全部内容, 希望能帮助你对IO的概念,JDK中BIO和NIO的实现基本过程有更深入的理解。

http://www.hrbkazy.com/news/43436.html

相关文章:

  • 访客浏览网站 网站怎么跟踪搜索引擎免费登录入口
  • 网站改版需要多少钱关键词优化报价推荐
  • 越南做网站网络营销促销方案
  • 公司做网站怎么构思域名注册服务网站查询
  • 上海网站建设联系电话充电宝seo关键词优化
  • wordpress 加载文件太多优化设计答案六年级上册语文
  • 扁平配色网站百度知道网址
  • 企业为何要建设网站正版seo搜索引擎
  • vs怎么添加做网站搜外友链平台
  • 网站变灰是什么事进入百度搜索网站
  • 旅游网站建设与网页设计竞价推广代运营公司
  • id97网站怎么做的如何做推广呢
  • 做网站看今日热榜官网
  • title 网站建设超能搜索引擎系统网站
  • 建筑挂靠网黄山网站seo
  • 专业网站建设策划模板建站难吗
  • 网站建设开发团队介绍简述网站建设的一般流程
  • 安顺做网站名词解释搜索引擎优化
  • 无极磁铁网站可以免费发布广告的平台有哪些
  • APP黄色网站电脑培训班速成班
  • 网站建设需要java吗网络推广服务外包
  • 余姚什么网站做装修比较好怎么查百度搜索排名
  • 网站建设要学多久竞价托管哪家公司好
  • 徐州网站建设公司哪家好完美日记网络营销策划书
  • WordPress 错误记录宁波seo如何做推广平台
  • 深圳做网站公司地点网络营销的营销策略
  • 网站做多宽西地那非片
  • 动态网站期末设计石家庄关键词优化软件
  • 长宁区建设交通委员会网站交换友情链接时需要注意的事项
  • 重庆网站建设制作公司1个百度指数代表多少搜索