Linux网络编程学习 ----- 五种I/O模式(第六章)

Posted xqn2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux网络编程学习 ----- 五种I/O模式(第六章)相关的知识,希望对你有一定的参考价值。

1、五种I/O模式是哪几个?

阻塞I/O,非阻塞I/O,I/O多路复用,信号驱动I/O(SIGIO),异步I/O

一般来讲程序进行输入操作有两个步骤,一是等待有数据可读,二是将数据从系统内核中拷贝到程序的数据集区。

对于一个套接字的数据操作,第一步就是等待数据从网络上传到本地,当数据包到达时,数据将会从网络层拷贝到内核的缓冲中,第二步就是从内核中将数据拷贝到程序的数据区中。

 

2、五种阻塞模式简介

1)阻塞I/O模式

套接字建立后默认的模式就是阻塞I/O模式,对于UDP而言,数据就绪的标志比较简单:已经收到了一整个数据报或者没有收到。比如说一个进程调用recvfrom()函数时,数据并有就绪,这个时候,进程将会等待数据就绪,数据到后拷贝到程序数据区,然后正常返回,所以,进程调用recvfrom()到该函数返回这段时间是阻塞的。

2)非阻塞I/O

一个套接字设置为非阻塞时,就相当于告诉内核"当我请求的I/O操作不能马上完成时,你想让我的进程休眠等待的时候,不要这么做,请马上返回一个错误给我"。就是调用recvfrom()时数据未就绪,这时内核立即返回一个错误给进程,所以非阻塞时,需要循环不停测试是否有数据可读,也就是polling,应用程序不停的polling内核来检查I/O操作是否就绪,这将极大浪费CPU资源

3)I/O多路复用

使用I/O多路技术时,调用select()或poll()函数,这时读取数据时先阻塞模式调用select()/poll(),也就是数据未就绪就等待直到数据就绪返回,然后调用recvfrom()函数将数据拷贝到程序缓冲区,和阻塞模式相比,还多调用了一个函数,但是多路复用优势在于select()可以等待多个套接字描述符,只要有一个就绪,select()函数就可以返回。

多路技术使用情况有:

  • 当一个客户端需要同时处理多个文件描述符的输入输出操作的时候(一般来说是标准的输入输出和网络套接字), I/O 多路复用技术将会有机会得到使用

  • 当程序需要同时进行多个套接字的操作的时候
  • 如果一个 TCP 服务器程序同时处理正在侦听网络连接的套接字和已经连接好的套接字

  • 如果一个服务器程序同时使用 TCP 和UDP 协议
  • 如果一个服务器同时使用多种服务并且每种服务可能使用不同的协议(比如inetd就是这样的)

4)信号驱动I/O模式

 

以上是关于Linux网络编程学习 ----- 五种I/O模式(第六章)的主要内容,如果未能解决你的问题,请参考以下文章

Linux设备驱动中的IO模型---阻塞和非阻塞IO

五种I/O模型的学习

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

透彻Linux(Unix)五种IO模型

网络编程之五种I/O模型

五种 IO 模型