Netty学习第三章 Linux网络编程使用的I/O模型
一、同步阻塞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模型的更多相关文章
- 第5章 Linux网络编程基础
第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
- Linux 网络编程的5种IO模型:异步IO模型
Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...
- Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO
背景 整理之前学习socket编程的时候复习到了多路复用,搜索了有关资料,了解到多路复用也有局限性,本着打破砂锅问到底的精神,最终找到了关于IO模型的知识点. 在<Unix网络编程>一书中 ...
- python核心编程学习(第三版)之网络编程
套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...
- 【Linux 网络编程】OSI七层模型
OSI(Open System Interconnection)开放系统互联模型(1)应用层: 应用层与应用程序界面沟通,以达到展示给用户的目的.(2)表示层: 表示层对网络传输的数据进行交换,使得多 ...
- 【Linux 网络编程】TCP/IP四层模型
应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...
- Linux网络编程基础API
第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...
随机推荐
- C++ STL 关于双向链表list的splice函数
转载自https://blog.csdn.net/qjh5606/article/details/85881680 list::splice实现list拼接的功能.将源list的内容部分或全部元素删除 ...
- JavaScript中this的一些练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- spotlight监控linux性能
linux性能监控有很多工具,spotlight只是其中一种 目录 1.安装spotlight 2.参数认识 1.安装spotlight spotlight不仅仅只是监控linux,还可以完成数据库以 ...
- 安装docker-下载加速、失败、成功安装
前提:已装VMware虚拟机和Centos系统(具体安装包和过程可以百度) 先看这里:非root身份登录系统需要在下面的命令前加“sudo ”(sudo:代表给权限,用root登录则不需要输入) 一. ...
- k8s/02中文文档学习笔记
k8s中文文档 一.k8s概述 Kubernetes:是一个开源的,用于管理云平台中多个主机上的容器化的应用 k8s设计目标:让部署容器化的应用简单并且高效 大规模容器集群管理工具,从Borg到Kub ...
- eclipse sts 常规操作
项目:右键 refresh 右键 maven -> update project 重新remove add project 重启软件,电脑 1.项目冗余 Package Explorer ...
- netcat命令用法
1,端口扫描nc -z -v -n 172.31.100.7 21-25 2,聊天Server:nc -l 1567Client:nc 172.31.100.7 1567 3,文件传输Server:n ...
- APIView的流程分析
APIView的流程分析 1.入口,因为视图类的继承APIView()的 as_view()是一个绑定类的方法 2.进入as_view(),正好这个as_view()有个返回值 返回的是dispat ...
- 期货、股指期权、ETF期权
期货与期权: 期权是指一种合约,该合约赋予持有人在某一特定日期或该日之前的任何时间以固定价格购进或售出某种资产的权利. 期货是标准化的合约,赋予参与者在未来的某个时间点以约定好的一个价格去买入或者卖出 ...
- [19/10/14-星期一] Python中的对象和类
一.面向对象 ## 什么是对象? - 对象是内存中专门用来存储数据的一块区域. - 对象中可以存放各种数据(比如:数字.布尔值.代码) - 对象由三部分组成: 1.对象的标识(id) 2.对象的类型( ...