java——io模型

02【Java的IO模型】_java io包是属于哪种io模型 如果连接大多是长连接,则会导致连接无法释放,新的请求将无法得到处理,另外,BIO这种一个请求对应一个线程的方式在应对高并发的情况下,服务器必须也要创建同等量的线程来处理客户端的请求,这样对系统的消耗是非常大的;在NIO模型中,每个请求都会有一个与服务器做数据交互的通道(Channel),所有的通道都被注册到一个选择器中(selector),当需要与服务器做数据交互时,数据通过管道写入到一个缓冲区(Buffer)中,服务器通过往缓冲区中读取数据,如果当前通道没有数据时,就什么都不会获取, 阅读详情

BIO
BIO是传统的用于网络传输的一种技术,它是一种阻塞的传输方式,例如Socket就是一种BIO传输方式。



下面给出一个Socket示例
Socket客户端、服务器示例


客户端

public class Client {
    private static final int port = 8080;
    private static final String host = "localhost";
    public static void main(String[] args) {
        System.out.println("Client...");
        Socket socket = null;
        while (true) {
            try {
                socket = new Socket(host, port);
                Client client = new Client();
                // 向服务器发送数据
                PrintStream out = new PrintStream(socket.getOutputStream());
                System.out.print("发送:");
                String line = new BufferedReader(new InputStreamReader(System.in)).readLine();
                out.println(line);

                // 读取服务端数据
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String data = reader.readLine();
                System.out.println("服务器:" + data);
                if ("OK".equals(data)) {
                    System.out.println("客户端将关闭连接");
                    Thread.sleep(500);
                    return;
                }
                reader.close();
                out.close();
            } catch (IOException | InterruptedException e) {
                System.out.println("客户端异常" + e.getMessage());
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        socket = null;
                        System.out.println("客户端finally异常" + e.getMessage());
                    }
                }
            }
        }
    }
}

简述客户端代码流程:
客户端建立一个Socket,并连接服务器路径和端口号,向服务器端发送数据,并接收服务器端产生的数据。当收到服务器端发送"OK",断开连接。


服务器

public class Server {
    private static final int port = 8080;
    private static final String host = "localhost";
    public static void main(String[] args) {
        System.out.println("server...");
        Server server = new Server();
        server.init();
    }
    public void init() {
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            while (true) {
                Socket socket = serverSocket.accept();
                new HandlerThread(socket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private class HandlerThread implements Runnable {
        private Socket socket;
        public HandlerThread(Socket socket) {
            this.socket = socket;
            new Thread(this).start();
        }

        @Override
        public void run() {
            try {
                // 读取客户端数据
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String req = reader.readLine();
                System.out.println("客户端:" + req);

                // 向客户端回复数据
                PrintStream out = new PrintStream(socket.getOutputStream());
                System.out.print("回复客户端:");
                String line = new BufferedReader(new InputStreamReader(System.in)).readLine();
                out.println(line);

                out.close();
                reader.close();
            } catch (IOException e) {
                System.out.println("服务器异常" + e.getMessage());
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        socket = null;
                        System.out.println("服务器finally异常" + e.getMessage());
                    }
                }
            }
        }
    }
}

简述服务端代码流程:
建立ServerSocket,绑定地址ip和端口号,通过accept方法监听客户端连接,该方法是阻塞的,也就是只有监听到一个客户端再继续向下执行,每次监听到一个客户端会建立一个新的线程处理该客户端的请求,读取客户端数据,向客户端发送数据,直到处理结束关闭输入输出流,断开连接。


对以上代码整体的理解:
在以上的代码中,客户端部分就是一个不断制造客户端的机器,每一个客户端发送并接收信息后关闭该连接再新建一个客户端。服务端是每次接收并发送数据后关闭该连接并accept一个新的连接。
也就是客户端发送接收一条消息后就换了一个客户端,而服务器监听到客户端请求,接收信息并回复后关闭对这个客户端的连接,监听并重新连接一个客户端。


BIO的缺陷就显现出来了,每次监听一个客户端都会导致新建立一个线程去处理该客户端的请求,如果客户端多了起来,服务器端建立这么多线程会占用很大的栈内存,服务端肯定是吃不消的。与此同时每一个线程处理客户端请求时都是阻塞的,设想一下如果某个客户端迟迟不发送请求,那么服务端该线程一直阻塞在那了。不仅阻塞还会频繁的进行线程创建和销毁以及线程上下文切换,性能下降。
此时能够想到的解决方案就是创建线程池,让线程池去分配线程能在一定程度上限制创建线程的总数,但是当客户端数变多时首先会使核心线程数占满,甚至到达最大线程数,再有新的客户端连接时被放置到阻塞队列中,当阻塞队列也满了就无法满足客户端的需求了,而且其实际上还是阻塞的,问题似乎也没得到什么解决。
----------------------------------------中间插一段-----------------------------------------
线程池为什么能在一定程度上提升性能呢?
因为线程池中的线程创建及回收成本相对较低,而且线程池可以控制线程数量,避免无休止的创建大量线程。
----------------------------------------中间插一段-----------------------------------------

这个时候NIO出现了
nio就是non-blocking io,非阻塞io。是在jdk1.4出现的,用于实现非阻塞的网络传输。其特点是编程复杂,后来netty就是在其基础上发展出来的,提供了更简单的编程方式。
nio内部的四个组件

  1. Channel
  2. Buffer
  3. Selector
  4. Selection Key

channel是用来做数据传输的通道,buffer是数据的缓冲区,通过buffer将数据写入通道,将数据从channel读到buffer。
selector是实现非阻塞io的关键,客户端和服务器各自维护一个selector,客户端通过channel与服务器建立连接,将channel的某些事件注册到selector上,(如读写事件、新的连接等,注意这些都是就绪的状态,不会发生阻塞了,就等线程去处理它了),并返回一个selection key,selection key标识了channel和selector的注册关系,可以利用它获取到对应的channel。随后一个线程轮询的访问selector中未被处理的请求并处理,该线程始终是繁忙的状态,因为它处理的都是就绪的请求,不会发生那种连接建立了,客户端却迟迟不发请求(因为服务端确定可以读了才注册到selector上),服务器死等的情况。Selector的select()方法就是从selector中获取事件的方法,如果没有事件它是阻塞的等待的。就如同server阻塞的等待客户端连接一样。
那么这样就可以用一个线程去处理多个客户端的请求了,因为阻塞不见了,过去是等待现在却可以处理别的请求了,这就是非阻塞io/nio的情况。

数据传送时涉及到数据的拷贝
传统IO模型拷贝流程:
在这里插入图片描述

  • 从磁盘读取到内核缓冲区- - -DMA引擎拷贝- - -用户态到内核态
    - DMA不经过CPU,外部设备和内存直接交换数据。
  • 内核缓冲区拷贝到用户缓冲区- - -CPU拷贝- - -内核态切换到用户态- - -拷贝到jvm内存,让用户能够对数据进行操作。
  • 用户缓冲区拷贝到socket buffer- - -CPU拷贝- - -用户态切换到内核态- - -调用write()方法将数据写入到socket缓冲区。
  • 将数据异步的拷贝到网卡buffer- - -DMA拷贝- - -write()方法返回后由内核态切换到用户态。

传统的IO拷贝涉及4次拷贝,4次上下文切换(用-内-用-内)。

NIO零拷贝之mmap优化
mmap也叫直接内存。流程如下。
在这里插入图片描述

  • 磁盘拷贝到内核缓冲区- - -DMA拷贝- - -用户态切换到内核态
  • 用户共享内核数据- - -不发生拷贝- - -内核态切换到用户态- - -怎么不复制,用户还能获取到数据呢?一会细说。
  • 内核缓冲区直接拷贝到socket缓冲区- - -CPU拷贝- - -用户态切换到内核态
  • socket缓冲区拷贝到网卡缓存- - -DMA- - -write()方法返回后由内核态切换到用户态。

过程涉及3次拷贝(2次DMA,一次CPU),以及4次上下文切换(用-内-用-内)。
现在说说第二步说的要细说的部分:对比mmap和传统io拷贝模式,其实是减少了从内核缓冲区复制到用户缓冲区的步骤,但是用户还是可以共享内核数据,它是如何做到的呢?NIO的mmap优化方式是由MappedByteBuffer类实现的,它的map() 方法实现将内核缓冲区数据复制到用户内存并返回内存地址,用户获取到这个地址,通过这个地址构造MappedByteBuffer类,以暴露各种操作文件的api。MappedByteBuffer申请的是堆外内存,因此不受MinorGC控制,只能在FullGC时回收。
DirectByteBuffer改善了这一情况,它是MappedByteBuffer的子类,实现了DirectBuffer接口,维护了一个Cleaner对象完成对象的回收,这样既可以用FullGC,又可以用clean()方法回收。
还有HeatByteBuffer,它直接申请堆内存,可受GC管控,易于回收。

NIO零拷贝之sendFile优化
linux2.1 优化
在这里插入图片描述

  • 磁盘拷贝到内核缓冲区- - -DMA拷贝- - -用户态切换到内核态
  • 内核缓冲区直接拷贝到socket缓冲区- - -CPU拷贝- - -内核态保持不变
  • socket缓冲区拷贝到网卡缓存- - -DMA- - -write()方法返回后由内核态切换到用户态。
    涉及3次拷贝,3次上下文切换(用-内-用)。相比于mmap少了一次上下文切换。

linux2.4优化
在这里插入图片描述

在2.1的基础上减少了内核缓冲区拷贝到socket缓冲区的步骤。

  • 磁盘拷贝到内核缓冲区- - -DMA拷贝- - -用户态切换到内核态
  • 内核缓冲区直接拷贝到网卡缓存(协议栈)- - -DMA拷贝- - -内核态切换到用户态

涉及2次拷贝,3次上下文切换(用-内-用)。

mmap和sendFile的区别:

  • mmap3次拷贝,4次上下文切换;sendFile涉及3或2次拷贝,3次上下文切换。
  • mmap适合小文件传输,sendFile适合大文件。
  • mmap涉及CPU拷贝,sendFile可以不涉及。
  • 在消息队列中间件中,rocketMQ消费消息采用mmap,kafka采用sendFile。

IO多路复用
IO多路复用的思想就是在通信的两端都维护用于监听的文件描述符和用于通信的文件描述符,每个文件描述符对应一块读缓冲区和一块写缓冲区。监听的文件描述符用于和对方建立连接,当建立连接后,通过通信的文件描述符来进行数据传输,服务器端有一个用于监听的文件描述符,有n个用于通信的文件描述符,用来和n个客户端通信。IO的多路复用其实就是来检测这些文件描述符的。实现方式主要有以下三种,select、poll和epoll,select支持跨平台,poll和epoll只支持linux,select检测文件描述符上限1024,poll和epoll无限制,epoll文件描述符存储底层是红黑树。一般不选择poll。
实现之select函数
如果是检测读缓冲区,select的方式需要扫描fd_set,去对应的缓冲区查看是否可读,若是则置为1,否则为0,更新好fd_set后,遍历fd_set,找到标记为1的文件描述符,如果是监听的文件描述符则进行连接,如果是通信的文件描述符则读取数据。写也类似。最大文件描述符数量为1024。
实现之poll函数
和select类似,文件描述符检测数量无上限。
实现之epoll函数
采用回调机制,维护了一系列事件处理机制,当一个文件描述符可以读了,将触发事件处理机制,一个事件处理函数被调用,性能好。

打个比方,就是养猪户小王,他养的每只猪猪都有一个猪圈,每个猪圈有2块区域,一块是猪猪上厕所区,一块是猪猪吃饭区。当上厕所区有东西小王就要对其清理,当吃饭区不满了,小王就往里添加食物。(对应文件描述符的读缓冲区和写缓冲区)。select方式相当于他要先依次遍历每个猪圈,去记录每个猪圈的情况,写到一张纸上,写完后,看着这张纸去对应的猪圈清理或者添食。而epoll方式是每个猪圈有一个按铃,当猪猪上厕所了或者饭不够吃了都会按铃,小王听见铃声过去就好了。显而易见epoll的性能会更高。

以上是我看了一些博客后对io做的一些总结和思考,有不对的地方欢迎大家指正。有些写的很简略只是简述一下原理,因为目前我还没有实践到如此深度,希望以后有机会对其补充。

JAVA IO模型 JAVA IO模型常见的IO模型有:阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型、异步IO模型。 阅读详情

相关推荐

Java三种IO模型原理实例详解

主要介绍了Java三种IO模型原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java基础之IO模型

面试喜欢问的操作系统问题:BIO,NIO,AIO

qq_40492693的博客 2342

Android逆向实战:抖音聊天记录数据库解析与导出(附完整SQL查询)

本文提供了一份Android逆向实战指南,详细解析了抖音聊天记录数据库的结构与导出方法。通过定位核心的`im.db`数据库文件,深度解读conversation_list、msg等关键表结构,并附上完整的SQL查询语句,帮助开发者或研究人员安全、合规地提取和分析本地聊天数据,适用于移动安全研究与数据分析场景。

mango的博客 859

详解Java中的五种IO模型

在学习IO模型前,需要先了解些基础概念,才能理解IO的执行流程及阻塞的原因selectpollepoll底层数据结构数组链表红黑树和双链表获取就绪的fd遍历遍历事件回调事件复杂度O(n)O(n)O(1)最大连接数1024无限制无限制fd数据拷贝每次调用select,需要将fd数据从用户空间拷贝到内核空间每次调用poll,需要将fd数据从用户空间拷贝到内核空间使用内存映射(mmap),不需要从用户空间频繁拷贝fd数据到内核空间。

从基础到源码解析的学习记录 6291

EDA与机器学习融合:智能优化芯片设计流程的工程实践

机器学习作为数据驱动的核心技术,通过从历史数据中学习复杂模式,实现对系统行为的预测与优化。其原理在于构建模型,将输入特征映射到目标变量,从而揭示数据背后的内在规律。在工程领域,这项技术的核心价值在于能够将专家经验转化为可量化、可复用的智能模型,显著提升自动化水平与决策效率。电子设计自动化(EDA)是芯片设计的关键支撑,传统流程高度依赖人工试错,面临参数空间巨大、优化周期长等挑战。将机器学习应用于EDA,能够构建预测模型来预估设计性能(PPA),或通过代理模型加速设计空间探索,实现智能化的设计辅助与优化。本文

weixin_30411239的博客 684

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 753

Java IO模型

详细介绍Java中支持的三种网络编程模型:BIO、NIO、AIO

kyrielx的博客 587

WRF移动嵌套结合伏羲模型与CFD(PALM)高精度多尺度降尺度分析研究

WRF移动嵌套(Moving Nesting):动态调整高分辨率嵌套网格位置,追踪天气系统(如台风、强对流系统)以提高局地预报精度。伏羲(Fuxi)模型:国产数值模式,提供对WRF模拟的初始及边界条件优化。CFD(Computational Fluid Dynamics)PALM模型:精细化局地流场、湍流、温度分布。

m0_57411304的博客 1716

Java 四种主要的 IO 模型

不同的IO模型在处理并发IO请求时有各自的特点和适用场景。阻塞IO模型简单易用,但在高并发情况下性能较差。非阻塞IO模型通过轮询IO状态来实现并发处理,适用于中等并发场景。IO多路复用模型通过select、poll、epoll等机制实现高并发处理。异步IO模型通过回调函数实现高并发处理,性能最佳。

qq_45607784的博客 1778

【AUTOSAR-COM】Transmission Mode 和 Transfer Property

1.COM模块的基本概念 首先在描述Transmission Mode 和 Transfer Property之前,有必要对COM模块的基本处理有一个直观的理解,我所描述的和对概念理解的也不一定完全正确。 Signal:指的是通信协议中的,一条报文中所保存的若干信号。 I-PDU:至少在COM模块中,可以理解为一条报文。 上图是在CANdb软件中编辑一个报文的Layout的界面,可以很形象的将I-PDU对等为这里的一条Message,而Signal就是需要在Message中需要摆放的Signal

tim_hoven的博客 4635

详解k-means++

一、概述 定义:k-means++是一种为k-means聚类算法选择初始值(或“种子”)的算法。它是NP-hard k-means问题的一种近似算法,它是一种避免标准k-means算法有时发现的较弱聚类的方法。 K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚

qq_42364307的博客 3万+

Java IO模型详解

主要对于Java IO模型的详细介绍

m0_53067943的博客 1540

你学Simulink--基于储能系统的建模与仿真场景:飞轮储能系统在电网调频中的作用仿真

本文详细介绍了利用Simulink+Simscape搭建飞轮储能系统(FESS)电网调频仿真模型的全过程。主要内容包括:系统工作原理及调频作用分析,基于Simulink的模块化建模步骤(飞轮、电机/发电机、功率电子接口等组件搭建),调频控制策略实现(频率检测、功率指令生成和模式切换),以及仿真参数设置与结果分析方法。该模型可有效模拟FESS在电网频率调节中的快速响应特性,为新能源存储和智能电网研究提供重要仿真工具,同时可通过参数优化和算法改进进一步提升系统性能。

xiaoheshang_123的博客 168

Java IO 模型

Java IO 模型 文章目录Java IO 模型种类BIO缺点优点代码serverclientNIO(New IO)单线程模型代码serverreactor模式代码serverAIO模型(观察者模式)代码server线程池server 种类 BIO:阻塞IO NIO:多路复用(select),同步非阻塞,since JDK1.4 AIO:异步(epoll)since JDK1.7 BIO 缺...

weixin_44048823的博客 347

【云原生进阶之容器】第六章容器网络6.6.2--Cilium部署

部署Cilium非常简单,可以通过单独的yaml文件部署全部组件(目前我使用了这个方式部署了1.7.1版本),也可以通过Helm Chart一键完成。重要的是部署环境和时机:官方建议所有部署节点都使用Linux最新稳定内核版本,这样所有的功能都能启用。作为一个Kubernetes网络组件,它应该在部署Kubernetes其他基础组件之后,才进行部署。

junbaozi的专栏 793

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java IO 模型详解:从传统 IO 到异步 IO

IO 模型主要有五种:阻塞 I/O、非阻塞 I/O、多路复用、信号驱动和异步 I/O。阻塞 I/O:应用程序执行 I/O 操作时,会一直等待数据传输完成,期间无法执行其他任务。非阻塞 I/O:应用程序执行 I/O 操作时,如果数据未准备好,立即返回错误状态,不等待数据传输完成,可执行其他任务。多路复用:允许一个线程同时管理多个 I/O 连接,适用于高并发、低延迟和高吞吐量场景,减少线程数量和上下文切换开销。信号驱动。

专注Java和MySQL领域知识分享 1257

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux网络IO模型及JAVA中IO模型

文章目录1.概述2.Linux网络IO模型2.1.阻塞IO模型2.2.非阻塞IO模型2.3.IO复用模型2.3.1.select2.3.2.poll2.3.3.epoll2.4.信号驱动IO模型2.5.异步IO3.JAVA中IO模型 1.概述 在jdk1.4之前JAVA只有同步阻塞IO,在jdk1.4版本更新同步非阻塞的NIO,在jdk1.7又更新了异步的NIO2.0,本文将简单介绍下Linux有哪些网络IO模型,以及JAVA中的IO所对应的网络IO模型。 理解本文之前需要先知道一个概念:用户空间与内核空间

凶猛的小蜜蜂 734

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java中的三种IO模型

模型类型优点缺点适用场景BIO同步阻塞简单易用高并发下性能差低连接数场景NIO同步非阻塞支持高并发,效率高实现复杂高并发网络应用AIO异步非阻塞高性能,资源利用率高编程复杂,调试困难高性能实时应用。

weixin_72973409的博客 1689

JAVA的IO模型的学习

参考: https://www.zhihu.com/question/337609338 https://blog.youkuaiyun.com/ty497122758/article/details/78979302 https://blog.youkuaiyun.com/weixin_41563161/article/details/104242190 https://blog.youkuaiyun.com/crazymakercircle/article/details/85858596 这个对IO模型讲的比较好:https://mp.

Fuly的博客 197

Java IO 模型详解

即输入/输出,描述了计算机系统与外部设备之间通信的过程。阻塞(Blocking):在阻塞I/O操作中,调用者请求I/O操作并等待操作完成。在操作完成之前,调用者被挂起,无法执行其他操作。非阻塞(Non-blocking):非阻塞I/O操作允许调用者发起I/O请求后立即继续执行,不需要等待I/O操作完成。同步(Synchronous):同步I/O操作要求程序在I/O操作完成之前保持等待状态。同步操作可以是阻塞的,也可以是非阻塞的(通过轮询实现)。异步(Asynchronous)

Yaml4的博客 1375

02【Java的IO模型】

Java共支持3种网络编程模型/IO模式,分别是:我们可以根据不同的业务场景来决定选择不同I/O处理模型;在BIO模式中,服务器会为每个客户端的请求创建一个对应的线程来处理,由该线程单独负责处理一个客户请求,如果这个连接不做任何事情会造成不必要的线程开销,为此我们可以通过线程池机制改善性能;虽然使用线程池可以一定程度上改善BIO的性能,但依旧无法冲本质上解决BIO同步阻塞的的问题;如果连接大多是长连接,则会导致连接无法释放,新的请求将无法得到处理,另外,BIO这种一个请求对应一个线程的方式在应对高并发的情况

緑水長流*z 6005

java io 模型_五种 IO 模型

IO即为Input、Output,对计算机来说,我们使用键盘鼠标给计算机指令就是一种输入,计算机将我们键盘输入的文字显示到显示器即是一种输出。或者写博客时将计算机从键盘接收到的文字信息发送到平台上即为输出,当我们查阅资料,打开某一篇博客时对计算机来说也可理解为输入。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核...

weixin_39816946的博客 132

IO模型和java IO

常见IO模型有以下几种 1.最简单的阻塞IO模型:用户线程请求数据,内核准备数据,将数据从内核复制到用户空间,从请求阻塞到获取数据,显然对资源利用率低     用餐馆的例子来解释:用户点菜,厨师准备好菜品,将菜给到用户,期间用户一直在等待,无法做别的事 2.非阻塞IO模型:用户线程请求数据,并且直接返回内核准备数据结果,如为准备好,则轮询结果,当数据准备好后,再将数据复制到用户空间,

strawberrynick的博客 549

Java-IO:简述常见的IO模型

最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。另外多路复用IO为何比非阻塞IO模型的效率高是因为在非阻塞IO中,不断地询问socket状态时通过用户线程去进行的,而在多路复用IO中,轮询每个socket状态是内核在进行的,这个效率要比用户线程要高的多。

王小二(海阔天空) 1070
上一篇: 操作系统——死锁
下一篇: 哪些场景可以利用索引覆盖来优化SQL?
Field_ctxy
博客等级 码龄10年 29粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值