关闭

Linux 网络 I/O 模型简介(图文)

标签: LinuxLinux网络IO模型
19334人阅读 评论(3) 收藏 举报
分类:

转载请注明出处: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模型。

    图示:

    01

    1.2、非阻塞I/O模型

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

    图示:

    02

    1.3、I/O复用模型

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

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

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

    图示:

    03

    1.4、信号驱动I/O模型

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

    图示:

    04

    1.5、异步I/O

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

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

    图示:

    05

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均含完整实例代码)

3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

深入理解select网络模型(linux/windows)

IO模型主要分为以下几种 (1)阻塞I/O模型 (2)非阻塞IO模型 (3)IO复用模型(select 、poll) (4)信号驱动式IO模型 (5)异步IO模型 select模型...
  • qq_19670785
  • qq_19670785
  • 2016-01-16 11:59
  • 1615

Nginx----IO模型及架构流程概述

按说暮春时节,草长莺飞,带上心爱的姑娘或者家人出去踏踏青、赏赏花最合适不过,但一场接一场的大雪,下得人心生烦闷,每日早起都要考虑时宜穿秋裤还是时宜不穿,费脑又耗时,关键是我烧烤架都备好了,寒什么也不能...
  • StubbornPotatoes
  • StubbornPotatoes
  • 2017-03-25 00:53
  • 1107

linux网络编程之socket(八):五种I/O模型和select函数简介

linux网络编程之socket(八):五种I/O模型和select函数简介
  • sxingming
  • sxingming
  • 2016-12-05 15:58
  • 454

linux网络编程之socket(八):五种I/O模型和select函数简介

一、五种I/O模型 1、阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv...
  • Simba888888
  • Simba888888
  • 2013-06-10 15:35
  • 7009

netty启程之路(一):Linux的五种网络I/O模型

最近项目不急,闲来经领导提点,学习一下netty框架,再次做些JJYY的东西; 众所周知,netty是目前比较流行的JAVA NIO框架,提到NIO,就不得不从操作系统的I/O模型开始说起: Linu...
  • yez497822
  • yez497822
  • 2016-09-30 16:15
  • 154

Linux网络编程---I/O复用模型之epoll

Linux网络编程—I/O复用模型之epoll1. epoll模型简介epoll是Linux多路服用IO接口select/poll的加强版,e对应的英文单词就是enhancement,中文翻译为增强,...
  • men_wen
  • men_wen
  • 2016-12-04 21:08
  • 829

Linux IPC之Socket网络编程I/O多路复用相关模型及区别

导言:大部分程序使用的I/O模型(传统的阻塞式I/O模型)都是单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用都会阻塞直到完成数据传输。但是,有些场景需要: 以非阻塞...
  • delphiwcdj
  • delphiwcdj
  • 2016-08-22 23:59
  • 1515

Linux网络编程【七】:TCP协议高性能服务器(http)模型之I/O多路转接poll

poll:poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。 不同与select使⽤三个位图来表⽰...
  • qq_35409955
  • qq_35409955
  • 2017-06-12 18:59
  • 362

嵌入式软件开发培训笔记——Linux网络编程及I/O模型

一、基础知识     1、网络体系结构(协议模型)         协议模型的特点         OSI和TCP/IP协议模型     2、TCP/IP协议模型   &...
  • CSDN85391440
  • CSDN85391440
  • 2015-05-31 02:39
  • 422

Linux网络编程【六】:TCP协议高性能服务器(http)模型之I/O多路转接epoll

什么是epoll? epoll是linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大 量并发连接中只有少量活跃...
  • qq_35409955
  • qq_35409955
  • 2017-06-12 01:32
  • 374
    个人资料
    • 访问:749639次
    • 积分:5468
    • 等级:
    • 排名:第5698名
    • 原创:96篇
    • 转载:1篇
    • 译文:0篇
    • 评论:292条
    博客专栏
    其他信息