文章目录

  • 1.IO读写原理
    • 1.1 内核缓冲区和进程缓存区
      • 1.1.1 用户进程和操作系统
      • 1.1.2 缓冲区的目的
    • 1.2 Java读写IO底层流程
  • 2.四种主要的IO模型
    • 2.1 基本概念
      • 2.1.1 阻塞与非阻塞
      • 2.1.2 同步与异步
      • 2.1.3 四种IO模型
    • 2.2 同步阻塞IO(Blocking IO)
    • 2.3 同步非阻塞IO(None Blocking IO)
    • 2.4 IO多路复用模型(IO Multiplexing)
    • 2.5 异步IO模型(Asynchronous IO)
  • 3. 四种IO模型的优缺点
    • 3.1 同步阻塞IO
    • 3.2 同步非阻塞IO
    • 3.3 IO多路复用
    • 3.4 异步IO

网络IO模型一共介绍以下四种: 同步阻塞IO、同步非阻塞IO、IO多路复用和异步IO。

1.IO读写原理

文件的读写还是socket读写,在Java应用层开发,都是input或者output处理

用户程序进行IO操作,依赖于底层的IO实现,主要是**底层的 read&write两大系统调用:**

  • read系统调用指的是将数据从内核缓冲区复制到进程缓冲区
  • write系统调用指的是把数据从进程缓冲区复制到内核缓冲区

这也就是说,上层程序的IO操作,实际上不是物理设备的级别的读写,而是缓存的复制。

1.1 内核缓冲区和进程缓存区

1.1.1 用户进程和操作系统

用户进程(N) -> 处于用户态(用户空间)
系统空间 -> 内核态

在用户态需要访问系统资源,借助于内核态,系统资源主要有:

  • 1)cpu:控制一个程序的执行
  • 2)输入输出:一切都是流,所有流都是需要借助内核态
  • 3)进程管理:进程创建、销毁、阻塞、唤醒之间的调度
  • 4)内存:内存的申请、释放
  • 5)进程间通信:进程之间不能够相互访问内存,所以进程之间的交互需要通信,通信也是一种资源

以上所提到的系统资源,在用户进程中是无法被直接访问的,只有通过操作系统来访问,所以把操作系统访问这些资源的这一功能称之为系统调用

1.1.2 缓冲区的目的

为了减少频繁的系统IO调用

系统调用需要从用户态切换到内核态,切换之后保存用户进程的数据状态等信息,结束调用之后需要回复之前的信息,为了减少这种损耗的时间,还有损耗性能的时间, 所以出现了缓冲区

有了缓冲区,操作系统使用read函数内核缓冲区复制到进程缓冲区write函数进程缓冲区复制到内核缓冲区,只有缓冲区中的数据达到一定的量再IO的系统,提升性能.

用户程序的IO操作,大部分情况下,并没有进行实际的IO操作,而是进程缓冲区和内核缓冲区之间直接进行数据交换。

1.2 Java读写IO底层流程


如果是在Java服务器端,完成一个Socket请求和详情,完整的流程如下:

  • 客户端请求:Linux通过网卡读取客户端请求数据,将数据读到内核缓冲区
  • 获取请求数据:Java服务器通过read系统调用,从linux内核缓冲区读取数据,在送入Java进程缓冲区
  • 服务端业务处理:Java服务器在自己的用户空间中处理客户端的请求。
  • 服务端返回数据:Java服务器完成处理后,构建好响应数据,将这些数据从用户缓冲区写入内核缓冲区。这里用到write系统调用
  • 发送给客户端:Linux内核通过网络IO,将内核缓冲区中的数据写入网卡,网卡底层通信协议,会将数据发送给目标客户端。

2.四种主要的IO模型

2.1 基本概念

2.1.1 阻塞与非阻塞

  • 阻塞IO:需要内核IO操作彻底完成之后,才返回到用户空间,执行用户的操作

  • 非阻塞IO:不需要等待内核IO操作彻底完成之后,才返回到用户空间

  • 阻塞/非阻塞指的是用户空间程序的执行状态

    换句话说就是

  • 阻塞:用户空间(调用线程)死等内核IO,这期间什么都不干。

  • 非阻塞:用户空间(调用线程)拿到内核返回的状态就直接返回自己的空间,IO操作可以干就干,不可以干就去干别的事情。

2.1.2 同步与异步

  • 同步IO:用户空间线程和内核空间线程的交互,用户空间线程是主动发起IO请求的一方,内核空间是被动接收的一方
  • 异步IO:与上面刚好相反,内核空间是主动发起IO请求的一方,用户空间的线程是被动接受方。

2.1.3 四种IO模型

  • 同步阻塞IO(Blocking IO)
  • 同步非阻塞IO(Non-Blocking IO)
  • IO多路复用(IO Multiplexing)
  • 异步IO(Asynchronous IO)

2.2 同步阻塞IO(Blocking IO)

在同步阻塞IO模型中,程序用IO调用开始,直到系统调用返回,在这段时间内,进程是阻塞的。直到返回成功后,应用程序开始处理用户空间的缓存区数据.主要分为两个阶段:

  • 等待数据就绪:网络IO就是等待远端数据陆续到达磁盘IO就是等到磁盘数据从磁盘读取到内核缓冲区
  • 数据复制: 用户空间的程序没有权限直接读取内核缓冲区的数据(操作系统处于安全的考虑),因此内核与需要把内核缓冲区的数据复制一份到进程缓冲区

同步阻塞IO模型如下图所示:


阻塞IO的特点是:在内核进行IO执行的两个阶段用户线程都被阻塞了。

2.3 同步非阻塞IO(None Blocking IO)

将Socket设置为non-blocking,当前连接就变成了非阻塞IO。使用非阻塞模式的IO读写,叫做同步非阻塞IO(None Blocking IO),简称NIO模型

同步非阻塞IO模型中,会出现下面几种情况:

  • 内核缓冲区没有数据的情况下,系统调用会立即返回,返回一个调用失败的信息。这样请求就不会阻塞
  • 用户线程需要不断的发起IO系统调用测试内核数据是否准备好。
  • 内核缓冲区有数据的情况下,是阻塞的。直到内核缓冲区的数据全部复制到进程缓冲区,系统调用成功。

同步非阻塞IO模型如下图所示:
同步非阻塞IO特点:程序需要不断的进行IO系统调用轮询数据是否准备好,如果没有准备好,就继续轮询

2.4 IO多路复用模型(IO Multiplexing)

在IO多路复用模型中,引入了一种新的系统调用select/epoll,查询IO的就绪状态。通过该系统调用可以监视多个文件描述符,一旦某个描述符就绪(一般是内核缓存区可读/可写),内核能够将就绪的状态返回给应用程序。随后,应用程序根据就绪的状态,进行相应的IO系统调用。

在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作。

IO多路复用模型如下图所示:

IO多路复用模型的特点:IO多路复用模型涉及两种系统调用,一种是就绪查询(select/epoll),一种是IO操作。

多路复用IO也需要轮询。负责就绪状态查询系统调用的线程,需要不断的进行select/epoll轮询,查找出达到IO操作就绪的socket连接

2.5 异步IO模型(Asynchronous IO)

异步IO模型(Asynchronous IO)简称AIO,其基本流程为:用户线程通过系统调用,向内核注册某个IO操作。内核在整个IO操作(包括数据准备、数据复制)完成后,通知用户程序,执行后续的业务操作。

在异步IO模型中,整个内核的数据处理过程中,包括内核将数据从网络物理设备(网卡)读取到内核缓存区、将内核缓冲区的数据复制到用户缓冲区,用户程序都不需要阻塞

异步IO模型如下图所示:

异步IO模型的特点:在内核等待数据复制数据的两个阶段,用户线程都不是阻塞的。当内核的IO操作(等待数据和复制数据)全部完成后,内核会通知应用程序读数据

3. 四种IO模型的优缺点

3.1 同步阻塞IO

  • 优点:程序开发简单;在阻塞等待数据期间,用户线程挂起,不占用CPU资源
  • 缺点一个线程维护一个IO流的读写,在高并发应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会十分巨大,BIO模型在高并发场景下是不可用的

3.2 同步非阻塞IO

  • 优点:内核缓冲区没有数据的情况下,发起的系统调用不会阻塞,用户程序不会阻塞,实时性较好。
  • 缺点:需要不断地重复地发起IO调用,这种不断轮询,不断询问内核的方式,会占用CPU大量的时间,资源利用率比较低;在内核缓冲区有数据的情况下,也是阻塞的。NIO模型在高并发场景下是不可用的

3.3 IO多路复用

  • 优点select/epoll可以同时处理成百上千的连接,与之前的一个线程维护一个连接相比,IO多路复用则不需要创建线程,也就不需要维护,从而减少系统开销.
  • 缺点select/epoll系统调用,属于阻塞的模式。读写事件就绪之后,用户自己进行读写,这个读写过程也是阻塞的

3.4 异步IO

  • 优点:在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的
  • 缺点:需要事件的注册,就需要操作系统。

网络模型——四种常见网络IO模型相关推荐

  1. 网络 一篇博文搞懂五种常见的IO模型

    概念前情 阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则调用一直阻塞等待 非阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则立即返回一个 阻塞与非阻塞的区别:常用于讨论函数是 ...

  2. 四种主要网络IO虚拟化模型

    网络I/O不但是物理服务器最容易出现的瓶颈,也是现在虚拟化技术最大的硬伤.随着硬件虚拟化对网络I/O的支持,虚拟化的网络I/O模型也不断的进化,虚拟化的I/O性能也不断提升. 这4个主流网络I/O模型 ...

  3. python 网络编程 异步io_python网络编程——网络IO模型

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  4. 因为取了个快递我搞懂了五种网络IO模型

    五种网络IO模型 目录 前段时间,我有个朋友因为拿快递和家里闹别扭了,今天我就借这事来讲讲五大网络模型 阻塞IO模型 第一天: 刘:今天因为拿快递被我妈骂了一顿 我:说来听听 刘:我本来在家里打扫家务 ...

  5. linux 网络io命令详解,Linux下五种网络IO模型详解

    本文我们主要来了解一下Unix/Linux下5种网络IO模型:blocking IO, nonblocking IO, IO multiplexing, signal driven IO, async ...

  6. 五种网络IO模型详解

    一 IO操作本质 数据复制的过程中不会消耗CPU # 1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作.网络请求 ...

  7. 大白话详解5种网络IO模型

    1 前言 我们都知道,为了实现高性能的通信服务器,BIO在高并发的情况下会出现性能急剧下降的问题,甚至会由于创建过多线程而导致系统OOM.因此在Java业界,BIO的性能问题一直被开发者所诟病,所幸的 ...

  8. 5种网络IO模型介绍

    5种网络IO模型介绍 IO 模型分为以下几种: 阻塞IO 非阻塞IO 信号驱动IO IO多路复用 异步IO 前四个为同步IO 1 阻塞IO 一个IO操作需要两步: 等待数据和拷贝数据. blockin ...

  9. 五种网络IO模型:阻塞式IO 非阻塞式IO IO复用(IO multiplexing) 信号驱动式IO 异步IO

    文章目录 五种网络IO模型 举例说明 阻塞式I/O模型 非阻塞式I/O I/O多路复用 信号驱动式I/O 异步I/O 比较结果 总结 同步 异步 阻塞 非阻塞 阻塞/非阻塞: 同步/异步: 举例子:小 ...

最新文章

  1. C语言计算e1 1/1! 1/2!,c语言程序填空 下面程序是计算sum=1+(1+1/2)+(1+1/2+1/3)+…(1+1/2...
  2. 【NLP】文本自动摘要任务的心得总结
  3. Erlang 数据类型。。
  4. html5中的新标签
  5. Python编程基础:第三十五节 文件删除Delete a File
  6. MySQL全面优化,速度飞起来!
  7. 8000份课程课后习题答案与大家分享~~
  8. ADI官方提供的源码AD9361+ZC706 利用TCL构建Vivado工程,利用no-OS-master搭建SDK工程
  9. 解决vcard乱码批量导入outlook
  10. 阿里2018笔试题 之 三种颜色排列
  11. win中q-dir,everything,Windows Tabs,Clover各种效率神器(搜索,资源管理器,多标签)
  12. Tables[0].Rows.count什么意思?
  13. 示波器学习(一):示波器的作用、类型和基本结构
  14. 物理服务器安装CentOS 7操作系统
  15. 导出word单元格间隔空白问题
  16. 复合材料力学_桥桂琼编_西工大版
  17. 【云原生 • Docker】Docker常用命令总结(值得收藏)
  18. ORACLE公司的历史
  19. 获取本地音乐文件的专辑,图片,音乐信息
  20. iframe中的onload事件深藏功与名

热门文章

  1. 应广单片机例程EERPOM页写中一个BUG
  2. 正确认识形势 提升信心 增强斗志
  3. Centos6.5更新e1000网卡驱动
  4. e1000e_probe 其实是e1000_probe
  5. 查找并下载开放的音乐数据(.mp3)
  6. Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Random forest 和 gradient boosting的区别
  7. 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)
  8. Tunnel命令操作
  9. 独孤思维:没有复盘的项目,不会赚钱
  10. Synchronized关键字深度解析