一、同步阻塞IO:blocking IO(BIO)

  

1.过程分析:

  当进程进行系统调用时,内核就会去准备数据,当数据准备好后就复制数据到内核缓冲器,复制完成后将数据拷贝到用户进程内存,整个过程都是阻塞的。

2.特点:

  优点:能及时响应数据

  缺点:因为整个过程都是阻塞的,所以高并发下性能非常差

二、同步非阻塞IO:nonblocking IO(NIO)

  

1.过程分析:

  当进程调用系统时,会立即返回error,当用户知道返回的是error后就知道数据没有准备好,此时进程进行等待,这一个过程是非阻塞的,因此可以有多个调用请求。当请求来到时,内核会去准备数据,就和BIO的模式一样,当数据准备好后,复制给用户进程内存,这一个过程是阻塞的,但是用户进程会一直去轮询判断数据是否已经准备好了。

2.特点:

  优点:能够在数据处理好之前去做其他的事情

  缺点:性能还是很差,第一需要不断去判断数据是否准备好了;第二在拷贝数据这个过程中,进程依旧是阻塞的;第三因为是轮询去找数据,所以数据会有延迟

三、IO多路复用

  

1.定义:

  所谓的IO多路复用指的就是一个或多个线程处理多个TCP连接。

2.网络模型:

  IO多路复用的网络模型有三种:

  ①select模型:

  调用select函数时会阻塞住进程,等有数据可读、可写、出异常或者超时就会返回。select函数正常返回后,通过遍历fdset整个数组才能发现那些句柄发生了事件,来找到就绪的fd进行相应的IO操作。

  优点:所有平台都能够使用这种模型。

  缺点:

  ⑴ select函数采用轮询的方式扫描文件,如果fd多的话,性能就会很差。

  ⑵ 每次调用select函数,需要把fd集合从用户拷贝到内核中

  ⑶ 最大缺陷是单个进程打开的fd有限制的(1G的内存大概有10万个句柄)

  ②poll模型:

  这个模型和select模型一样,最大的区别就是poll没有最大文件描述符(fd)的限制

  ③epoll模型

  这个模型是在Linux2.6内核中正式加入的:对比select模型,epoll没有描述符限制,用户拷贝到内核的数据只需使用一次事件通知,通过epoll_ctl函数注册fd,一旦fd就绪,内核就会采用callback的回调机制来激活对应的fd。

  我们主要了解下它的工作函数:

  epoll_create:这个函数是用来创建一个epoll句柄,创建完成后epoll就会占用一个fd,这个函数返回的是一个epoll对象

  epoll_ctl:在epoll对象里添加删除对应的fd,并绑定一个callback函数

  epoll_wait:判断并成对应的IO操作

  epoll模型的特点:

  ⑴ 没有fd限制

  ⑵ 效率高,因为使用的是回调通知机制,不会随着fd的增加而降低性能

  ⑶ 用户和内核采用同一块内存实现回调

四、信号驱动

1.过程分析:

  这种模型与NIO类似,在第一个阶段进程发起请求时两个模型都是一样的,是非阻塞的,区别在于第二阶段:在信号驱动模型中,当内核准备好数据后会自动通知用户进程,进程收到通知后会自动去内核拷贝数据。

五、异步IO:asynchronous  IO(AIO)

  

1.过程分析:

  用户进程在系统调用后,就能够去继续做其他的事情,数据的第一、第二阶段都不是阻塞的,当数据准备好后。内核会自动通知用户来拷贝数据。

2.特点:

  读写操作都交给了内存来处理,用户只需要等待通知来获取就行。

Netty学习第三章 Linux网络编程使用的I/O模型的更多相关文章

  1. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

  2. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  3. Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...

  4. Linux 网络编程的5种IO模型:异步IO模型

    Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...

  5. Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO

    背景 整理之前学习socket编程的时候复习到了多路复用,搜索了有关资料,了解到多路复用也有局限性,本着打破砂锅问到底的精神,最终找到了关于IO模型的知识点. 在<Unix网络编程>一书中 ...

  6. python核心编程学习(第三版)之网络编程

    套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...

  7. 【Linux 网络编程】OSI七层模型

    OSI(Open System Interconnection)开放系统互联模型(1)应用层: 应用层与应用程序界面沟通,以达到展示给用户的目的.(2)表示层: 表示层对网络传输的数据进行交换,使得多 ...

  8. 【Linux 网络编程】TCP/IP四层模型

    应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...

  9. Linux网络编程基础API

    第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...

随机推荐

  1. tensorflow基本操作(1)

    import tensorflow as tf import numpy as np 点乘,支持broadcasting 乘号* 和 multiply等价 mul已经废弃不用了 matmul 是矩阵相 ...

  2. 使用discriminator实现鉴别器

    1在人员接口实现方法 public Employee getEmpByIdStep(Integer id); 2在映射文件进行配置 <!-- public Employee getEmpById ...

  3. Python深度学习读书笔记-5.Keras 简介

    Keras 重要特性 相同的代码可以在 CPU 或 GPU 上无缝切换运行. 具有用户友好的 API,便于快速开发深度学习模型的原型. 内置支持卷积网络(用于计算机视觉).循环网络(用于序列处理)以及 ...

  4. Powershell + HTA

    众所周知,Powershell早已被集成到了windows的环境中,国外大牛玩得不亦乐乎,而国内圈子却很少听到讨论Powershell的,HTA更不用说了,不是学计算机的或许根本不知道这是什么鬼 Li ...

  5. C# 图片文件文本string格式 传输问题

    string file = @"E:\test.png"; byte[] bytes = File.ReadAllBytes(file); // 主要代码 string datas ...

  6. JVM监控工具之jmap、jstat、stack、jps、jstatd、jinfo、jhat、jdb

    1.jdb(The Java Debuger) jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常 ...

  7. 设置了responseType:Blob之后,如果返回json错误信息,如果获取?

    最近做了一个文件下载功能,于是设置了responseType: Blob的方式, 什么是Blob呢,MDN官方解释:Blob 对象表示一个不可变.原始数据的类文件对象.Blob 表示的不一定是Java ...

  8. 【释疑】tp99、单实例qps

    tp99 tp99的定义 tp99 (top percentile 99),指一组数据从小到大排列,处于99%位置的数据的值.例如等差数列range(1,101),tp99=99 tp99优于平均值的 ...

  9. ES6标准入门 第五章:函数的扩展

    1.函数参数的默认值 (1)基本用法 ES5 中, 不能直接为函数的参数指定默认值.只能采用变通的方法. function log(x, y) { y = y || 'World'; console. ...

  10. Canvas入门04-绘制矩形

    使用的API: ctx.strokeRect(x, y, width, height) 给一个矩形描边 ctx.fillRect(x, y, width, height) 填充一个矩形 ctx.cle ...