| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 四种主要IO模型 -> 正文阅读 |
|
[网络协议]四种主要IO模型 |
四种主要IO模型同步IO,是指用户空间的线程是主动发起IO请求的一方,内核空间是被动接收方。 异步IO,是指系统内核是主动发起IO请求的一方,用户空间的线程是被动接收方。 阻塞IO,是指需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。 非阻塞IO,是指用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间执行用户的操作,即处于非阻塞的状态,并且内核会立即返回给用户一个状态值。 可以这样理解:阻塞是指用户空间一直处于等待状态,不能去处理其他事件;非阻塞指的是用户空间获取到内核返回的状态就返回当自己的空间去干别的事情去了。 同步阻塞IO(Blocking IO)在Java应用程序中,默认情况下,所有的socket连接的IO操作都是同步阻塞IO。在阻塞式IO模型中,Java应用程序从IO调用开始,直到系统调用返回都处于阻塞状态。当返回数据之后,应用程序开始处理用户空间的缓存区数据。 ?以Java发起一个Socket的read读操作的系统调用为例:
阻塞IO的特点:内核在等待数据以及复制数据的过程中,用户的进程或线程都处于阻塞状态。 阻塞IO的优点:应用程序开发简单,在阻塞等待数据期间,用户进行请求IO的线程挂起。在阻塞期间,请求IO的用户线程基本不会占用CPU资源。 阻塞IO的缺点:一个线程只能维护一个连接的IO操作,在高并发的应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会非常大,因此在高并发场景下不会使用阻塞IO。 同步非阻塞NIO(None Blocking IO)socket连接默认是阻塞模式,在Linux系统中可以讲Socket设置为同步非阻塞模式,在NIO模式下,会出现两种情形:
以Java中的一个线程请求非阻塞socket的read读操作为例:
同步非阻塞IO的特点:应用程序的线程需要不断进行IO系统调用,直到拿取到数据完成IO系统调用为止。 同步非阻塞IO的优点:每次用户线程发起的IO请求,在内核等待数据的过程中可以立即获得结果,用户线程不会阻塞,实时性比较好。 同步非阻塞IO的缺点:为了获取数据需要不断的去轮询内核,这将占用大量的CPU时间,效率低下。 由于需要不断去轮询获取数据,这种NIO模式很少在实际项目中使用。 IO多路复用模型(IO Multiplexing)为了解决同步非阻塞IO模型中轮询的问题,提出了一种新的模型,便是IO多路复用模型。在IO多路复用模型中,引入了一种新的系统调用,查询IO的就绪状态。在Linux系统中,对应的系统调用为select/epoll系统调用等等。通过系统调用,一个进程可以监视多个文件描述符,一旦某个文件描述符就绪(一般为内核缓冲区可读/可写),内核能够将就绪的状态返回给应用程序。之后应用程序根据就绪的状态进行相应的IO系统调用。 在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询多个socket连接,当某个socket网络连接有了就绪状态,就返回对应的可以执行的读写操作。 发起一个多路复用IO的read读操作的系统调用如下:
从网上https://blog.csdn.net/huang_wu_yao_xin/article/details/80886847?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.control&spm=1001.2101.3001.4242看到了这个图感觉更详细:Java中对应的选择器类是Selector类。 IO多路复用模型的特点:IO多路复用模型的IO涉及两种系统调用:一种是select/epoll,一种是IO操作。IO多路复用模型建立在操作系统 的基础设施之上,即操作系统的内核必须能够提供多路分离的系统调用select/epoll。 其实IO多路复用模型就是用一个线程来解决了同步非阻塞IO中,多个用户线程进行轮询获取结果。在IO多路复用模型中,对于注册在选择器上的每一个可以查询的socket连接,一般都设置成为同步非阻塞模型。 IO多路复用模型的优点:与一个线程维护一个连接的阻塞IO模式相比,使用select/epoll的最大优势在于,一个选择器查询线程可以同时处理成千上万个连接。系统不必创建大量的线程,大大减小了系统的开销。 IO多路复用模型的缺点:本质上,select/epoll系统调用是阻塞的,属于同步IO。都需要在读写事件就绪后,由系统调用本身负责进行读写,这个读写过程也是阻塞的。 异步IO模型(Asynchronous IO)异步IO模型的基本流程是:用户线程通过系统调用,内核注册某个IO操作。内核在整个IO操作完成后,通知用户程序,用户执行后续的业务操作。 在异步IO模型中,在整个内核的数据处理过程中,包括内核将数据读取到内核缓冲区,将内核缓冲区数据复制到用户缓冲区,用户线程都不会阻塞。 发起一个异步IO的read读操作的系统调用,流程如下:
异步IO模型的特点:在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的。用户线程需要接收内核的IO操作完成的事件,或者用户线程需要注册一个IO操作完成的回调函数。 异步IO模型的缺点:应用程序仅需要进行事件的注册与接收,其余的工作都交付给系统来完成。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 7:43:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |