当前位置: 首页 > news >正文

【系统搭建】DPDK关键概念与l2fwd源码解析

在这里插入图片描述

DPDK(Data Plane Development Kit)是一套用于高性能网络数据面处理的开发框架,其核心设计在于绕过内核协议栈,它提供了一个用户空间下的高效数据包处理库函数,可以用于快速开发高性能的网络应用程序,如网络包处理、数据包过滤、虚拟化、路由等。


一,DPDK关键概念与架构总结

1. DPDK核心架构框图

DMA
分配
核绑定
核绑定
无锁队列
无锁队列
物理网卡
巨页内存池
Mempool
Mbuf数据包
PMD轮询线程
CPU Core 0
CPU Core 1
逻辑核lcore

DPDK与内核的差异在于:​
中断 vs 轮询​(红色/绿色)
🔴 内核:每次收包触发中断,上下文切换开销大
🟢 DPDK:主动轮询网卡队列,无中断开销

​内存拷贝次数​(红色/绿色)
🔴 内核:至少 2 次拷贝(DMA→内核缓冲→用户空间)
🟢 DPDK:零拷贝(DMA直接到用户态内存池)

​协议栈位置​
🔴 内核:需要经过完整的内核协议栈
🟢 DPDK:绕过内核,用户态轻量级协议栈

​核心调度​
🔴 内核:依赖系统调度器,可能发生核心迁移
🟢 DPDK:固定核心绑定(lcore),消除缓存失效

DPDK处理流程
内核处理流程
PMD轮询发现新包
网卡收到数据包
零拷贝DMA到用户态
用户态协议栈处理
直接转发或修改
触发硬件中断
网卡收到数据包
CPU上下文切换
内核协议栈处理
数据拷贝到用户态
应用层处理

2. 核心概念理解

(1)巨页与内存管理

在高速网络数据包处理中,需要频繁地分配和释放大块内存,这种频繁的内存分配和释放操作会导致大量的 CPU 资源被浪费在内存管理上,从而降低网络处理的性能。因此,DPDK 采用巨页、 Mempool 和 Mbuf 等机制共同实现高效的内存管理和数据包处理机制。

巨页是 DPDK 优化内存性能的一种方式。 由于内存管理单元需要对于每个页面维护页表,而页表本身也需要占用内存,当页表数量较多时就会造成较大的内存开销和访问延迟。 DPDK 采用了巨页的方式来减少这种开销, 传统内存页的大小是4KB,而巨页是更大的内存页,通常为 2MB 或 1GB。使用巨页可以减少页表项、降低 CPU 的 TLB(Translation Lookaside Buffer)缺失率和 TLB 访问的延迟,提高CPU 的处理性能。

巨页初始化
2MB/1GB大页
Memory Pool预分配
Mbuf对象池
零拷贝数据存取

Mempool 是 DPDK 中用于管理大块内存的机制,它提供了一种预先分配和管理内存的方式,以避免频繁地进行内存分配和释放操作。 Mempool 可以看作是一个固定大小的内存块数组,其中每个内存块都是相同大小的。通过使用 Mempool,可以在初始化阶段一次性分配一定数量的内存块,并在需要时从内存池中获取空闲的内存块,而无需进行动态内存分配,可以大大提高数据包处理的效率和性能,且避免了内存碎片问题。

Mbuf 是 DPDK 中用于存储和操作数据包的结构体。每个 Mbuf 结构体中包含了数据包的相关信息,例如数据包的长度、数据指针、引用计数等。 Mbuf 结构体被组织成一个链表,形成了一个数据包缓冲区池。通过使用 Mbuf,可以高效地管理和操作数据包,例如接收、发送、修改数据包内容等操作。 Mbuf 结构体还提供了一些优化的特性,例如预留头部空间、避免内存对齐问题等,以提高数据包处理的效率。

  • 作用

    • 减少内存管理的开销,避免频繁的页表切换。
    • 提供连续的大块物理内存,DPDK利用巨页分配内存池(Memory Pool),确保数据包处理时无需频繁的内存映射/解映射。
  • 代码体现

    // 创建内存池(使用巨页)
    struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS,MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,rte_socket_id());
    
(2) 核绑定(CPU Affinity / Core Binding)

又称“DPDK 的 CPU 亲和性”,是指将 DPDK 应用程序的线程或进程与特定的 CPU 核心绑定,使得这些线程或进程只会在指定的 CPU 核心上运行。

在网络数据包处理中,数据包通常需要经过多个处理步骤,例如接收、解析、转发、过滤、封装等,每个步骤都需要一定的计算和处理。如果这些处理步骤在不同的 CPU 核心上进行,由于不同 CPU 核心之间的缓存共享等问题,会导致额外的延迟和性能下降。因此,将这些处理步骤绑定到特定的 CPU 核心上,可以避免这些问题,提高数据包处理的效率和可预测性。

CPU 亲和性还可以减少 CPU 上下文切换的开销,当应用程序的线程或进程在不同的 CPU 核心之间切换时,需要切换 CPU 寄存器、缓存等状态,会带来额外的开销。通过将线程或进程与特定的 CPU 核心绑定,可以减少这种开销,提高应用程序的性能。

  • 作用
    • 减少上下文切换:避免线程在多个核心间迁移时的缓存失效(Cache Miss)。
    • 提高缓存局部性:线程专用某个核心的L1/L2缓存,加速数据访问。
    • 隔离性:关键线程(如PMD轮询线程)独占核心,避免其他任务干扰。
  • DPDK中的应用
    • 使用lcore(逻辑核)模型,通过eal_thread_set_affinity绑定线程到指定CPU。
    • 例如:将PMD线程绑定到独立核心,确保实时轮询网卡队列。
独占
独占
DPDK进程
lcore 0
lcore 1
绑定CPU Core 2
绑定CPU Core 3
执行PMD轮询
  • 代码体现
    # 启动命令(绑定核心0-3)
    ./l2fwd -l 0-3 -- -q 2
    
(3)PMD工作模型

轮询模式驱动(Poll Mode Driver)是DPDK的用户态网卡驱动,通过主动轮询代替传统中断机制处理数据包。传统的网络驱动是在操作系统内核中实现的,它们使用中断处理程序来响应网络数据包, 网络中大量数据包到来时,会频繁产生中断请求, 这会引入很大的开销。与之相比,用户态驱动是运行在用户空间的网络驱动程序,可以绕过操作系统内核,直接处理网络数据包,因此可以实现更低的延迟和更高的吞吐量。 DPDK 通过 UIO(User-space I/O)和 VFIO(Virtual Function I/O)实现了用户态驱动 PMD(PollMode Driver)。

网卡队列 PMD线程 用户空间 转发逻辑 DMA写包 零拷贝读取 批量处理 直接回传 网卡队列 PMD线程 用户空间 转发逻辑

PMD 是基于用户态的轮询机制的驱动,它使用轮询机制来获取网络数据包,而不是使用中断,因此可以减少 CPU 上下文切换的开销,提高系统的吞吐量和响应性能。 PMD 通过使用 UIO 或 VFIO 将硬件设备映射到用户态空间,实现了对硬件设备的直接访问和控制,并且 EAL(Environment Abstraction Layer)提供了一组硬件抽象层接口,可以方便地管理和操作硬件资源。

UIO 是一种轻量级的驱动框架,允许用户态程序访问硬件设备。 UIO 通过创建设备节点将硬件设备映射到用户态空间,以便用户程序可以通过文件操作系统调用来直接访问硬件资源。 UIO 驱动在内核中运行,与硬件设备交互,处理硬件中断,将数据传递给用户空间的应用程序。 DPDK 在内核中安装了 igb_uio 模块,以此借助 UIO 技术来截获中断,并重设中断回调行为,从而绕过内核协议栈后续的处理流程。

VFIO 是一种更加灵活的设备虚拟化框架,也可以用于用户态驱动。 VFIO 使用 IOMMU 来实现硬件资源的隔离,将硬件设备映射到应用程序的虚拟地址空间中。与 UIO 相比, VFIO 提供更高级别的控制和访问硬件资源的灵活性,但需要更高的配置和管理。

  • 核心特点
    • 零拷贝(Zero-Copy):数据直接从网卡DMA到用户态内存,无需内核参与。
    • 无中断轮询:持续检查网卡接收/发送队列,避免中断上下文切换的开销。
    • 多队列支持:每个队列绑定独立CPU核心,实现并行处理。

概念间的协作关系

  1. 内存管理提供高效的内存基础;
  2. 核绑定确保线程独占CPU资源,减少切换开销;
  3. PMD基于前两者实现高吞吐、低延迟的数据包处理。
    三者共同支撑DPDK的核心理念:通过用户态、轮询、无锁、零拷贝,最大化数据面性能

二,l2fwd解析

1. 代码结构

main()
├── rte_eal_init()          // EAL环境初始化
├── rte_eth_dev_configure()// 网卡配置
├── rte_eth_rx_queue_setup()// 接收队列初始化
├── rte_eth_tx_queue_setup()// 发送队列初始化
└── rte_eal_remote_launch() // 启动数据面线程

2. DPDK特性在代码中的体现

(1)巨页内存初始化
// 启动参数(指定巨页目录)
const char *eal_args[] = {"l2fwd", "-n", "4", "--huge-dir=/dev/hugepages",
};
rte_eal_init(sizeof(eal_args)/sizeof(eal_args[0]), (char**)eal_args);
(2)CPU核绑定
RTE_LCORE_FOREACH_WORKER(lcore_id) {rte_eal_remote_launch(l2fwd_launch_one_lcore, NULL, lcore_id);
}
// 线程函数内自动绑定核心
(3)PMD轮询模式
while (1) {// 批量收包(零拷贝)nb_rx = rte_eth_rx_burst(port, queue, pkts_burst, MAX_PKT_BURST);// 批量转发nb_tx = rte_eth_tx_burst(port^1, queue, pkts_burst, nb_rx);
}
(4)Mempool与Mbuf
// 从内存池获取mbuf
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
rte_pktmbuf_alloc_bulk(mbuf_pool, pkts_burst, nb_rx);// 释放mbuf(实际是放回内存池)
rte_pktmbuf_free_bulk(pkts_burst, nb_tx);

以下是对DPDK l2fwd示例代码的核心逻辑解析、代码注释及作为接收程序的可行性分析:

(5)功能逻辑:
  1. 初始化阶段

    • EAL环境初始化(rte_eal_init)
    • 命令行参数解析(端口掩码、混杂模式、队列数量等)
    • 内存池创建(rte_pktmbuf_pool_create)
    • 端口配置:
      • 设置RX/TX队列
      • 启用混杂模式(可选)
      • MAC地址获取
      • 启动网卡(rte_eth_dev_start)
  2. 转发逻辑

    while (!force_quit) {// 1. 定时刷新发送缓冲区if (tsc超时) {rte_eth_tx_buffer_flush();print_stats(); // 定时打印统计信息}// 2. 接收数据包for (每个端口队列) {nb_rx = rte_eth_rx_burst(); // 批量收包for (每个数据包) {l2fwd_simple_forward(); // 处理并转发}}
    }
    
  3. 数据包处理

    static void l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid) {// 修改目标MAC为02:00:00:00:00:PORTID// 源MAC替换为端口MACrte_eth_tx_buffer(); // 加入发送缓冲区
    }
    

相关文章:

【系统搭建】DPDK关键概念与l2fwd源码解析

DPDK(Data Plane Development Kit)是一套用于高性能网络数据面处理的开发框架,其核心设计在于绕过内核协议栈,它提供了一个用户空间下的高效数据包处理库函数,可以用于快速开发高性能的网络应用程序,如网络…...

【Qt】初识Qt(一)

目录 一、Qt的背景二、认识Qt项目 一、Qt的背景 关于客户端开发: 客户端开发的重要任务,是编写和用户交互的界面,和用户交互的界面有两种风格: TUI:命令行界面,也叫终端界面GUI:图形化界面 Q…...

Django REST framework 并结合 `mixin` 的示例

下面为你提供一个使用 Django REST framework 并结合 mixin 的示例,该示例将实现一个简单的图书管理 API。 项目需求 我们要创建一个图书管理系统的 API,支持对图书信息的创建、读取、更新和删除操作。 实现步骤 1. 项目初始化 首先,确保你已经安装了 Django 和 Django…...

《前端性能优化秘籍:打造极致用户体验》

在当下,网站和应用的性能表现直接关乎用户去留。快速加载、流畅交互的页面能让用户沉浸其中,反之,缓慢的响应速度则会让他们毫不犹豫地离开。对于前端开发者而言,性能优化不仅是技术追求,更是提升用户体验、增强产品竞…...

数据结构与算法学习导航

目录 指导思想资料总结代码随想录hello-algoOI-WIKI 一名麻瓜的刷leetcode的简单概述。 在这里对过去的自己说: 如果你相信算法有用你就刷刷leetcode,如果不相信面试会让你相信。 当然,现在我确实认为算法和数据结构有用,leetcode也有用。 …...

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏,凑近一看…...

nginx中的代理缓存

1.缓存存放路径 对key取哈希值之后,设置cache内容,然后得到的哈希值的倒数第一位作为第一个子目录,倒数第三位和倒数第二位组成的字符串作为第二个子目录,如图。 proxy_cache_path /xxxx/ levels1:2 2.文件名哈希值...

【深度学习】详解矩阵乘法、点积,内积,外积、哈达玛积极其应用|tensor系列02

博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾:【深度学习】你真的理解张量了吗?|标量、向量、矩阵、张量的秩|01每日一言🌼: “脑袋想不明白的,就用脚想”…...

20.3 使用技巧3

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.3.5 禁止追加行与禁止删除行 通常情况下DataGridView最末一行是空白行,在此行单元格输入数据就可以追加新行。如果需要…...

使用代理IP提取数据的步骤是什么?代理IP如何提高爬虫采集效率?

在当今大数据时代,网络爬虫已成为获取互联网信息的重要手段。然而,许多网站为了防止数据被过度抓取,会设置反爬机制,如IP封禁、访问频率限制等。这时,使用代理IP就成为了一种有效的解决方案。本文将详细介绍使用代理IP…...

探索关系型数据库 MySQL

目录 引言 一.SQL的基本操作 1.数据库是什么? 什么是SQL? 1.1.OLTP 1.2.OLAP 1.3.SQL 1.4.DQL 1.5.DML 1.6.DDL 1.7.DCL 1.8.TCL 1.9.数据库术语 2.MySQL体系结构 2.1.连接者 2.2.MySQL 内部连接池 2.3.管理服务和工具组件 2.4.SQL接口 …...

Redis--事务

目录 一、事务介绍 二、事务操作 2.1 MULTI 2.2 EXEC 2.3 DISCARD 2.4 WATCH 2.5 UNWATCH 一、事务介绍 Redis 的事务和 MySQL 的事务概念上是类似的. 都是把一系列操作绑定成⼀组. 让这⼀组能够批量执行. 但是注意体会 Redis 的事务和 MySQL 事务的区别: 1.弱化的原子性…...

【Windows上配置Git环境】

在Windows上配置Git环境可以按照以下步骤进行: 1. 下载Git 打开浏览器,访问Git官方网站https://git-scm.com/downloads。在下载页面中,找到适用于Windows的下载链接,根据你的系统是32位还是64位选择相应的安装包进行下载 。 2.…...

揭秘大数据 | 23、软件定义网络

软件定义网络将网络的边缘从硬件交换机推进到了服务器里面,将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员网络管理员的模式变成了纯系统管理员的模式,让服务器的业务部署变得简单,不再依赖于形态和功能各异的硬件交换机&#xf…...

前端api(请求后端)简易template

微信小程序 API 模块模板 基本 API 模块结构 /*** 示例API模块*/ const api require(../api); const config require(../../config/index);// 示例API对象 const exampleApi {// API方法定义... };// 导出模块 module.exports exampleApi;标准 RESTful 请求方法 获取列表…...

【力扣】重排链表

重排链表 代码 class Solution { public:void reorderList(ListNode* head) {//当链表只有一个节点或两个节点时直接返回空,不用重排if (head->next NULL || head->next->next NULL) return;//1. 进行分割链表ListNode* fast head, *slow head;ListNode* end1 N…...

选 Hibernate 还是 MyBatis?全方位差异解读

Hibernate 和 MyBatis 都是 Java 开发中用于处理数据库操作的持久化框架,不过它们在实现技术上存在诸多差异,下面从多个方面进行对比: 1. 映射机制 Hibernate:采用全自动的对象关系映射(ORM)机制&#xf…...

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...

类和对象(下篇)(详解)

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…...

win10下github libiec61850库编译调试sntp_example

libiec61850 https://github.com/mz-automation/libiec61850 v1.6 简介 libiec61850 是一个开源&#xff08;GPLv3&#xff09;的 IEC 61850 客户端和服务器库实现&#xff0c;支持 MMS、GOOSE 和 SV 协议。它使用 C 语言&#xff08;根据 C99 标准&#xff09;实现&#xf…...

【HDFS入门】HDFS高可用性与容错机制深度解析

目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…...

Qt QML实现Windows桌面歌词动态播放效果

前言 使用Qt5.15.2&#xff0c;QML实现简单的歌词动态播放效果。 效果图如下&#xff1a; 注&#xff1a;这里只是为了演示播放效果&#xff0c;并未真正加载音频进行播放。可以在此基础上进行扩展。 正文 关键代码 QML部分 import QtQuick 2.15 import QtQuick.Window 2.…...

Qt GUI 库总结

Qt GUI 库总结 Qt GUI 库&#xff08;QtGui&#xff09;是 Qt 框架中负责图形用户界面&#xff08;GUI&#xff09;开发的核心模块。本文将一步步详解 QtGui&#xff0c;从基础入门到高级应用&#xff0c;帮助你全面掌握其功能。以下内容包括环境配置、基本功能、核心特性及进…...

[dp16_两个数组] 通配符匹配 | 交错字符串 | 两个字符串的最小ASCII删除和

目录 1.通配符匹配 题解 2.交错字符串 题解 3.两个字符串的最小ASCII删除和 1.通配符匹配 链接&#xff1a;44. 通配符匹配 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字…...

记录一次生产中mysql主备延迟问题处理

登录库&#xff1a; mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行&#xff1a;show slave status\G 查看 seconds_Behind_Master&#xff0c;延迟 2705s&#xff0c;而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...

【计算机视觉】OpenCV实战项目-AdvancedLaneDetection 车道检测

AdvancedLaneDetection 项目解析 项目概述项目结构功能和步骤依赖项使用方法项目特点改进建议结论运行项目1. 克隆项目仓库2. 安装依赖项创建虚拟环境&#xff08;可选&#xff09;激活虚拟环境安装依赖项 3. 准备数据4. 运行项目5. 调整配置&#xff08;可选&#xff09;6. 查…...

趣味编程之分布式系统:负载均衡的“雨露均沾“艺术

#此篇文章由Deepseek大力支持&#x1f60b; 凌晨三点&#xff0c;西二旗某火锅店后厨—— “羊肉卷走3号桌&#xff01;” “肥牛卷去7号&#xff01;” “虾滑优先给VIP区&#xff01;” 我蹲在传菜口的监控屏幕前&#xff0c;看着机器人服务生们忙而不乱地穿梭。突然间&am…...

移植firefly core-1126-jd4官方sdk源码到其他rv1126板卡时 kernel启动中失去响应问题解决

问题背景 在项目中采用firefly core-1126-jd4的sdk适配其他rv1126板卡遇到kernel启动中无响应。串口能看到运行到usb、mmc等模块驱动流程&#xff0c;但之后就打印&#xff0c;通过追加打印确认usb、mmc模块的init已经执行完&#xff0c;怀疑是执行其他某个静态编译进kernel的…...

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中&#xff0c;‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则&#xff0c;以下是详细说明&#xff1a; 1. 表的别名&#xff08;Table Alias&#xff09;‌ ‌不支持 AS 关键字‌&#xff0c;直接跟在表名后即可。‌语法示例‌&#xff1a; S…...

对于“人工智能+教育”的一些思考

如果说人工智能当下最合适的落地场景&#xff0c;那么进入课堂这件事一定是排在靠前的位置。从当下的趋势来看&#xff0c;人工智能进入课堂已经不是设想&#xff0c;而是我们必须要去做的一件事了。 方向有了&#xff0c;但是问题是&#xff1a;人工智能进入中小学课堂到底应该…...

Android audio系统四 audiopolicy与audioflinger播放和录音

播放/录音在上层是通过AudioTrack与AudioRecord实现的。通过一张简单的流程图查看audiopolicy与audioflinger进行了哪些操作...

【Pandas】pandas DataFrame xs

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签&#xff08;行标签和列标签&#…...

开源一体化白板工具Drawnix本地部署打造毫秒级响应的远程协作空间

文章目录 前言1、什么是Drawnix&#xff1f;2、部署Drawnix的环境和步骤3、Drawnix的简单使用方法4、安装cpolar内网穿透5、配置公网地址6、配置固定二级子域名公网地址总结 前言 想象一下&#xff0c;你是一个创意满满的设计师&#xff0c;脑海中涌现出无数灵感火花。你急忙打…...

UMAEA论文阅读

Preliminaries MMKG为一个五元组G{E, R, A, V, T}&#xff0c;其中E、R、A和V分别表示实体集、关系集、属性集和图像集。 T⊆ERE是关系三元组集。 给定两个MMKG G1 {E1, R1, A1, V1, T1} 和 G2 {E2, R2, A2, V2, T2}&#xff0c; MMEA旨在识别每个实体对&#xff08;e1…...

捕鱼船检测数据集VOC+YOLO格式2105张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2105 标注数量(xml文件个数)&#xff1a;2105 标注数量(txt文件个数)&#xff1a;2105 …...

R4打卡——pytorch实现LSTM预测火灾

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nndata pd.read_csv("da…...

【数字图像处理】图像增强

图像增强——频率域分析 卷积定理 函数卷积的傅里叶变换是函数傅里叶变换的乘积&#xff0c;即&#xff1a;一个域中的卷积相当于另一个域中的乘积 F(x)为傅里叶变换 傅里叶 傅里叶级数&#xff1a;任何周期函数都可以用不同频率的正弦函数和余弦函数构成的无穷级数来表示。 正…...

Windows平台用vistual studio 2017打包制作C++动态库

1. 创建库项目 打开 Visual Studio 2017&#xff0c;选择 文件 → 新建 → 项目。选择 Visual C → Windows 桌面 → 动态链接库 (DLL) 或 静态库 (LIB)。 动态库 (DLL)&#xff1a;生成 .dll 和 .lib&#xff08;导出符号表&#xff09;。静态库 (LIB)&#xff1a;生成 .lib&…...

QT日历控件重写美化

效果图 先放一个效果图以供大家参考&#xff0c;大家可以根据自己需要的效果来调整自己的控件&#xff0c;日历控件实现了自定义日历选择框&#xff0c;设置了表头颜色&#xff0c;设置日历当天重要事件提醒功能。 设置表头样式 setVerticalHeaderFormat(QCalendarWidget::NoV…...

单细胞分析读取处理大型数十万细胞的数据集的优化

单细胞分析读取处理大型数十万细胞的数据集的优化 背景简介 有朋友反映用自己的笔记本电脑在分析比较大的单细胞数据集的时候&#xff0c;比如细胞数量有十万个以上甚至几十万个的时候&#xff0c;可能自己的电脑的内存32G或64G都不够用&#xff0c;一般来说&#xff0c;做生…...

HTTP 3.0 协议的特点

HTTP/3 是互联网传输协议的一次重要升级&#xff0c;相较于 HTTP/2&#xff0c;它引入了多项显著改进和新特性。 基于 QUIC 协议&#xff1a; HTTP/3 采用了 QUIC&#xff08;Quick UDP Internet Connections&#xff09;作为底层传输协议&#xff0c;QUIC 基于 UDP&#xff0…...

电子电器架构 --- 下一代汽车电子/电气(E/E)架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…...

08软件测试需求分析案例-删除用户

删除用户是后台管理菜单的一个功能模块&#xff0c;只有admin才有删除用户的权限。不可删除admin。 1.1 通读文档 通读需求规格说明书是提取信息&#xff0c;提出问题&#xff0c;输出具有逻辑、规则、流程的业务步骤。 信息&#xff1a;此功能应为用户提供确认删除的功能。…...

await 在多线程,子线程中的使用

await 在多线程,子线程中的使用 await self.send_reply(user, user, user, auto_content, reply) 这行代码是在一个异步函数里调用类的实例方法 send_reply 代码含义 1. await 关键字 在 Python 的异步编程里,await 关键字的作用是暂停当前异步函数的执行,直到 await 后…...

NLP高频面试题(四十六)——Transformer 架构中的位置编码及其演化详解

引言 Transformer 模型(Vaswani 等人,2017)在序列建模中取得了革命性突破,利用自注意力机制实现了并行的序列处理。然而,Transformer 本身对序列的顺序信息不敏感:输入序列元素在自注意力中是无排列的(Permutation-invariant)。换言之,Transformer 缺乏像 RNN 那样的…...

C++笔记-list

list即是我们之前学的链表&#xff0c;这篇主要还是讲解list的底层实现&#xff0c;前面会讲一些list区别于前面string和vector的一些接口以及它们的注意事项。 一.list的基本使用 和之前的string&#xff0c;vector一样&#xff0c;有很多之前见过的一些接口&#xff0c;经过…...

机器学习 | 细说Deep Q-Network(DQN)

文章目录 &#x1f4da;传统Q学习的局限性&#x1f4da;DQN介绍&#x1f407;核心思想&#x1f407;关键技术&#x1f407;DQN的工作流程⭐️流程分步讲解&#x1f504; 整体流程循环小结 &#x1f407;DQN的局限性及改进方向 &#x1f440;参考视频&博客 什么是 DQN (Rein…...

【SpringBoot+Vue自学笔记】003 SpringBoot Controll

跟着这位老师学习的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 这段话的意思其实是&#xff1a;Spring Boot 简化了传统 Web 项目的搭建流程&#xff0c;让你少折腾配置&#xff0c;直接开搞业务逻辑。 &#x1f52…...

Sentinel源码—4.FlowSlot实现流控的原理一

大纲 1.FlowSlot根据流控规则对请求进行限流 2.FlowSlot实现流控规则的快速失败效果的原理 3.FlowSlot实现流控规则中排队等待效果的原理 4.FlowSlot实现流控规则中Warm Up效果的原理 1.FlowSlot根据流控规则对请求进行限流 (1)流控规则FlowRule的配置Demo (2)注册流控监…...

跟康师傅学Java-基础语法

跟康师傅学Java-基础SE 一、Java语言概述 1. 基本概念 什么是Java?干什么的? 前端是服务员,java做后台的,服务器,好比餐馆的厨师! Java之父:詹姆斯.高斯林(James Gosling) 软件:一系列按照特定顺序组织的计算机数据和指令的集合。分为系统软件和应用软件。 程序…...