NIO技术助力高效图片服务 (nio图片服务器)

在当今互联网时代,图片已经成为人们生活中不可或缺的一部分,各种社交媒体、电商平台、游戏应用等都需要大量的图片资源来丰富内容,提升用户体验。而对于这些需要大量图片资源的应用,高效的图片服务是十分必要的。NIO技术便能够助力高效图片服务的实现。

一、NIO技术简介

NIO,即New Input/Output,是Java在JDK1.4中新增加的一套I/O处理API。与传统的I/O流不同,NIO是基于通道和缓冲区的I/O操作,其中通道可以理解为在程序与外界之间打开的一个连接,缓冲区则是一块内存区域,用于缓存要读入或要输出的数据。相比传统的I/O流,NIO在进行I/O操作时可以非阻塞的进行,并且可以使用选择器来轮询多个通道的状态,从而使得一个程序可以处理多个通道的I/O操作,大大提升了程序的效率。

二、NIO技术在高效图片服务中的应用

1. 图片上传

对于图片上传这个过程而言,NIO技术的非阻塞I/O操作可以很好的应用。在传统的I/O操作中,上传图片需要保持I/O流的打开状态,而NIO则通过通道和缓冲区的I/O操作可以使程序只需要在数据读入内存缓冲区后便可以关闭I/O通道,从而提高了服务器的资源利用率。此外,NIO还可以使用选择器,轮询多个通道的状态,从而更加高效地处理多个文件上传请求。

2. 图片下载

对于图片下载这个过程而言,NIO技术可以通过“零拷贝”技术来提升效率。传统的I/O操作在进行文件读取时需要经过两个阶段:将文件从磁盘读到内核缓冲区,再从内核缓冲区中将文件数据复制到用户缓冲区。而NIO技术则可以通过直接缓冲区的方式,将内核缓冲区与用户缓冲区的数据复制省略,从而提高了传输效率。

3. 图片缩放

对于图片缩放这个过程而言,NIO技术可以通过使用内存映射文件技术来提高效率。在传统的I/O操作中,通常需要将图片从磁盘中读取到内存中进行操作,而内存映射文件技术则可以通过将文件映射到内存中的虚拟地址空间来避免了这个过程,从而加速了对于图片缩放的处理。

三、结语

NIO技术的优势在高效图片服务的应用中得到了很好的体现,它的应用使得图片上传、图片下载和图片缩放的效率得到了很大的提升,从而为用户带来了更加高效的体验。随着互联网时代的不断进步,NIO技术的应用也会在未来得到进一步的加强和发展,为人们提供更加高效的服务。

相关问题拓展阅读:

Java中IO与NIO的区别和使用场景

java.NIO包里包括三个基本的组件

l buffer:因为NIO是基于缓冲的,所以buffer是更底层的必要类,这也是IO和NIO的根本不同,虽然stream等有buffer开头的扩展类,但只是流的包装类,还是从流读到缓冲区,而NIO却是直接读到buffer中进行操作。

因为读取的都是字节,所以在操作文字时,要用charset类进行编解码操作。

l channel:类似于IO的stream,但是不同的是除了FileChannel,其他的channel都能以非阻塞状态运行。FileChannel执行的是文件的操作,可以直接DMA操作内存而不依赖于CPU。其他比如socketchannel就可以在数据准备好时才进行调用。

l selector:用于分发请求到不同的channel,这样才能确保channel不处于阻塞状态就可以收发消息。

面向流与面向缓冲

Java NIO和IO之间之一个更大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

补充一点:NIO的buffer可以使用直接内存缓冲区,该缓冲区不在JVM中,性能会比JVM的缓冲区略好,不过会增加相应的垃圾回收的负担,因为JVM缓冲区的性能已经足够好,所以除非在对缓冲有特别要求的地方使用直接缓冲区,尽量使用JVM缓冲。

阻塞与非阻塞

Java IO是阻塞式的操作,当一个inputstream或outputstream在进行read()或write()操作时,是一直处于等待状态的,直到有数据读/写入后才进行处理.而NIO是非阻塞式的,当进行读写操昌缓作时,只会返回当前已经准备好的数据耐帆模,没有就返回空,这样当前线程就可以处理其他的事情,提高了资源的使用率.

与传统IO的优势

在老的IO包中,serverSocket和socket都是阻塞式的,因此一旦有大规模的并发行为,而每一个访问都会开启一个新线程。这时会有大规模的线程上下文切换操作(因为都在等待,所以资源全都被已有的线程吃掉了),这时无论是等待的线程还是正在处理的线程,响应率都会下降,并且会影响新的线程。

而NIO包中的serverSocket和socket就不是这样,只要注册到一个selector中,当有数据放入通道的时候,selector就会得知哪些channel就绪,这时就可以做响应的处理,这样服务端只有一个线程就可以处理大部分情况(当然有些持续性操作,比如上传下载一个大文件,用NIO的方式不会比IO好)。

通过两个图的比较,可以看出IO是直连的,每个请求都给一条线程来处理,但是NIO却是基于反应堆(selector)来处理,直到读写的数据准备好后,才会通知相应的线程来进行处理。一言以蔽之:“selector不会让channel白占资源,没事的时候给我去轿滚睡觉。”

PS:NIO基于字节进行传输,在IO时要注意decode/encode。

在java2以前,传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。java5以后使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以茄物每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力。

NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。

反应器(Reactor):用于事件多路分离和分派的体系结构模式

通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。

一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。

另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读蔽纳桥就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。

传统的阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。

非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出宏猛现资源不足的情况。非阻塞的核心优势就在这里。

为什么会这样,下面就对他们做进一步细致具体的分析:

首先,我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下,传统IO编写容易方便使用。但是随着连接数的增多,问题传统IO就不行了。因为前面说过,传统IO处理每个连接都要消耗一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。这里我们得出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接。

然后,非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理 10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2023个线程来处理。因为非阻塞IO处理连接是异步的。当某个链接发送请求到服务器,服务器把这个连接请求当作一个请求”事件”,并把这个”事件”分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。

所谓阻塞式IO流,就是指在从数据流当中读写数据的的时候,阻塞当前线程,直到IO流可以

重新使用为止,你也可以使用流的avaliableBytes()函数看看当前流当中有多少字节可以读取,这样

就不会再阻塞了。

nio图片服务器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于nio图片服务器,NIO技术助力高效图片服务,Java中IO与NIO的区别和使用场景的信息别忘了在本站进行查找喔。


数据运维技术 » NIO技术助力高效图片服务 (nio图片服务器)