3.1.4 I/O多路复用
2016-04-07 09:14
120 查看
I/O多路复用技术可以避免当要处理多个文件描述符时,长时间阻塞在某个文件描述符,使其他描述符得不到处理的情况。多进程、非阻塞(轮询)、异步I/O技术都可用来处理该问题,I/O多路复用是其中效果较好的。
select系统调用是经典的I/O多路复用模型,函数原型如下:
intselect(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,structtimeval *timeout);
maxfdp表示最大fd数加1。
readfds、writefds、errorfds分别表示读、写、出错描述符集。有一组宏可以对fd_set进行操作:
FD_ZERO宏可以重置描述符集。
FD_SET宏可以将某个fd置入特定的描述符集合中。
FD_ISSET宏可以判断某个fd是否在某描述符集合中。
timeout表示等待时间,为NULL表示永远等待,直到有准备好的描述符或收到信号;为0表示不等待;如果指定了等待时间,则当捕获到描述符或等待时间到时返回。由于postfix的定时事件和I/O事件都放在event_loop中执行,所以要谨慎设置该参数。
select多路复用模型的并发数受FD_SETSIZE限制,同时期执行方式为循环fd_set集合,效率较低。各个类Unix系统上都实现了各自的高效I/O多路复用模型,postfix和其他服务器软件一样,可根据所在的系统选择合适的多路复用模型:
/util/sys_defs.h
1387 #defineEVENTS_STYLE_SELECT 1 /* Traditional BSD select */
1388 #defineEVENTS_STYLE_KQUEUE 2 /* FreeBSD kqueue */
1389 #defineEVENTS_STYLE_DEVPOLL 3 /* Solaris /dev/poll */
1390 #defineEVENTS_STYLE_EPOLL 4 /* Linux epoll */
select系统调用是经典的I/O多路复用模型,函数原型如下:
intselect(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,structtimeval *timeout);
maxfdp表示最大fd数加1。
readfds、writefds、errorfds分别表示读、写、出错描述符集。有一组宏可以对fd_set进行操作:
FD_ZERO宏可以重置描述符集。
FD_SET宏可以将某个fd置入特定的描述符集合中。
FD_ISSET宏可以判断某个fd是否在某描述符集合中。
timeout表示等待时间,为NULL表示永远等待,直到有准备好的描述符或收到信号;为0表示不等待;如果指定了等待时间,则当捕获到描述符或等待时间到时返回。由于postfix的定时事件和I/O事件都放在event_loop中执行,所以要谨慎设置该参数。
select多路复用模型的并发数受FD_SETSIZE限制,同时期执行方式为循环fd_set集合,效率较低。各个类Unix系统上都实现了各自的高效I/O多路复用模型,postfix和其他服务器软件一样,可根据所在的系统选择合适的多路复用模型:
/util/sys_defs.h
1387 #defineEVENTS_STYLE_SELECT 1 /* Traditional BSD select */
1388 #defineEVENTS_STYLE_KQUEUE 2 /* FreeBSD kqueue */
1389 #defineEVENTS_STYLE_DEVPOLL 3 /* Solaris /dev/poll */
1390 #defineEVENTS_STYLE_EPOLL 4 /* Linux epoll */
相关文章推荐
- POJ 1258 Agri-Net
- 【iCore3 双核心板_ uC/OS-III】例程一:认识 uC/OS-III
- linux下A免密码登录B
- 对casper源码的一次改动
- Android可循环显示图像的Android Gallery组件用法实例
- 中值滤波matlab
- 格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"
- 开发和运维核心之一 CMDB
- SESSION 和COOKIE的区别
- 动态添加class属性
- Java虚拟机工作原理详解
- C++ 可变长数组类的实现
- 3.1.3 网络编程
- iOS 存储数据
- Oracle SQL收集
- 给NIOS II CPU添加一颗澎湃的心——sysclk的使用
- 分数类的雏形
- 3.1.2 进程间通信
- atomic包
- 7. Reverse Integer (整数的溢出)