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

辽宁城乡建设厅网站学做古典家具网站

辽宁城乡建设厅网站,学做古典家具网站,it教育培训机构排名,免费做简历的网站前言 关于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过程 应用获取InputStream, 可能是FileInputStream或者Socket的InputStream;应用创建user buffer;应用调用InputStream的read(buffer)获取读取的字节数, JVM发起系统调用;内核创建Kernel buffer, 读取目标文件描述符并将结果写入Kernel buffer;内核将Kerne buffer中读取的数据复制到User buffer中。User buffer填充满或者读取结束后应用侧方法返回;应用侧从buffer中获取读取的字节数, 做必要的业务处理;重复3-6, 直到读取完成; 2. write过程 应用获取OutputStream, 可能是FileOutputStream或者Socket的OutputStream;应用创建user buffer;应用填充数据到user buffer;应用侧调用OutputStream的write(buffer)写出, JVM发起系统调用;内核创建Kernel buffer, 并复制User buffer中的数据, 然后将Kernel buffer中的数据写入目标文件描述符, 写入完成后系统调用结束, 应用侧方法调用返回;重复3-5直到写入完成 3. 读取文件并发送到网络 这里我们尝试优化下: 咱们是读取并转发, 文件从Kernel Buffer复制到User buffer再复制到Kernel buffer, 但实际上应用侧未做任何加工, 因此文件内容不变, 3个buffer的内容是一样的。从逻辑的角度, 应用层不需要参与具体IO, 仅仅是告诉内核从哪里Input然后Output到哪里即可。从空间占用的角度, 重用一个Kernel Buffer, 将文件内容读取然后发送到Socket。由于复用同一个buffer, 又省去了内存拷贝的开销。 其实这就是NIO的实现思路。 二、NIO 1.read(get)过程 应用获取Channel;应用通过channel.map创建内存映射, 将文件的某个部分[offset, length] 和buffer对应起来。此外该buffer对应用和内核均可见;应用调用channel.load加载目标内容片段, JVM发起系统调用通知内核加载目标内容。内核加载完成后暴露一个内核管理的但是在应用侧又可操作性的buffer, 内核加载过程除了最终暴露的buffer不同其他与BIO过程一致。在load过程中当前线程也是阻塞的。后续应用侧可以直接通过应用可见的MappedBuffer读取数据(由于该原因, 图中直接将读取描述为逻辑上与内核无关的操作)此外, 对于内存映射文件, 我们不仅可以读取也可以写入, 而后通过force将变更刷新到文件, 相当于BIO中的flush。 2. write(put)过程 应用获取Channel;应用创建buffer, 该buffer对内核也是可见的;应用填充数据到buffer;应用调用channel的put(buffer)写出, JVM发起系统调用;内核不再创建自己的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.ho-use.cn/article/10823901.html

相关文章:

  • 用仿站工具做网站电话号码查询企业
  • 想在微信公众号上做网站链接上海网址一360导航
  • 什么是网站策划书如何搭建个人博客网站
  • 网站如何绑定域名江西企业网站建设电话
  • 基础网站建设代码如何建立学校网站
  • 企业网站建设维护合同书wordpress fifth
  • 宠物用品网站建设自己做的网站怎么放到外网上
  • 金属东莞网站建设技术支持品牌建设指导性意见
  • 网站设计改版深圳猪八戒网站建设
  • 长春网站建设方案详细wordpress什么主题好
  • 深圳极速网站建设服务上海市住房与城乡建设部网站
  • 南昌专业做网站公司网站建设吧个好
  • 怎么免费开网站建设工程检测网
  • 苏州住房和城乡建设局网站如何在网站上添加备案号
  • 什么网站做一手房比较好秦皇岛最新消息今天
  • 什么网站上做效果图可以赚钱杨小刀网站建设
  • 做网站的销售员电话话术嵌入式软件开发环境有哪些
  • 自己怎样做公司广告视频网站三门县正规营销型网站建设地址
  • 给公司做一个网站谷歌在线浏览器入口
  • 烟台百度网站推广近期新闻热点
  • 网站后端怎么做松江网站建设品划网络
  • seoyoon电商seo什么意思
  • 快速做网站视频wordpress主题php
  • 电影网站开发视频长城宽带
  • 网站建设 福州电商网站开发周期
  • 网站开发者不给源代码怎么办网站首页的提交怎么做
  • 西双版纳建设局网站重庆最新新闻事件今天
  • 做网站公司不给源代码服务器网站访问慢
  • 中国沙漠建设 志愿者 兵团官方网站那个网站做视频能挣钱
  • 怎样做班级网站个人公司网站怎么做