Linux网络编程(epoll的ET模式和LT模式)

简介: Linux网络编程(epoll的ET模式和LT模式)

前言

本篇文章主要来讲解epoll的ET模式和LT模式,epoll中有两种模式可以选择一种是ET模式(边缘触发模式),另一种是LT模式(水平触发模式)

一、ET模式和LT模式概念讲解

1.水平触发模式(LT,Level-Triggered)

在水平触发模式下,当一个文件描述符上的I/O事件就绪时,epoll会立即通知应用程序,然后应用程序可以对就绪事件进行处理。即,只要文件描述符处于就绪状态,epoll就会持续通知应用程序,直到应用程序处理完所有就绪事件并且再次进入阻塞等待状态。

对于非阻塞I/O,如果一个文件描述符上有可读或可写事件发生,应用程序可以立即进行读或写操作,即使读写操作无法一次完成。如果读或写操作不能立即完成,应用程序可以再次调用epoll等待新的事件通知。

2.边缘触发模式(ET,Edge-Triggered)

在边缘触发模式下,当一个文件描述符上的状态发生变化时(例如从不可读变为可读,或者从不可写变为可写),epoll会通知应用程序。

与水平触发模式不同的是,边缘触发模式只在状态变化的瞬间通知应用程序,通知仅发送一次。如果应用程序没有及时处理完这个事件,下次等待时将会错过该事件,即使事件仍然处于就绪状态。因此,在边缘触发模式下,应用程序需要确保尽可能完整地处理每个事件,以避免遗漏事件。

边缘触发模式适用于需要及时响应状态变化的场景,通常可以提供更高的性能,因为它最大程度上减少了不必要的事件通知。

二、边缘触发和水平触发适用的场景

边缘触发(ET)模式适用的情况:

需要尽快处理就绪事件:边缘触发模式通知应用程序文件描述符状态发生变化的时刻,要求应用程序立即对就绪事件进行处理。适用于需要高精度的事件处理,减少事件丢失的情况。

非阻塞I/O操作:边缘触发模式对非阻塞I/O操作更加高效,适用于需要按需处理大量数据的情况。

#include <stdio.h>
#include <sys/epoll.h>
#include <fcntl.h> // 包含非阻塞I/O所需的头文件
int main() {
    int epoll_fd = epoll_create1(0);
    struct epoll_event event;
    struct epoll_event events[10]; // 用于存储事件的数组
    // 向epoll实例注册文件描述符和事件
    event.events = EPOLLIN | EPOLLET; // 边缘触发模式
    event.data.fd = 0; // 示例中使用标准输入的文件描述符
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event) == -1) {
        perror("Failed to add file descriptor to epoll");
        return -1;
    }
    // 设置标准输入为非阻塞模式
    int flags = fcntl(0, F_GETFL, 0);
    flags |= O_NONBLOCK;
    fcntl(0, F_SETFL, flags);
    // 等待事件发生
    while (1) {
        int num_events = epoll_wait(epoll_fd, events, 10, -1);
        if (num_events == -1) {
            perror("Failed to wait for events");
            return -1;
        }
        for (int i = 0; i < num_events; i++) {
            if (events[i].data.fd == 0) {
                // 标准输入有数据可读
                char buffer[100];
                ssize_t num_bytes = read(0, buffer, sizeof(buffer));
                if (num_bytes > 0) {
                    // 处理读取的数据
                    // ...
                }
            }
        }
    }
    return 0;
}

水平触发(LT)模式适用的情况:

需要持续处理就绪事件:水平触发模式会持续通知应用程序文件描述符就绪,直到应用程序处理完所有就绪事件。适用于需要处理多个相关事件或者需要一次性处理大量数据的情况。

阻塞和非阻塞I/O操作混合使用:水平触发模式适用于既有阻塞又有非阻塞I/O操作的情况,可以在阻塞操作中循环调用读取或写入操作。

#include <stdio.h>
#include <sys/epoll.h>
int main() {
    int epoll_fd = epoll_create1(0);
    struct epoll_event event;
    struct epoll_event events[10]; // 用于存储事件的数组
    // 向epoll实例注册文件描述符和事件
    event.events = EPOLLIN; // 水平触发模式(默认模式)
    event.data.fd = 0; // 示例中使用标准输入的文件描述符
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event) == -1) {
        perror("Failed to add file descriptor to epoll");
        return -1;
    }
    // 等待事件发生
    while (1) {
        int num_events = epoll_wait(epoll_fd, events, 10, -1);
        if (num_events == -1) {
            perror("Failed to wait for events");
            return -1;
        }
        for (int i = 0; i < num_events; i++) {
            if (events[i].data.fd == 0) {
                // 标准输入有数据可读
                char buffer[100];
                ssize_t num_bytes = read(0, buffer, sizeof(buffer));
                // 处理读取的数据
                // ...
            }
        }
    }
    return 0;
}

总结

本篇文章就讲解到这里。


相关文章
|
2月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
88 2
|
4天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
32 15
|
9天前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
77 7
|
3月前
|
运维 监控 网络协议
|
2月前
|
存储 JSON Java
细谈 Linux 中的多路复用epoll
大家好,我是 V 哥。`epoll` 是 Linux 中的一种高效多路复用机制,用于处理大量文件描述符(FD)事件。相比 `select` 和 `poll`,`epoll` 具有更高的性能和可扩展性,特别适用于高并发服务器。`epoll` 通过红黑树管理和就绪队列分离事件,实现高效的事件处理。本文介绍了 `epoll` 的核心数据结构、操作接口、触发模式以及优缺点,并通过 Java NIO 的 `Selector` 类展示了如何在高并发场景中使用多路复用。希望对大家有所帮助,欢迎关注威哥爱编程,一起学习进步。
|
3月前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
124 1
|
3月前
|
网络协议 安全 Ubuntu
Linux中网络连接问题
【10月更文挑战第3天】
42 1
|
网络协议 Linux C语言
linux下CC++网络编程基本:socket实现tcp和udp的例子
linux下CC++网络编程基本:socket实现tcp和udp的例子
253 0
|
8月前
|
存储 网络协议 算法
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
67 0
|
8月前
|
网络协议 算法 Linux
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
77 0