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

标签: Linux Linux网络IO模型
21479人阅读 评论(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均含完整实例代码)

查看评论

linux下5种网络IO模型简介

同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么?到底有什么区别?对于这个问题,不同的人给...
  • chinawangfei
  • chinawangfei
  • 2016-02-23 14:38:09
  • 841

深入理解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:03
  • 1901

linux网络通讯模型

一、网络通信 网络是通过物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的,通过信息交换实现人与人、人与计算机、计算机与计算机之间的通信。 1. 网络通信要...
  • sdkdlwk
  • sdkdlwk
  • 2017-05-23 11:50:28
  • 278

Linux Socket五种I/O模型

1)阻塞I/O(blocking I/O) 2)非阻塞I/O (nonblocking I/O) 3) I/O复用(select 和poll) (I/O multiplexing) 4)信号驱动...
  • taiyang1987912
  • taiyang1987912
  • 2015-02-11 10:58:48
  • 5838

网络和I/O

一、网络HttpURLConnection 类HttpURLConnection 类是基于HTTP协议的,其底层是通过Socket实现的。URL请求的类别: 分为二类,GET与POST请求。二者的...
  • qq_30154277
  • qq_30154277
  • 2016-07-21 12:51:11
  • 695

网络编程的I/O模式

5种类UNIX下可用的I/O模型: ·同步阻塞I/O(blocking IO): 即传统的IO模式。 ·同步非阻塞I/O(nonblocking IO):默认创建的socket都是阻塞的,非阻...
  • Le_temps
  • Le_temps
  • 2016-01-19 22:27:57
  • 409

网络编程中常见的5种I/O模型

I/O模型Unix下共有五种I/O模型:1>:阻塞I/O2>:非阻塞I/O3>:I/O多路复用4>:信号驱动I/O5>:异步I/O其中前四种是同步I/O模型,只有第五种是异步的。同步与异步:这里的同步...
  • baidu_33461591
  • baidu_33461591
  • 2016-05-29 16:55:08
  • 534

Windows平台网络通信中的I/O操作的总结与类比

此篇博客是我专门针对我的一本教科书进行的笔记整理。以前我一直采用的纸质的笔记本进行的记录,现在将它们转录到博客上,也随一下大流。 这篇文章是刘琰、刘龙等编著的由机械工业出版社出版的《Windows 网...
  • qq_33205982
  • qq_33205982
  • 2017-02-06 19:56:49
  • 326

5种I/O模型

一:概念的理解: 首先在网络编程的时候,我们常常见到同步/异步,阻塞/非阻塞四中调用方式:1同步和异步主要针对C(client)端 同步: 所谓的同步,就是在c端发出一个功能调用时,在没有得到结...
  • f2016913
  • f2016913
  • 2017-09-05 13:57:13
  • 462

服务器基础:聊聊Linux中的5种I/O模型

1 概念说明在进行解释之前,首先要说明几个概念:用户空间和内核空间进程切换进程的阻塞文件描述符缓存 IO1.1 用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间...
  • sinat_34990639
  • sinat_34990639
  • 2016-10-10 15:56:41
  • 1460
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 88万+
    积分: 5832
    排名: 5509
    博客专栏
    music