Linux网络编程(高级IO)-典型IO,多路IO复用

Posted AllenSquirrel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux网络编程(高级IO)-典型IO,多路IO复用相关的知识,希望对你有一定的参考价值。

IO:输入输出   过程:等待IO就绪,进行数据拷贝

  • 四种典型IO方式:

(1)阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则一直等待

(2)非阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则立即报错返回,隔一段时间重新发起IO调用

(3)信号驱动IO:自定义IO信号处理,等待IO就绪,收到信号打断当前操作进行IO

(4)异步IO:自定义IO信号处理,发起异步IO调用,调用立即返回,但让系统完成IO,完成后通过信号通知进程

阻塞:为了完成一个功能,发起调用,若完成功能条件不具备,则一直等待

非阻塞:发起一个调用,若完成功能不具备,则立即报错返回

阻塞与非阻塞:通常用于描述某个接口发起调用后是否能够立即返回

同步:一个功能完成后,才能进行下一个操作,若不能立即完成则一直等待

异步:发起一个调用,让别人完成具体功能,不用等待功能完成后,可先进行下一个操作

同步与异步:外部体现就是功能是否靠自己来完成

异步阻塞:发起一个调用,让系统完成任务,进程一直等待系统完成

异步非阻塞:发起一个调用,让系统完成任务,进程不等待,继续进程自己的事

  • 多路转接IO:IO多路复用

作用:针对大量描述符进行IO就绪事件监控,让进程仅仅针对已经就绪的IO事件描述符进行IO操作,避免了进程对未就绪的描述符进行操作所造成的的性能损失

实现:select,poll,epoll

IO就绪事件:可读,可写,异常

  • select模型:针对大量描述符进行IO就绪事件监控

1,定义指定IO事件的描述符集合,将需要监控指定事件的描述符添加到对应集合中

2,发起调用,将需要监控的事件描述符集合拷贝到内核,进行事件监控

若监控超时都没有描述符就绪则返回

若有描述符就绪了指定监控的事件则返回

在监控调用返回前,都会将描述符集合中没有就绪事件的描述符移除

在监控调用返回后,集合中只保留就绪的描述符

3,判断哪个描述符还在哪个集合中,就知道哪个描述符就绪了什么事件,进而进行对应的IO操作

接口:

  1. 定义集合:fd_set rfds,wfds,efds;
  2. 清空集合: void FD_ZERO(fd_set *set)
  3. 将描述符添加到集合中:void FD_SET(int fd,fs_set *set)
  4. 发起监控调用 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout)

nfds:所有集合中最大的描述符的值+1

rfds,wfds,efds:可读可写异常  不监控则置空

timeout:监控超时等待时间 阻塞置NULL,非阻塞置0

返回值:返回实际就绪的描述符个数  出错返回-1,超时返回0

     5.调用返回后,判断哪个描述符在集合中确定哪个描述符定义什么事件 int FD_ISSET(int fd,fd_set *set)

    6.从指定描述符集合中移除指定描述符 void FD_CLR(int fd,fd_set *set)

以上是关于Linux网络编程(高级IO)-典型IO,多路IO复用的主要内容,如果未能解决你的问题,请参考以下文章

[Linux] 典型IO模型与多路转接IO模型

[Linux] 典型IO模型与多路转接IO模型

典型I/O模型——阻塞IO,非阻塞IO,信号驱动IO,异步IO,IO多路转接(select&poll&epoll)

Linux 高级IO

Linux 高级IO

图解 | 原来这就是 IO 多路复用