【C语言】RDMACM、Verbs API与epoll一起使用的示例

一、epoll介绍

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

以下是epoll的主要使用方法和优点:

  1. epoll的创建和使用主要涉及到三个函数:epoll_create、epoll_ctl和epoll_wait。首先,使用epoll_create创建一个新的epoll实例,并返回一个引用该实例的文件描述符。然后,通过epoll_ctl注册对感兴趣的文件描述符。最后,使用epoll_wait等待I/O事件。
  2. epoll的优点主要体现在:支持一个进程打开大数目的socket描述符(FD);IO效率不随FD数目增加而线性下降;支持边缘触发模式;使用mmap加速内核与用户空间的消息传递。
  3. 水平触发和边沿触发是epoll的两种事件分发机制。二者的区别在于,水平触发模式下,只要文件描述符处于就绪状态,无论应用程序是否读取或者写入数据,每次调用epoll_wait都会返回该文件描述符;而在边缘触发模式下,只有当文件描述符状态发生变化时(比如从非就绪变为就绪),epoll_wait才会返回该文件描述符。

总的来说,epoll是Linux内核中处理大批量文件描述符的高效工具,特别适用于大量并发连接中只有少量活跃的情况,能显著提高系统CPU利用率。

二、示例

以下是一个使用C语言的示例,展示了如何在使用RDMACM和Verbs API时与epoll一起使用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <rdma/rdma_cma.h>#define MAX_EVENTS 10struct connection {struct rdma_cm_id *id;struct ibv_qp *qp;// 其他连接相关的数据
};void handle_cm_event(struct rdma_cm_event *event) {// 处理RDMACM事件的逻辑
}void handle_cq_event(struct ibv_wc *wc) {// 处理完成队列事件的逻辑
}int main() {struct rdma_event_channel *cm_channel;struct rdma_cm_event *event;struct epoll_event epoll_events[MAX_EVENTS];struct connection *conn;struct ibv_cq *cq;struct ibv_wc wc;int cm_fd, cq_fd, epoll_fd, i, n;// 创建RDMACM事件通知文件描述符cm_channel = rdma_create_event_channel();if (!cm_channel) {perror("Failed to create RDMACM event channel");return 1;}// 创建完成队列(CQ)cq = ibv_create_cq(NULL, 10, NULL, NULL, 0);if (!cq) {perror("Failed to create completion queue");return 1;}// 获取RDMACM事件通知文件描述符和完成队列的文件描述符cm_fd = rdma_event_channel_fd(cm_channel);cq_fd = cq->channel->fd;// 创建epoll实例epoll_fd = epoll_create1(0);if (epoll_fd == -1) {perror("Failed to create epoll instance");return 1;}// 将RDMACM事件通知文件描述符添加到epoll的事件集合中struct epoll_event cm_event;cm_event.events = EPOLLIN | EPOLLET;cm_event.data.fd = cm_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, cm_fd, &cm_event) == -1) {perror("Failed to add RDMACM event channel to epoll");return 1;}// 将完成队列的文件描述符添加到epoll的事件集合中struct epoll_event cq_event;cq_event.events = EPOLLIN | EPOLLET;cq_event.data.fd = cq_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, cq_fd, &cq_event) == -1) {perror("Failed to add completion queue to epoll");return 1;}// 进入事件循环while (1) {// 等待事件发生n = epoll_wait(epoll_fd, epoll_events, MAX_EVENTS, -1);if (n == -1) {perror("Failed to wait for events");return 1;}// 处理所有事件for (i = 0; i < n; i++) {if (epoll_events[i].data.fd == cm_fd) {// 有RDMACM事件发生event = rdma_get_cm_event(cm_channel);handle_cm_event(event);rdma_ack_cm_event(event);} else if (epoll_events[i].data.fd == cq_fd) {// 有完成队列事件发生while (ibv_poll_cq(cq, 1, &wc) > 0) {handle_cq_event(&wc);}}}}// 清理资源close(epoll_fd);ibv_destroy_cq(cq);rdma_destroy_event_channel(cm_channel);return 0;}

在这个示例中,我们使用了rdma/rdma_cma.h头文件中提供的RDMACM和Verbs API。首先,我们创建了一个RDMACM事件通知文件描述符和一个完成队列(CQ),然后将它们的文件描述符添加到epoll的事件集合中。接下来,我们进入一个事件循环,等待事件发生。如果有RDMACM事件发生,我们调用handle_cm_event函数来处理该事件;如果有完成队列事件发生,我们调用handle_cq_event函数来处理该事件。
请注意,这只是一个简单的示例,实际使用时可能需要根据具体需求进行更多的处理和错误检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/216335.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fuxploide,一款针对文件上传的Fuzz检测工具

fuxploide,一款针对文件上传的Fuzz检测工具 1.工具概述2.安装3.参数解析4.使用案例1.工具概述 Fuxploider 是一种开源渗透测试工具,可自动检测和利用文件上传表单缺陷。该工具能够检测允许上传的文件类型,并能够检测哪种技术最适合在所需的 Web 服务器上上传 Web Shell 或任…

Postswigger 靶场 XSS 通关

文章目录 PostSwigger靶场XSS通关学徒&#xff1a;第一关学徒&#xff1a;第二关学徒&#xff1a;第三关学徒&#xff1a;第四关学徒&#xff1a;第五关学徒&#xff1a;第六关学徒&#xff1a;第七关学徒&#xff1a;第八关学徒&#xff1a;第九关 PostSwigger靶场XSS通关 靶…

三、Shell 环境

一、Linux 系统分类 在 Linux 中&#xff0c;常见的 Shell 有以下几种&#xff1a; Bourne Shell&#xff08;sh&#xff09;&#xff1a;最早的 Shell&#xff0c;由 Stephen Bourne 开发。它是大多数其他 Shell 的基础。Bourne Again Shell&#xff08;bash&#xff09;&am…

前端 Web Workers 简介

简介 以前我们总说&#xff0c;JS 是单线程没有多线程&#xff0c;当 JS 在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验&#xff0c;从而需要设置把任务放在任务队列中&#xff1b;执行任务队列中的任务也并非多线程进行的&#xff0c;然而现在 HTML5 提供了…

遥感深度学习:如何读取TIFF文件和切片成256*256?

博客已同步微信公众号&#xff1a;GIS不要炒茄子 01 前言 最近打算认真从头开始学习深度学习和遥感结合的相关内容&#xff0c;主要通过Python进行处理。此前用深度学习进行遥感相关的学习一直都是用 tensorflow3.0 框架&#xff0c;但是考虑很多因素我后面打算换用 Pytorch…

使用HTTP协议在Linux上进行API调用

在Linux系统上使用HTTP协议进行API调用是一种常见的操作&#xff0c;有时候我们需要调用一些外部API来获取数据或者进行自动化操作。下面是一个使用HTTP协议在Linux上进行API调用的代码示例&#xff0c;希望能够帮助你更好地理解这个过程。 首先&#xff0c;我们需要使用curl命…

单臂路由与三层交换机

单臂路由 划分VLAN后同一VLAN的计算机属于同一个广播域&#xff0c;同一VLAN的计算机之间的通信是不成问题的。然而&#xff0c;处于不同VLAN的计算机即使是在同一交换机上&#xff0c;它们之间的通信也必须使用路由器。 图&#xff08;a&#xff09;是一种实现VLAN间路由的方…

人工智能学习8(集成学习之xgboost)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm 集成学习XGBoost(Extreme Gradient Boosting)极端梯度提升树1.最优模型的构建方法XGBoost目标函数案例1&#xff1a;泰坦尼克号案例2&#xff1a;对奥拓集团差评进行正确分类。数据准备&#xff1a;1.第一种…

Redis和MySQL双写一致性实用解析

1、背景 先阐明一下Mysql和Redis的关系&#xff1a;Mysql是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致&#xff08;即缓存一致性问题…

36V/48V转12V 10A直流降压DC-DC芯片-AH1007

AH1007是一款36V/48V转12V 10A直流降压&#xff08;DC-DC&#xff09;芯片&#xff0c;它是一种高性能的降压变换器&#xff0c;常用于工业、汽车和电子设备等领域。 AH1007采用了先进的PWM调制技术和开关电源控制算法&#xff0c;能够高效地将输入电压从36V/48V降低到12V&…

【Anaconda】Ubuntu anaconda使用(新建环境、最小化安装Tensorflow)

Ubuntu anaconda使用&#xff08;新建环境、最小化安装Tensorflow&#xff09; 清华源地址&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simplepip安装使用的时候&#xff0c; pip install xxx(库名) -i https://pypi.tuna.tsinghua.edu.cn/simple请先安装好anaconda&am…

无论您用selenium、appium还是playwright都必须使用PO设计模式

随着UI自动化测试工具可选性越来越多&#xff0c;工具也越来越稳定&#xff0c;前几年关于自动化测试架构设计的概念逐渐淡化&#xff0c;但是自动化架构设计中最有用的PO设计模式思想依然需要刚入门自动化测试领域的小白深刻掌握&#xff0c;本文就带大家理解什么是PO设置模式…

fastapi.templating与HTMLResponse

要声明一个模板对象&#xff0c;应将存储html模板的文件夹作为参数提供。在当前工作目录中&#xff0c;我们将创建一个 “templates “目录。 templates Jinja2Templates(directory“templates”) 我们现在要把这个页面的HTML代码渲染成HTMLResponse。让我们修改一下hello()函…

LeetCode:1631. 最小体力消耗路径(SPFA Java)

目录 1631. 最小体力消耗路径 题目描述&#xff1a; 实现代码与解析&#xff1a; BFSDP 原理思路&#xff1a; 1631. 最小体力消耗路径 题目描述&#xff1a; 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表…

electron命令下载失败,手动安装教程

现象&#xff1a;pnpm i electron, 一直卡在提示错误node install.js 一 、下载需要的electron版本 地址 二、下载完毕&#xff0c;解压压缩包&#xff0c; 进入项目的node_modules/electron文件夹&#xff0c;创建dist文件夹&#xff0c;将下载的zip包里的文件复制到dist…

【详解优先级队列(堆)】

目录 堆的概念 堆的性质 堆的存储方式 堆的创建 堆的向下调整 向下过程(以小堆为例) 向下过程(以大堆为例) 建堆的时间复杂度O(n) 堆的插入与删除 堆的插入 向上调整建堆的时间复杂度O(nlogn) 堆的删除 常见习题 常用接口介绍 PriorityQueue的特性 Pri…

16:00的面试,16:07就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到六月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

【IDEA】IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置&#xff1a;File>Settings>搜索maven 创建好的工程如下&#xff1a; src/main…

DNS漫游指南:从网址到IP的奇妙之旅

当用户在浏览器中输入特定网站时发生的整个端到端过程可以参考下图 1*4vb-NMUuYTzYBYUFSuSKLw.png 问题&#xff1a; 什么是 DNS&#xff1f; 答案 → DNS 指的是域名系统&#xff08;Domain Name System&#xff09;。DNS 是互联网的目录&#xff0c;将人类可读的域名&#…

Python码上行动系列丛书(由北京大学出版社出版)

前言 Python码上行动系列丛书火热来袭&#x1f4a5;&#x1f4a5;&#x1f4a5; 三册在手&#xff0c;Python全掌握&#xff01;无论是初学者还是进阶玩家&#xff0c;我们都有你想要的&#xff01; 让ChatGPT带你轻松入门Python编程&#xff0c;享受编程带来的乐趣&#xff0…