Linux多路转接 select、poll、epoll详解

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

necesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值