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开发,以上内容只需了解即可,不必深究(随便说说而已)。

linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)相关推荐

  1. linux 网卡virtio,浅谈linux设备中virtio组织关系

    当我们查看Linux kernel.C的Virtio代码时,我们会发现许多相关的文件.那么,verdio,我们只有Virtio\UC',Virtio\ubk.C. 美德\ubalon.C. 等等.与这 ...

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

    想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...

  3. linux系统安装coerplayer,浅谈Linux操作系统下的多媒体播放器

    freeamp 2.1.0 freeamp是一个遵循gpl的音频播放器,彻底得free以及支持跨平台(同时支持window和linux)使用是它最大的特点.虽然在支持格式上略显单薄,但整体界面以及操作 ...

  4. linux代码签名,浅谈Linux容器和镜像签名(示例代码)

    导读 从根本上说,几乎所有的主要软件,即使是开源软件,都是在基于镜像的容器技术出现之前设计的.这意味着把软件放到容器中相当于是一次平台移植.这也意味着一些程序可以很容易就迁移,而另一些就更困难. 我大 ...

  5. linux 线程_浅谈Linux线程模型

    Thread Basic 基础概念 线程是操作系统能够调度和执行的基本单位,在Linux中也被称之为轻量级进程.从定义中可以看出,线程它是操作系统的概念,在不同的操作系统中的实现是不同的,不过今天分享 ...

  6. linux ofstream open,浅谈linux性能调优之十一:内存分配管理

    linux下内存分配的管理主要通过内核参数来控制: 1.与容量相关的内存可调参数 以下参数位于 proc 文件系统的 /proc/sys/vm/ 目录中. overcommit_memory :规定决 ...

  7. 浅谈 Linux 高负载的系统化分析

    简介: 浅谈 Linux 高负载的系统化分析,阿里云系统组工程师杨勇通过对线上各种问题的系统化分析. 讲解 Linux Load 高如何排查的话题属于老生常谈了,但多数文章只是聚焦了几个点,缺少整体排 ...

  8. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: ...

  9. linux 易语言窗口程序_浅谈Linux入门的基本知识

    浅谈Linux入门的基本知识 图形模式与文字模式的切换方式Linux预设提供了六个命令窗口终端机让我们来登录. 默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1.tty2 - ...

最新文章

  1. 华夏幸福发布2018年业绩简报 整体销售面积同比增57.56%
  2. 通过WebViewJavascriptBridge实现OC与JS交互
  3. python自学需要多久-自学Python多久能找到工作
  4. 公众号质量改进调查问卷
  5. 可变数组NSMutableArray
  6. boost::fill相关的测试程序
  7. Dubbo面试 - Dubbo通信协议
  8. python方法与重载_python特殊方法和运算符重载(番外--重载)
  9. java代码中获取classpath路径
  10. 暗黑破坏神java魔法护身,发个实用的贴!!暗黑+1+2技能护身符合成,望大家顶下,能加精...
  11. java操作Excel之POI(4)利用POI实现数据的批量导出
  12. 农村新兴致富行业,小家电玩具换旧手机,最多月入几十万
  13. flex4的新数据类型ArrayList
  14. 官方澄清丨Gartner并未组织评选OpenStack八大厂商
  15. 网页设计期末复习 选择+简答+大题
  16. Spring源码下载---导入到Idea
  17. 前端H5面试题Js: Javascript 创建对象的几种方式? (必会)
  18. linux系统自动获取ip地址,Linux系统怎么自动获取ip地址用什么命令
  19. mzy git学习,分支冲突,以及冲突解决(五)
  20. SM2算法+开发中注意事项

热门文章

  1. 回顾2009,展望2010
  2. C# MVC使用阿里云对象存储加快图片加载速度(一)
  3. mc服务器右上角信号格,手机右上角的网络信号标识是什么意思?
  4. Android View生命周期
  5. Python四大金刚之二:字典
  6. JAVA日期和时间API
  7. spring入门笔记
  8. Java中BigDecimal的8种舍入模式
  9. 简述List、Set、Map类型的集合的各自特点
  10. mybatis一级,二级缓存。缓存带来的脏读问题