热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通信中的BIO与NIO

从BIO到NIOBIO阻塞式的IO,NIO非阻塞式的IO。这里从一个通信的并发问题讲起。我们知道当并发量大的时候我们能够采用的解决或者是扩展方式有两种࿱

从BIO到NIO

BIO阻塞式的IO,NIO非阻塞式的IO。这里从一个通信的并发问题讲起。

我们知道当并发量大的时候我们能够采用的解决或者是扩展方式有两种:横向扩展(增大线程的数目),纵向扩展(使得每个线程得到良好的使用)。

 

在并发量大的时候我们可以启用多个线程,比如说我们常用的手段就是线程池。但是如果线程阻塞每个线程还是得不到充分的利用。这时候我们就应该使用NIO来使得每个线程的利用更加的充分,这个操作属于纵向扩展

 

这里就具体的列出BIO通信的缺点

①基于BIO的通信,每来一个客户端就会启动一个线程这样的话就会产生大量的线程。

同时由于大量的线程,会使得CPU来回切换的成本增高。

②由于阻塞,比如说read,write,accept,connect这些方法都会阻塞。所以单个线程的利用效率低。

③当一个线程被占用但是它本身并没有工作,这样的话这个线程就会出现置空期,这时CPU就只是无意义的空转。

 

NIO与BIO各有优缺点,NIO可能不擅长处理长请求(因为它可能受到一些资源调度器的控制被来回切换)。所以一般在处理长请求比如说下载大的文件使用BIO更加合适。


多路选择的引出

多路选择就器就像是一个资源调度器一样,在他的上面注册了很多的通信的线程。它的作用就是在一些线程空闲的时候将这个线程空出来供其他客户端使用。而当监听到一个客户发起请求或者是传输动作的时候就会个当前的操作分配线程。这样的话就能够灵活的使用有限的线程打出最大的伤害。

 


FileChannel与ZeroCopy

我们平常看起来的远端文件传输的背后起始隐藏着大量的拷贝操作如下图所示:

①首先从硬盘上拷贝到ReadBuffer中,这里的ReadBuffer是内核态(一种权限较高的状态,可以享有各种底层权限)。

②然后拷贝到ApplicationBuffer(这里是用户态,用户态就是将内核态的功能删减了很多然供用户来调用)。

③将ApplicationBuffer操作之后(事实上这里并不去操作),然后拷贝到SocketBuffer中。

④最后将SocketBuffer中的内容拷贝到NIC(网卡)的缓存中。

ZeroCopy的基本原理就是将中间的两步复制操作删除。如下图所示:

这样的话也就提升了效率。Java中Channel类就是基于ZeroCopy的。

transferFrom(ReadableByteChannel src, long position, long count)


推荐阅读
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
author-avatar
雅枝建彰3
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有