成都网站排名生客seo怎么样,南宁优化网站收费,库尔勒市第六小学地址,网站策划书结尾再解释三者之前我们需要先了解几个概念#xff1a; 阻塞、非阻塞#xff1a;是相较于线程来说的#xff0c;如果是阻塞则线程无法往下执行#xff0c;不阻塞#xff0c;则线程可以继续往下 执行。同步、异步#xff1a;是相较于IO来说的#xff0c;同步需要等待IO操作完…再解释三者之前我们需要先了解几个概念 阻塞、非阻塞是相较于线程来说的如果是阻塞则线程无法往下执行不阻塞则线程可以继续往下 执行。同步、异步是相较于IO来说的同步需要等待IO操作完毕后再往下执行异步等待IO执行完毕后被通知去操作数据就好了。
此时我们将这四个概念组合起来就是BIO、NIO和AIO了。
1、BIO(Blocking I/O) BIO是同步阻塞模型他再进行IO操作时需要进行等待等待IO操作完成才能继续往下执行再没有数据可读时它会阻塞再这里不继续往下执行直到有数据可读。这样的模型时很浪费资源的。 而且这种同步阻塞模式下一个线程只能监测一个socket端口因为如果检测两个socket一个因为第一个socket迟迟没有可读操作一直阻塞着则第二个socket即便有可读操作也无法进行读取因为线程没有执行到那里。两个就如此麻烦跟不用说更多socket了。所以再这种情况下需要创建很多线程。 例如当我们去散步路过早餐店买早点但包子还要一会儿才能熟我们要在这一直等等到熟了买好了才能继续散步而不是先去散步等散步回来后路过再买。这个等待时间也是成本。
适用场景
BIO模型适用于简单的I/O操作特别是在单线程环境下。由于BIO模型使用阻塞式I/O操作它在处理少量并发连接时可能会比较简单和直观。因此对于一些简单的网络服务或小型应用程序来说BIO模型可能是一个合适的选择。
2、NIO(Non-blocking I/O) NIO是同步非阻塞模型这个模型通过使用多路复用器将进行分离由一个选择器(select)大量的文件描述符(一个文件描述符代表着一个socket因为再linux中万物皆文件)当有事件发生时选择器会接收到消息并将这些有事件发生的管道返回给应用程序进行处理。当然选择器返回给应用程序的是哪些管道有事件发生并没有进行操作所以读取这些操作还得有自己进行读取再这里就是同步。并不进行阻塞因为通过选择器将监测和读取进行了分离使这个模型不再阻塞。 这就相当于早餐店老板充当选择器当我想买包子时虽然还没好但我会告诉老板我想要买包子等包子好了和我说当包子好了时老板会打电话告诉所有预约包子事件的人比如我包子好了快来拿。此时我就需要自己回去取包子吃。
适用场景
NIO模型适用于需要处理大量并发连接的场景。由于NIO模型使用非阻塞式I/O操作和事件驱动的方式它能够更高效地处理大量的并发连接适合于构建高性能的网络服务或服务器应用程序。
3、AIO(Asynchronous I/O AIO是异步非阻塞模型它允许应用程序在发起I/O操作后继续执行其他任务例如再NIO中他不需要自己去等待而是待有事件发生时再去读取而AIO则可以做到连读取都不需要自己读取而是系统内核帮忙把数据都读取好了自己再过去处理数据就好了。 相当于当包子熟了后不是自己过去取包子而是包子店老板把包子打包好送到你面前吃就好了。
适用场景 AIO模型适用于需要处理大量I/O操作且每个操作耗时较长的场景比如数据库访问、磁盘读写、网络数据传输等。由于AIO模型使用异步I/O操作它能够在等待I/O操作完成时执行其他任务提高了系统的并发性能和资源利用率。
4、总结 再前面我并没有说异步阻塞因为我觉得这两者的组合并没有什么用好像也没有具体实现的模型所有我并没有说它。 总的来说选择合适的I/O模型需要考虑到应用程序的需求、系统的特性以及预期的并发连接数量和I/O操作类型。不同的场景可能需要选择不同的I/O模型来获得最佳的性能和效率。 ps在Java中AIO模型的实现是通过NIO.2来实现的。NIO.2提供了对AIO模型的支持使得开发者可以更方便地使用异步I/O操作来构建高性能的应用程序。