700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > I/O多路复用技术简介

I/O多路复用技术简介

时间:2024-02-17 20:42:22

相关推荐

I/O多路复用技术简介

除了可以采用多进程和多线程方法实现并发服务器之外,还可以采用I/O多路复用技术。通过该技术,系统内核缓冲I/O数据,当某个I/O准备好后,系统通知应用程序该I/O可读或可写,这样应用程序可以马上完成相应的I/O操作,而不需要等待系统完成相应I/O操作,从而应用程序不必因等待I/O操作而阻塞。

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

对于I/O复用典型的应用如下:

(1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。

(2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。

(3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。

(4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。

(5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。

I/O复用调用select()或poll()函数,并在该函数上阻塞,等待数据报套接口可读;当select()返回可读条件时,调用recvfrom()将数据报拷贝到应用程序缓冲区中,

select()函数:

select()函数允许进程指示内核等待多个事件中的任意一个发生,并仅在一个或多个事件发生或经过指定的时间时才唤醒进程。这个函数的形式如下:

-------------------------------------------------------------------

#include<sys/select.h>

#include<sys/time.h>

intselect(intmaxfdp1,fd_set*readset,fd_set*writeset,fd_set*execepset,conststructtimeval*timeout);

返回:返回值表示所有描述字集中已准备好的描述字个数。如定时到,则返回0;若出错,则返回-1。

-------------------------------------------------------------------

在上面的参数中可以看到一个timeval结构,这个结构可以提供秒数和毫秒数成员,形式如下:

structtimeval

{

long tv_sec; /second*/

long tv_usec; /*microsecond*/

}

这个timeval结构有以下3种可能:

(1)永远等待下去:仅在有一个描述字准备好I/O时才返回,因此可以将参数timeout设置为空指针。

(2)等待固定时间:在有一个描述字准备好I/O时返回,但不超过由timeout参数所指timeval结构中指定的秒数和微秒数。

(3)根本不用等待:检查描述字后立即返回,这称为轮询(polling)。

在前两种情况的等待中,如果进程捕获了一个信号并从信号处理程序返回,那么等待一般被中断。

参数readset、writeset和execeptset指定让内核测试读、写、异常条件的描述字。如果我们对它们不感兴趣,可将其设为空指针。

select()函数使用描述字集为参数readset(writeset或exceptset)指定多个描述字,描述字集是一个整数数组,每个数中的每一个对应于一个描述字,例如32位整数,则数组的第一个元素对应于0~31描述字,第二个元素对应于32~63描述字等。

参数readset、writeset、exceptset为值—结果参数,调用select时,指定我们所关心的描述字,返回时结果指示那些描述字已准备好。

参数maxfdp1指定被测试的描述字的个数,它是被测试的最大描述字加1。如要测试1,2,4描述字,则必须测试0,1,2,3,4共5个描述字。

采用select()函数实现I/O多路复用的基本步骤如下:

(1)清空描述符集合;

(2)建立需要监视的描述符与描述符集合的联系;

(3)调用select()函数;

(4)检查所有需要监视的描述符,利用FD_ISSET宏判断是否已经准备好;

(5)对已经准备好的描述符进行I/O操作。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。