转载请注明出处:http://blog.csdn.net/anxpp/article/details/51503329,谢谢!

1、介绍

Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。

根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型。

1.1、阻塞I/O模型

最常用的I/O模型,默认情况下,所有文件操作都是阻塞的。

比如I/O模型下的套接字接口:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直等待。

进程在调用recvfrom开始到它返回的整段时间内都是被阻塞的,所以叫阻塞I/O模型。

图示:

1.2、非阻塞I/O模型

recvfrom从应用层到内核的时候,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。

图示:

1.3、I/O复用模型

Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样,select/poll可以帮我们侦测多个fd是否处于就绪状态。

select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。

Linux还提供一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback。

图示:

1.4、信号驱动I/O模型

首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞)。当数据准备就绪时,就为改进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理树立。

图示:

1.5、异步I/O

告知内核启动某个操作,并让内核在整个操作完成后(包括数据的复制)通知进程。

信号驱动I/O模型通知的是何时可以开始一个I/O操作,异步I/O模型有内核通知I/O操作何时已经完成。

图示:

2、I/O多路复用技术

I/O编程中,需要处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。

正如前面的简介,I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。

与传统的多线程模型相比,I/O多路复用的最大优势就是系统开销小,系统不需要创建新的额外线程,也不需要维护这些线程的运行,降低了系统的维护工作量,节省了系统资源。

主要的应用场景:

  • 服务器需要同时处理多个处于监听状态或多个连接状态的套接字。
  • 服务器需要同时处理多种网络协议的套接字。

支持I/O多路复用的系统调用主要有select、pselect、poll、epoll。

而当前推荐使用的是epoll,优势如下:

  • 支持一个进程打开的socket fd不受限制。
  • I/O效率不会随着fd数目的增加而线性下将。
  • 使用mmap加速内核与用户空间的消息传递。
  • epoll拥有更加简单的API。

3、Java中的网络IO编程

如果只是做Java开发,以上内容只需了解即可,不必深究(随便说说而已)。

已专门出了文章介绍:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

Linux 网络 I/O 模型简介(图文)相关推荐

  1. java IO初识与Linux网络I/O模型简介

    Java的 I/O发展简史 从 JDK1.0到 JDK1.3, Java的 I/O类库都非常原始,很多 UNIX网络编程中的概念或接口在l/O类库中都没有体现,例如 Pipe. Channel. Bu ...

  2. linux的i o模型,浅谈Linux 网络 I/O 模型简介(图文)

    1.介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个sock ...

  3. linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)

    1.介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符).而对一个sock ...

  4. Netty入门笔记-Linux网络I/O模型介绍

    在之前的博客中并没有将关于Netty的知识系统的总结起来.从这篇博客开始就将关于Netty的有关知识点总结起来顺便提升自己的分析问题的能力,通过博客分享的形式将学习的知识点形成体系,希望也可以帮助大家 ...

  5. Java I/O演进与Linux网络I/O模型

    参考文章: 简书-浅谈Linux五种IO:http://www.jianshu.com/p/486b0965c296 一.linux基础概念 1.1 内存空间 linux系统中的使用的是虚拟存储器,即 ...

  6. linux线程同步 epoll,Linux网络编程--epoll 模型原理详解以及实例

    1.简介 Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数.Linux 2.6内核中有提高网络I/O性能的新方法,即epoll . epoll是什么?按 ...

  7. linux 五种IO模型 简介

    Linux下主要的IO主要分为:阻塞IO(Blocking IO),非阻塞IO(Non-blocking IO),同步IO(Sync IO)和异步IO(Async IO). 同步:调用端会一直等待服务 ...

  8. 一文了解Linux 网络 I/O 模型

    目录 1 什么是I/O 2 同步IO模型 2.1 阻塞IO模型 2.2 非阻塞IO模型 2.3 信号驱动IO模型 2.4 IO复用模型 2.5 小结 3 异步IO模型 4 五种IO模型对比 1 什么是 ...

  9. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

最新文章

  1. 在Ubuntu 14.04 64bit上搭建Scala开发环境
  2. python top k问题
  3. java_内存的划分
  4. VMware虚拟机中CentOS根分区的扩展
  5. luogu P1330 封锁阳光大学
  6. kubernetes(六)k8s核心组件学习
  7. Matlab程序里Uref什么意思,SVPWM控制算法MATLAB仿真
  8. linux内核 lts长期演进,Linux Kernel 4.19 和 5.4 生命周期延长至 6 年
  9. 互联网晚报 | 9月7日 星期二 | 徐雷升任京东集团总裁;顺丰宣布再投5亿扶持快递小哥;vivo自研芯片V1正式亮相...
  10. 我珍藏很久的网盘资源搜索网站和下载神器
  11. python需要什么样的电脑_学习Python需要配备什么样的电脑
  12. python中ospathjoin_python-在Windows上与os.path.join混合斜杠
  13. 扁平化ui设计界面的方式以及扁平化ui图标设计特点
  14. 医学图像处理与深度学习入门
  15. iOS应用内跳转到手机淘宝天猫
  16. c语言13 6,C语言学习笔记13
  17. python数据可视化开发(2):pandas读取Excel的数据格式处理(数据读取、指定列数据、DataFrame转json、数学运算、透视表运算输出)
  18. 小米手机便签软件的语音玩法介绍
  19. 关于学习,很有必要看看这张图
  20. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码... 1

热门文章

  1. 如何理解3D动画中的欧拉角以及死锁?
  2. 简历撰写:6大板块n个细节
  3. java实现通过图片的URL地址下载图片
  4. 开发你自己的Android 授权管理器 (AccountManager的使用以及应用场景)
  5. 【图像融合】基于非下采样剪切波变换(NSST)实现红外图像和可见光图像融合matlab代码
  6. 伤寒杂病论.辨阳明病脉证并治
  7. linux下phylip软件构建NJ树,进化树构建-NJ法lpar;megarpar;
  8. mac办公软件里值得推荐给大家的好软件
  9. js随机生成验证码(数字+字母)
  10. Kubernetes 忘记token解决方案