20250905的学习笔记

一、IO多路复用

(1)定义

单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力

(2)作用

应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标的输入、中断信号等等事件,再比如web服务器如nginx,需要同时处理来来自N个客户端的事件。

二、IO模型分类

1、阻塞IO

2、非阻塞IO EAGAIN 忙等待 errno

3、信号驱动IOSIGIO用的相对少(了解)

4、并行模型进程,线程

5、IO多路复用select、poll、epoll

三、fcntl函数

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, .. /* arg */ );

功能:

修改指定文件的属性信息。

参数:

fd 要调整的文件描述符

cmd 要调整的文件属性宏名称,可变长的属性值参数。

返回值:

成功 不一定,看cmd

失败 -1

四、IO多路复用

1. select

特点

(1)机制:select 通过一个文件描述符集合(fd_set)来管理需要监视的文件描述符。

(2)使用方式:调用 select 函数时,传入一个文件描述符集合,select 会阻塞直到集合中的某个文件描述符准备好进行 I/O 操作。

(3)性能:select 的性能随着监视的文件描述符数量增加而下降。每次调用 select 时,都需要遍历整个文件描述符集合,这在文件描述符数量较多时会变得低效。

(4)最大文件描述符限制:select 的最大文件描述符数量通常受限于系统定义的 FD_SETSIZE,通常是 1024。

示例代码

#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>

int main() {
fd_set readfds;
struct timeval tv;
int ret;

FD_ZERO(&readfds);
FD_SET(0, &readfds); // 添加标准输入

tv.tv_sec = 5; // 设置超时时间为 5 秒
tv.tv_usec = 0;

ret = select(1, &readfds, NULL, NULL, &tv);

if (ret == -1) {
perror("select");
} else if (ret == 0) {
printf("Timeout occurred! No data after 5 seconds.\n");
} else {
if (FD_ISSET(0, &readfds)) {
printf("Data is available now.\n");
}
}

return 0;
}

2. epoll

特点

(1)机制:epoll 通过一个文件描述符(epoll 文件描述符)来管理需要监视的文件描述符集合。epoll 使用事件驱动的方式,当文件描述符准备好时,会将事件存储在一个就绪列表中。

(2)使用方式:首先创建一个 epoll 文件描述符,然后将需要监视的文件描述符注册到 epoll 实例中。调用 epoll_wait 时,epoll 会返回已经准备好进行 I/O 操作的文件描述符。

(3)性能:epoll 的性能优于 select,尤其是在监视大量文件描述符时。epoll 不需要每次调用时都遍历整个文件描述符集合,而是直接返回就绪的文件描述符。

(4)无最大文件描述符限制:epoll 没有固定的文件描述符数量限制,可以监视更多的文件描述符。

示例代码

#include <stdio.h>
#include <sys/epoll.h>
#include <unistd.h>

#define MAX_EVENTS 10

int main() {
int epfd = epoll_create1(0);
if (epfd == -1) {
perror("epoll_create1");
return 1;
}

struct epoll_event ev, eventsMAX_EVENTS;
ev.events = EPOLLIN;
ev.data.fd = 0; // 添加标准输入

if (epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &ev) == -1) {
perror("epoll_ctl");
close(epfd);
return 1;
}

int nfds;
while (1) {
nfds = epoll_wait(epfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait");
close(epfd);
return 1;
}

for (int n = 0; n < nfds; ++n) {
if (eventsn.data.fd == 0) {
printf("Data is available now.\n");
}
}
}

close(epfd);
return 0;
}

3. 对比

|-----------|------------------|-----------------|
| 特性 | select | epoll |
| 机制 | 文件描述符集合 | 事件驱动 |
| 性能 | 随文件描述符数量增加而下降 | 高效,适用于大量文件描述符 |
| 最大文件描述符限制 | 通常为 1024 | 无固定限制 |
| 使用方式 | 遍历文件描述符集合 | 直接返回就绪的文件描述符 |
| 返回值 | 返回就绪的文件描述符数量 | 返回就绪的文件描述符数量 |
| 超时机制 | 支持超时 | 支持超时 |
| 资源消耗 | 每次调用都需要复制文件描述符集合 | 仅在文件描述符准备好时返回事件 |

相关推荐
袁小皮皮不皮5 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶5 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
清辞8536 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e6 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰7 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
ken22328 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu8 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法
编程圈子8 小时前
电机驱动开发学习2. 直流无刷电机工作原理
驱动开发·学习
MartinYeung58 小时前
[论文学习]大型语言模型(LLM)安全与隐私-基于善、恶、丑的深度分析
学习·安全·语言模型
什仙8 小时前
Mathcad Prime 的教程资料
学习·工具