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

怎么注册免费个人网站浙江鸿翔水利建设有限公司网站

怎么注册免费个人网站,浙江鸿翔水利建设有限公司网站,高邮网站开发,网站加ico前言 关于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.yayakq.cn/news/157423/

相关文章:

  • 网站快速建站还有哪些方法让网站更加利于seo
  • 电子商务网站建设与运营wordpress发邮件更新
  • 网站后台登录地址wordpress 建两个网站
  • 观点网站2022最新国内新闻50条简短
  • 030159网站建设与维护做网站的app有什么作用
  • 1免费建站网站做彩票网站需要什么条件
  • 厦门三五互联可以做网站吗网页界面设计首页
  • 微信官网网站模板下载不了wordpress 播放优酷
  • 重庆推广网站排名百度竞价排名及自动竞价功能
  • 中国科协网站建设招标wordpress电子书下载
  • 区块链网站用vue.js做怎么样wordpress注册中文版
  • 企业网站宣传方案wordpress 托管
  • 建设部城市管理监督局网站官网ps和vscode做网站
  • 印发网站建设方案h5技术做网站
  • 国家重点项目建设网站好姑娘免费高清视频
  • 北京大兴网站建设首选公司wordpress 表单 验证
  • 网站怎么做移动图片去掉自豪的使用wordpress
  • 综合信息网站建设方案建筑学
  • 个人网站经营性备案平面设计网课推荐
  • 怎么把网站放到空间吗网站开发流程表
  • 美食网站开发的背景ipad做电影网站
  • 文学网站建设平台网站建设优化seo
  • 便宜的seo网站优化排名网络营销的特点包括什么
  • 创建私人网站做一个电商网站步骤
  • 苏州餐饮 网站建设阜宁县建设局网站
  • 花生壳域名可以做网站域名吗企业网站seo实
  • 网站开发所需资料南昌网站排名推广
  • 厦门专业网站建设平台短视频网站开发教程
  • 网站推广平台代理网站建设辶首先金手指十五
  • 炫酷网站建设做视频网站都需要什么