Linux网络编程 多路转接
五种IO模型,阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。
目录
前言
IO简单来说就是read 和 write,总体分为两步 1 等待数据就绪 2 从内核中的缓冲区拷贝数据到用户区,或从用户区拷贝数据到内核区。高效IO的本质其实就是减少等待数据就绪的时间。IO多路IO转接服务器也叫做多任务IO服务器,总体设计思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监听事件就绪。
主要使用有三种 select、poll、epoll
五种IO模型
阻塞IO
所有的套接字,默认都是阻塞IO,等待数据就绪。

非阻塞IO
如果未就绪,系统调用仍然会直接返回,返回EWOULDBLOCK错误码

信号驱动IO
内核将数据准备好的时,应用程序收到SIGIO信号,这种IO方式已经很少使用了。

多路转接IO
与阻塞式IO最本质的区别就是可以等待多个fd。

异步IO
由内核在数据拷贝完成时,通知应用程序(等待和拷贝都已完成)

fcntl 设置非阻塞

- 复制一个现有的描述符(cmd=F_DUPFD) .
- 获得/设置文件描述符标记(cmd=F_GETFD or F_SETFD).
- 获得/设置文件状态标记(cmd=F_GETFL or F_SETFL)
- 获得/设置异步I/O所有权(cmd=F_GETOWN or F_SETOWN)
- 获得/设置记录锁(cmd=F_GETLK,F_SETLK or F_SETLKW)
默认文件描述符都为阻塞式
SetNonBlock
void SetNonBlock(int fd) {
int fl = fcntl(fd,F_GETFL); //取出当前fd的属性
check(fl);
fcntl(fd,F_SETFL,fl | O_NONBLOCK); //在原先基础上设置非阻塞
}
select
select监视多个fd的状态变化,等待数据就绪。
select 底层是轮询检查数据是否就绪,因此如果存在大量连接那么服务器的响应时间就会大大下降。
函数原型
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds: 监控的文件描述符集里最大文件描述符加1
rea

本文详细介绍了Linux中的五种IO模型,包括阻塞IO、非阻塞IO、信号驱动IO、多路转接IO(select、poll、epoll)以及异步IO。重点讨论了epoll的原理和优势,如边缘触发和水平触发模式,以及epoll相对于select和poll的效率提升。此外,还讲解了fcntl设置非阻塞和socket的就绪条件等关键概念。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



