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操作
接口:
- 定义集合:fd_set rfds,wfds,efds;
- 清空集合: void FD_ZERO(fd_set *set)
- 将描述符添加到集合中:void FD_SET(int fd,fs_set *set)
- 发起监控调用 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复用的主要内容,如果未能解决你的问题,请参考以下文章