做百度推广是不是得有个网站先,购物网站建设公,大型网站 空间,如何建立自己个人网站我们在平常开发过程中接触最多的就是 磁盘 IO#xff08;读写文件#xff09; 和 网络 IO#xff08;网络请求和响应#xff09;。从应用程序的视角来看的话#xff0c;我们的应用程序对操作系统的内核发起 IO 调用#xff08;系统调用#xff09;#xff0c;操作系统负…我们在平常开发过程中接触最多的就是 磁盘 IO读写文件 和 网络 IO网络请求和响应。从应用程序的视角来看的话我们的应用程序对操作系统的内核发起 IO 调用系统调用操作系统负责的内核执行具体的 IO 操作。也就是说我们的应用程序实际上只是发起了 IO 操作的调用而已具体 IO 的执行是由操作系统的内核来完成的。 当应用程序发起 I/O 调用后会经历两个步骤
内核等待 I/O 设备准备好数据内核将数据从内核空间拷贝到用户空间。
首先解释一下这里的阻塞与非阻塞
阻塞IO指的是需要内核IO操作彻底完成后才返回到用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态用户空间程序需等到IO操作彻底完成。传统的IO模型都是同步阻塞IO。在java中默认创建的socket都是阻塞的。
其次解释一下同步与异步
同步IO是一种用户空间与内核空间的调用发起方式。同步IO是指用户空间线程是主动发起IO请求的一方内核空间是被动接受方。异步IO则反过来是指内核kernel是主动发起IO请求的一方用户线程是被动接受方。
同步阻塞 I/O
同步阻塞 I/O 是最简单的一种 I/O 模型。在这种模型下I/O 操作会阻塞调用线程直到操作完成。 应用程序发起 read 调用后会一直阻塞直到内核把数据拷贝到用户空间。
特点:
阻塞: 线程在发起 I/O 操作时会被阻塞直到 I/O 操作完成即数据被读入或写入。简单易用: 编程模型简单容易理解和实现。效率问题: 当有多个 I/O 操作时线程可能会因为等待 I/O 完成而浪费时间从而导致性能瓶颈。
举例BIO (Blocking I/O)
同步非阻塞 I/O
同步非阻塞 I/O 允许线程在发起 I/O 操作时立即返回线程可以在 I/O 操作未完成时继续执行其他任务。
特点:
非阻塞: I/O 操作不会阻塞线程线程可以继续执行其他任务。轮询: 需要使用轮询机制例如 select()来检查 I/O 操作是否完成从而确定是否可以读取数据。复杂性: 编程模型比阻塞 I/O 复杂需要显式地处理 I/O 操作的完成状态。 举例NIO (Non-blocking/New I/O)
过程同步非阻塞 IO 模型中应用程序会一直发起 read 调用等待数据从内核空间拷贝到用户空间的这段时间里线程依然是阻塞的直到在内核把数据拷贝到用户空间。
比较相比于同步阻塞 IO 模型同步非阻塞 IO 模型确实有了很大改进。通过轮询操作避免了一直阻塞。
问题应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。
这个时候I/O 多路复用模型 就上场了。
I/O 多路复用
I/O 多路复用 允许一个线程同时管理多个 I/O 操作。通过使用系统提供的多路复用机制线程可以等待多个 I/O 操作的完成而无需为每个操作创建一个独立的线程。
特点:
高效: 能够有效地管理多个 I/O 操作避免了为每个连接创建线程的开销。系统调用: 使用系统调用如 select()、poll()、epoll()来检查多个通道的状态。
IO 多路复用模型中线程首先发起 select 调用询问内核数据是否准备就绪等内核把数据准备好了用户线程再发起 read 调用。read 调用的过程数据从内核空间 - 用户空间还是阻塞的。
目前支持 IO 多路复用的系统调用有 selectepoll 等等。select 系统调用目前几乎在所有的操作系统上都有支持。
select 调用内核提供的系统调用它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。epoll 调用linux 2.6 内核属于 select 调用的增强版本优化了 IO 的执行效率。
IO 多路复用模型通过减少无效的系统调用减少了对 CPU 资源的消耗。
Java 中的 NIO 有一个非常重要的选择器 ( Selector ) 的概念也可以被称为 多路复用器。通过它只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后才会为其服务。 信号驱动 I/O
信号驱动 I/O 是一种基于信号的 I/O 模型通过信号通知应用程序某个 I/O 操作已准备好。应用程序可以在接收到信号时执行相应的 I/O 操作。
特点:
信号通知: 使用信号如 SIGIO来通知应用程序 I/O 操作的完成或准备好。操作系统依赖: 通常依赖于操作系统的特定实现因此在不同平台上的可移植性较差。
异步 I/O
异步 I/O 允许应用程序发起 I/O 操作后立即继续执行其他任务。当 I/O 操作完成时系统会通知应用程序并通常会调用一个回调函数来处理结果。
异步 IO 是基于事件和回调机制实现的也就是应用操作之后会直接返回不会堵塞在那里当后台处理完成操作系统会通知相应的线程进行后续的操作。
举例AIO (Asynchronous I/O)
特点:
非阻塞: 线程可以发起 I/O 操作后立即返回异步 I/O 操作会在后台完成。回调机制: 当 I/O 操作完成时系统会调用注册的回调函数。复杂性: 需要处理异步事件和回调函数编程模型较为复杂。
总结
同步阻塞 I/O: 简单易用但效率较低容易造成线程阻塞。同步非阻塞 I/O: 允许线程在 I/O 操作期间执行其他任务但需要显式轮询。I/O 多路复用: 提高了对多个 I/O 操作的处理能力适合高并发场景。信号驱动 I/O: 使用信号通知 I/O 状态变化但在不同操作系统上可移植性较差。异步 I/O: 非常高效通过回调机制处理 I/O 操作适合处理大量并发任务。
参考 程序员应该这样理解IO 如何完成一次IO IO模型知多少 10 分钟看懂 Java NIO 底层原理