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模型,浅谈Linux 网络 I/O 模型简介(图文)相关推荐

  1. Linux先发送条件变量,浅谈Linux条件变量的使用

    Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生. 示例伪代码: void* Thread1(void){ ...

  2. linux中管道的概念,浅谈Linux管道

    管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念.管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的"一切皆文件 ...

  3. linux中initrd的含义,浅谈linux启动的那些事(initrd.img)

    本文记录下linux系统的启动过程,分析下每一步都作了什么.linux 1.linux系统的启动过程小程序 1.加载BIOS,上电自检.由于BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息 ...

  4. linux下反删除软件,浅谈Linux文件系统反删除方法(二)

    列出的档有很多(这里找到2692个),第一字段是档节点号,第二字段是档所有者,第三字段是读写权限,接下来是档大小,占用块数,删除时间.然后就可以根据档大小和删除日期判断那些是我们需要的.比如我们要恢复 ...

  5. linux cp mv区别,浅谈Linux下mv和cp命令的区别

    1.功能上的区别 mv:用户可以使用该命令为文件或目录重命名或将文件由一个目录移入另一个目录中. cp: 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中. 2.从inode角度来区分 mv:会 ...

  6. 浅谈linux线程模型和线程切换

    本文从linux中的进程.线程实现原理开始,扩展到linux线程模型,最后简单解释线程切换的成本. 刚开始学习,不一定对,好心人们快来指正我啊啊啊!!! linux中的进程与线程 首先明确进程与进程的 ...

  7. linux系统pkl,(网摘)Linux新手必看:浅谈如何学习linux

    地址:http://www.eimhe.com/bbs/viewthread.php?tid=53256&extra=page=1> Linux新手必看:浅谈如何教习linux 一.起步 ...

  8. 浅谈 Linux 系统中的 SNMP Trap 【转】

    文章来源:浅谈 Linux 系统中的 SNMP Trap 简介 本文讲解 SNMP Trap,在介绍 Trap 概念之前,首先认识一下 SNMP 吧. 简单网络管理协议(Simple Network ...

  9. 浅谈Linux中ldconfig和ldd的用法

    ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...

最新文章

  1. hdfs dfs的bash hdfs command not found解决方案
  2. labview波形图两个游标,LabVIEW数据可视化:使用波形图表控件逐点显示曲线的方法...
  3. oracle數據庫any,Oracle权限集合全集
  4. 利用Excel VBA畫出所有圖標
  5. java双缓存机制_详解JVM类加载机制及类缓存问题的处理方法
  6. C++语言基础 —— 循环结构
  7. linux命令之less 命令
  8. 雷军亲曝小米 10 四大猛料!
  9. 三星中文AI助手Bixby发布,现在,这是“一家AI商用技术公司”
  10. Python自动化办公之Word,超全总结【建议收藏】
  11. VMware+WinDBG_配置_资料
  12. 在线编辑Word——插入公式
  13. Kotlin 的静态代码分析工具
  14. Wireshark不同报文颜色的含义
  15. could not initialize javavm mysql_Could not initialize JavaVM
  16. 安装ps时无法验证订阅状态_如何解决:Office 无法验证此应用程序的许可证
  17. 火狐打不开qq空间,说“建立安全连接失败”,解决方案
  18. P1228 地毯填补问题(Java语言实现)
  19. eclips下第一个java程序 hello world!
  20. Lisp语言:循环控制

热门文章

  1. 如何使用python给PDF文件加水印
  2. 产品经理专业知识50篇(十二)-抖音训练营项目实战(知识付费MVP产品模型)
  3. 计算机如何学会自动地进行图像美学增强?
  4. onpropertychange替代方案
  5. linux系统查看当前安装字库,linux下怎样安装中文字体?
  6. MyEclipes+html+jsp+mysql实现一个物流信息网
  7. Fastjson批量检查及一键利用工具
  8. html设置页面的高度和宽度,web显示页面有图像上设置高度和宽度很重要
  9. java web 登录界面案例_【JavaWeb】74:写一个登录案例
  10. Tips_一级菜单栏实现