dma_buf学习记录之二核心接口
dma_buf学习记录之一基础知识-CSDN博客
本章学习linux\include\linux\dma-buf.h
dma-buf.h
是 Linux 内核中用于实现 DMA 缓冲区共享框架的核心头文件。它定义了 dma-buf
子系统的主要数据结构和操作接口,允许设备驱动程序之间共享缓冲区,并支持异步硬件访问的同步。通过 dma-buf
,Linux 内核能够有效地管理跨设备驱动程序的缓冲区共享,同时确保访问的安全性和一致性。
一、主要数据结构
1. **`struct dma_buf_ops`**
/*** struct dma_buf_ops - 在 struct dma_buf 上可执行的操作* @vmap: [可选] 将缓冲区映射到内核地址空间,创建虚拟映射。* 与 vmap 和相关函数相同的限制适用。* @vunmap: [可选] 解除缓冲区的虚拟映射。*/
struct dma_buf_ops {/*** 如果为 true,则框架将缓存每个附件的第一个映射。这可以避免多次为同一附件创建映射。*/bool cache_sgt_mapping;/*** 此回调由 dma_buf_attach() 调用,确保给定的 &dma_buf_attachment.dev 可以访问提供的 &dma_buf。* 支持特殊位置(如 VRAM 或设备特定的 carveout 区域)缓冲区对象的导出者应检查缓冲区是否可以移动到系统内存(或被提供的设备直接访问),否则需要失败 attach 操作。* 导出者通常还应检查当前分配是否满足新设备的 DMA 约束。如果不满足,并且分配无法移动,则也应失败 attach 操作。* 导出者的私有数据可以存储在 &dma_buf_attachment.priv 指针中。* 此回调是可选的。* 返回值:* 成功返回 0,失败返回负错误码。如果返回 -EBUSY,则表示后端存储已分配且与请求设备的要求不兼容。*/int (*attach)(struct dma_buf *, struct dma_buf_attachment *);/*** 此回调由 dma_buf_detach() 调用,释放 &dma_buf_attachment。* 提供此回调以便导出者清理与 &dma_buf_attachment 相关的任何私有数据。* 此回调是可选的。*/void (*detach)(struct dma_buf *, struct dma_buf_attachment *);/*** 此回调由 dma_buf_pin() 调用,通知导出者 DMA 缓冲区不能再移动。理想情况下,导出者应固定缓冲区,使其对所有设备都可访问。* 此回调在 dmabuf.resv 对象锁定时调用,并与 @cache_sgt_mapping 互斥。* 对于非动态导入者,此回调会在 dma_buf_attach() 中自动调用。* 注意:类似于非动态导出者在其 @map_dma_buf 回调中的行为,驱动程序必须保证在此函数返回时内存可用并清除旧数据。内部流水线化缓冲区移动的驱动程序必须等待所有移动和清除完成。* 返回值:* 成功返回 0,失败返回负错误码。*/int (*pin)(struct dma_buf_attachment *attach);/*** 此回调由 dma_buf_unpin() 调用,通知导出者 DMA 缓冲区可以再次移动。* 此回调在 dmabuf->resv 对象锁定时调用,并与 @cache_sgt_mapping 互斥。* 此回调是可选的。*/void (*unpin)(struct dma_buf_attachment *attach);/*** 此回调由 dma_buf_map_attachment() 调用,用于将共享的 &dma_buf 映射到设备地址空间,是强制性的。只有在 @attach 成功调用后才能调用此函数。* 此调用可能会休眠,例如当后端存储首次需要分配,或需要移动到适合当前所有附加设备的位置时。* 注意:此函数所需的任何特定缓冲区属性应添加到通过 &device.dma_params 访问的 device_dma_parameters 中。@attach 回调也应检查这些约束。* 如果这是第一次调用,导出者可以选择扫描此缓冲区的所有附件,收集附加设备的要求,并选择合适的后端存储。* 根据枚举 dma_data_direction,可能允许多个用户同时访问(例如读取),或导出者希望提供给缓冲区用户的任何其他类型的共享。* 当 dynamic_mapping 标志为 true 时,此回调始终在 dmabuf->resv 对象锁定时调用。* 注意:对于非动态导出者,驱动程序必须保证在此函数返回时内存可用并清除旧数据。内部流水线化缓冲区移动的驱动程序必须等待所有移动和清除完成。动态导出者不需要遵循此规则:对于非动态导入者,缓冲区已经通过 @pin 固定,具有相同的要求。动态导入者则需要遵守 dma_resv 围栏。* 返回值:* 成功返回指向 DMA 缓冲区后端存储的 &sg_table 散列表,该散列表已映射到使用提供的 &dma_buf_attachment 附加的设备地址空间。散列表中的地址和长度以 PAGE_SIZE 对齐。* 失败时返回一个包含负错误值的指针。当信号到达时也可能返回 -EINTR。* 注意:导出者不应尝试缓存散列表,或为多次调用返回相同的散列表。缓存由 DMA-BUF 代码(针对非动态导入者)或导入者完成。散列表的所有权转移给调用者,并通过 @unmap_dma_buf 返回。*/struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,enum dma_data_direction);/*** 此回调由 dma_buf_unmap_attachment() 调用,用于解除并释放 @map_dma_buf 分配的 &sg_table,是强制性的。对于静态 dma_buf 处理,如果这是 DMA 缓冲区的最后一个映射,也可能解除固定后端存储。*/void (*unmap_dma_buf)(struct dma_buf_attachment *,struct sg_table *,enum dma_data_direction);/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY* if the call would block.*//*** 在最后一次 dma_buf_put 调用后调用,释放 &dma_buf,是强制性的。*/void (*release)(struct dma_buf *);/*** 此回调由 dma_buf_begin_cpu_access() 调用,允许导出者确保内存实际对 CPU 访问是连贯的。导出者还应确保 CPU 访问对访问方向是连贯的。方向可用于优化缓存刷新,例如以不同的方向(读取而不是写入)访问可能会返回陈旧甚至错误的数据(例如当导出者需要将数据复制到临时存储时)。* 注意:此回调既通过 DMA_BUF_IOCTL_SYNC IOCTL 命令为通过 @mmap 建立的用户空间映射调用,也通过 @vmap 为内核映射调用。* 此回调是可选的。* 返回值:* 成功返回 0,失败返回负错误码。例如,当后端存储无法分配时可能会失败。当调用被中断并需要重新启动时,也可以返回 -ERESTARTSYS 或 -EINTR。*/int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction);/*** 此回调由 dma_buf_end_cpu_access() 调用,当导入者完成对 CPU 的访问时调用。导出者可以使用此回调刷新缓存并撤销在 @begin_cpu_access 中所做的任何操作。* 此回调是可选的。* 返回值:* 成功返回 0,失败返回负错误码。当调用被中断并需要重新启动时,可以返回 -ERESTARTSYS 或 -EINTR。*/int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction);/*** 此回调由 dma_buf_mmap() 函数使用。* 注意:映射需要是非连贯的,用户空间预计会使用 DMA_BUF_IOCTL_SYNC 接口来括号化 CPU 访问。* 由于 dma-buf 缓冲区在其生命周期内的大小不变,dma-buf 核心会检查 vma 是否过大并拒绝此类映射。因此导出者无需重复此检查。驱动程序也不需要自己进行检查。* 如果导出者需要手动刷新缓存并伪造 mmap 支持的连贯性,则需要能够清除指向后端存储的所有 pte。Linux 内存管理需要与存储在 vma->vm_file 中的 struct file 关联的 struct address_space 来通过 unmap_mapping_range 函数完成此操作。但 dma_buf 框架只为每个 dma_buf fd 使用匿名文件 struct file,即所有 dma_buf 共享同一个文件。* 因此,导出者需要通过设置 vma->vm_file 并调整 vma->vm_pgoff 来在 dma_buf mmap 回调中建立自己的文件(和 address_space)关联。在 gem 驱动程序的具体情况下,导出者可以使用 gem 已提供的 shmem 文件(并设置 vm_pgoff = 0)。然后导出者可以通过取消映射与其文件关联的 struct address_space 的相应范围来清除 pte。* 此回调是可选的。* 返回值:* 成功返回 0,失败返回负错误码。*/int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);int (*vmap)(struct dma_buf *dmabuf, struct iosys_map *map);void (*vunmap)(struct dma_buf *dmabuf, struct iosys_map *map);
};
- 定义了对 `struct dma_buf` 可执行的操作。
- 包含以下成员:
- `cache_sgt_mapping`:是否缓存 scatterlist 映射。
- `attach` 和 `detach`:管理缓冲区附件的回调函数。
- `pin` 和 `unpin`:固定和释放缓冲区的回调函数。
- `map_dma_buf` 和 `unmap_dma_buf`:映射和取消映射 DMA 缓冲区的回调函数。
- `release`:释放 DMA 缓冲区的回调函数。
- `begin_cpu_access` 和 `end_cpu_access`:开始和结束 CPU 访问的回调函数。
- `mmap`、`vmap` 和 `vunmap`:内存映射和虚拟映射的回调函数。
2. **`struct dma_buf`**
/*** struct dma_buf - 共享缓冲区对象* 此结构表示通过调用 dma_buf_export() 创建的共享缓冲区。用户空间表示是一个普通的文件描述符,可以通过调用 dma_buf_fd() 创建。* 共享的 dma 缓冲区通过 dma_buf_put() 和 get_dma_buf() 进行引用计数。* 设备 DMA 访问由单独的 &struct dma_buf_attachment 处理。*/
struct dma_buf {/*** 缓冲区的大小;在缓冲区生命周期内不变。*/size_t size;/*** 用于跨进程共享缓冲区的文件指针,并用于引用计数。参见 dma_buf_get() 和 dma_buf_put()。*/struct file *file;/*** 表示所有已附加设备的 dma_buf_attachment 列表,受 &dma_resv 锁 @resv 保护。*/struct list_head attachments;/** 与此缓冲区对象关联的 dma_buf_ops。*/const struct dma_buf_ops *ops;/*** 用于引用计数由 dma_buf_vmap() 返回的 vmaps。受 @lock 保护。*/unsigned vmapping_counter;/*** 如果 @vmapping_counter > 0,则为当前的 vmap 指针。受 @lock 保护。*/struct iosys_map vmap_ptr;/*** 导出者的名称;对调试有用。不能为空。*/const char *exp_name;/*** 用户空间提供的名称。默认值为 NULL。如果非空,则长度不能超过 DMA_BUF_NAME_LEN,包括 NIL 字符。对会计和调试有用。读/写访问受 @name_lock 保护。* 参见 IOCTLs DMA_BUF_SET_NAME 或 DMA_BUF_SET_NAME_A/B。*/const char *name;/** 自旋锁,用于保护 name 字段的访问 */spinlock_t name_lock;/*** 指向导出模块的指针;用于内核模块的引用计数。*/struct module *owner;#if IS_ENABLED(CONFIG_DEBUG_FS)/** 用于 dma_buf 的会计和调试的节点 */struct list_head list_node;
#endif/** 供导出者为此缓冲区对象存储特定的私有数据 */void *priv;/*** 链接到此 dma-buf 的预留对象。* 隐式同步规则:* 支持隐式缓冲区访问同步的驱动程序(例如在 `Implicit Fence Poll Support`_ 中暴露的)必须遵循以下规则:* - 驱动程序必须通过 dma_resv_add_fence() 添加读围栏,并使用 DMA_RESV_USAGE_READ 标志,对于用户空间 API 认为是读访问的任何内容。这高度依赖于 API 和窗口系统。* - 同样,驱动程序必须通过 dma_resv_add_fence() 添加写围栏,并使用 DMA_RESV_USAGE_WRITE 标志,对于用户空间 API 认为是写访问的任何内容。* - 驱动程序也可以总是添加写围栏,因为这只会导致不必要的同步,但不会引起正确性问题。* - 某些驱动程序仅暴露同步的用户空间 API,没有跨驱动程序的流水线。这些驱动程序不会为其访问设置任何围栏。例如 v4l。* - 驱动程序应在检索围栏作为隐式同步的依赖项时使用 dma_resv_usage_rw()。* 动态导入者规则:* 动态导入者(参见 dma_buf_attachment_is_dynamic())在设置围栏时有额外的约束:* - 动态导入者必须遵守写围栏,并在允许通过设备访问缓冲区的底层存储之前等待它们完成。* - 动态导入者应为任何无法立即从其 &dma_buf_attach_ops.move_notify 回调中禁用的访问设置围栏。* 重要:* 所有驱动程序和与内存管理相关的函数必须遵守 struct dma_resv 规则,特别是更新和遵守围栏的规则。参见 enum dma_resv_usage 获取进一步描述。*/struct dma_resv *resv;/** @poll: for userspace poll support */wait_queue_head_t poll;/** @cb_in: for userspace poll support *//** @cb_out: for userspace poll support */struct dma_buf_poll_cb_t {struct dma_fence_cb cb;wait_queue_head_t *poll;__poll_t active;} cb_in, cb_out;
#ifdef CONFIG_DMABUF_SYSFS_STATS/*** @sysfs_entry:** For exposing information about this buffer in sysfs. See also* `DMA-BUF statistics`_ for the uapi this enables.*/struct dma_buf_sysfs_entry {struct kobject kobj;struct dma_buf *dmabuf;} *sysfs_entry;
#endif
};
- 表示一个共享缓冲区对象。
- 包含以下成员:
- `size`:缓冲区的大小,生命周期内不变。
- `file`:用于跨进程共享和引用计数的文件指针。
- `attachments`:所有附加设备的列表。
- `ops`:与该缓冲区对象关联的 `dma_buf_ops`。
- `vmapping_counter` 和 `vmap_ptr`:用于内部 vmap 引用计数和当前 vmap 指针。
- `exp_name` 和 `name`:导出者名称和用户空间提供的名称。
- `owner`:导出者模块指针。
- `resv`:与此 DMA 缓冲区链接的保留对象。
- `poll` 和 `cb_in`、`cb_out`:用于用户空间轮询支持。
- `sysfs_entry`:用于在 sysfs 中暴露此缓冲区的信息。
3. **`struct dma_buf_attach_ops`**
- 定义了导入者为附件实现的操作。
- 包含以下成员:
- `allow_peer2peer`:导入者是否可以处理没有页面的对等资源。
- `move_notify`:通知 DMA 缓冲区正在移动的回调函数。
4. **`struct dma_buf_attachment`**
- 保存设备-缓冲区附件的数据。此结构保存 dma_buf 缓冲区与其用户设备之间的连接信息。列表中包含一个每设备附加到缓冲区的 attachment 结构。连接通过调用 dma_buf_attach() 创建,并通过调用 dma_buf_detach() 再次释放。DMA 映射本身(用于发起传输)通过调用 dma_buf_map_attachment() 创建,并通过调用 dma_buf_unmap_attachment() 再次释放。
- 包含以下成员:
- `dmabuf`:此附件的缓冲区。
- `dev`:附加到缓冲区的设备。
- `node`:DMA 缓冲区附件的列表。
- `sgt` 和 `dir`:缓存的映射和方向。
- `peer2peer`:导入者是否可以处理没有页面的对等资源。
- `importer_ops` 和 `importer_priv`:导入者的操作和私有数据。
- `priv`:导出者的私有附件数据。
5. **`struct dma_buf_export_info`**
- 保存导出 DMA 缓冲区所需的信息。此结构持有导出缓冲区所需的信息。仅与 dma_buf_export() 一起使用。
- 包含以下成员:
- `exp_name`:导出者名称。
- `owner`:导出者模块指针。
- `ops`:与新缓冲区关联的 `dma_buf_ops`。
- `size`:缓冲区的大小。
- `flags`:文件模式标志。
- `resv`:保留对象。
- `priv`:导出者的私有数据。
6. **宏定义**
- `DEFINE_DMA_BUF_EXPORT_INFO`:定义并初始化 `dma_buf_export_info` 结构体。
7. **内联函数**
- `get_dma_buf`:增加 DMA 缓冲区的引用计数。
- `dma_buf_is_dynamic` 和 `dma_buf_attachment_is_dynamic`:检查 DMA 缓冲区和附件是否使用动态映射。
二、 主要函数
- `dma_buf_attach` 和 `dma_buf_detach`:附加和分离 DMA 缓冲区。
- `dma_buf_pin` 和 `dma_buf_unpin`:固定和释放 DMA 缓冲区附件。
- `dma_buf_export`:导出 DMA 缓冲区。
- `dma_buf_fd` 和 `dma_buf_get`:获取 DMA 缓冲区的文件描述符和从文件描述符获取 DMA 缓冲区。
- `dma_buf_map_attachment` 和 `dma_buf_unmap_attachment`:映射和取消映射 DMA 缓冲区附件。
- `dma_buf_move_notify`:通知 DMA 缓冲区正在移动。
- `dma_buf_begin_cpu_access` 和 `dma_buf_end_cpu_access`:开始和结束 CPU 访问。
- `dma_buf_mmap`、`dma_buf_vmap` 和 `dma_buf_vunmap`:内存映射和虚拟映射函数。
要实现一个 dma-buf exporter驱动,需要关注3个重点:
- dma_buf_ops
- DEFINE_DMA_BUF_EXPORT_INFO
- dma_buf_export()
注意: 其中 dma_buf_ops 的回调接口中,如下接口又是必须要实现的,缺少任何一个都将导致 dma_buf_export() 函数调用失败!
- map_dma_buf
- unmap_dma_buf
- mmap
- release
- map(4.19后废除)
- unmap(4.19后废除)
- map_atomic(4.12后废除)
- unmap_atomic(4.12后废除)
相关文章:
dma_buf学习记录之二核心接口
dma_buf学习记录之一基础知识-CSDN博客 本章学习linux\include\linux\dma-buf.h dma-buf.h 是 Linux 内核中用于实现 DMA 缓冲区共享框架的核心头文件。它定义了 dma-buf 子系统的主要数据结构和操作接口,允许设备驱动程序之间共享缓冲区,并支持异步硬件…...
java Optional
我还没用过java8的一些语法,有点老古董了,记录下Optional怎么用。 从源码看,Optional内部持有一个对象, 有一些api对这个对象进行判空处理。 静态方法of ,生成Optional对象, 但这个value不能为空&#…...
一文说清Token这个大模型中的数字乐高积木的作用
第一章:语言解码的底层逻辑 1.1 人类大脑的"偷懒智慧" 想象你走在街头,突然看到"星巴克"的招牌。你的大脑不会逐个分析"星""巴""克"三个字的笔画,而是瞬间将其识别为一个整体。这种将高…...
界面打印和重定向同时实现
在 Shell 中,若要让程序运行时既在界面打印输出内容,又将其重定向到文件,可使用tee命令达成此目的。tee命令的作用是从标准输入读取数据,然后将这些数据同时输出到标准输出(也就是屏幕)和指定的文件中。 基…...
最佳实践-HENGSHI SENSE 可视化创作中如何引入数据集市的成果
HENGSHI SENSE 提供了 中心化的数据集市管理 ,即数据集市的功能: 数据集市,支持层级结构的数据集市建立,按用户,用户组,组织架构授权,将数据分配到合适的人。支持统一的计算字段,计算…...
YOLO旋转检测模型简化
YOLO模型作为单阶段目标检测方法的代表,其已经应用在多个领域。 但要想将其部署到单片机上,其模型的大小需要受到极大的限制,而采用剪枝的方式模型体积下降效果有限,因此我们直接修改网络结构,将其进行删减,…...
JavaScript之Webpack的模块加载机制
目录 目标 概述 IIFE语法分析 无参数的IIFE 有参数的IIFE Webpack语法分析 基本结构 缓存加载过的模块 ES5的格式 ES6的格式 目标 本文站在js逆向的角度总结知识,所以不讲解Webpack打包技术,只分析模块加载机制。 概述 Webpack Webpack是一个…...
深度解析如何将图像帧和音频片段特征高效存储到向量数据库 Milvus
在视频和音频分析领域,如何高效地处理和检索海量的多模态数据一直是一个重大挑战。本文将深度解析一种行之有效的解决方案:利用 OpenCV 和音频处理库提取数据特征后,将这些特征向量存储到 Milvus 向量数据库,以实现高效的相似性检…...
《Vue3学习手记6》
组件通信 props props 可以父传子,也可以子传父 1.父传子 子组件: <template><div class"child"><h2>子组件</h2><h3>礼物:{{ gift }}</h3><h3 v-show"zichan">父亲给我的…...
抗体品牌推荐
默克超级英雄抗体的披荆斩棘之路 自保罗埃尔利希1891年10月提出“Antikrper”一词后,科研人逐渐意识到抗体(Antibody)可以应用于各种类型的研究中。 从结构、功能、人体免疫应答……到基因治疗、药物研究,抗体的身影无处不在。值…...
生成式人工智能认证(GAI认证)有什么用?
在人工智能的浪潮中,我们正站在一个前所未有的十字路口。有人将生成式人工智能(Generative AI)视为技术迭代的工具,有人将其视为颠覆行业的“黑匣子”,而更少有人意识到:它正在重新定义人类与技术的共生关系。当AI不再局限于辅助人类,而是开始参与创作、决策甚至伦理判断…...
全新升级:BRAV-7601-T003高性能无风扇AI边缘计算系统,助力智能未来!
在数字化与智能化飞速发展的今天,AI边缘计算正成为各行各业的核心驱动力。BRAV-7601作为一款高性能无风扇AI边缘计算系统,凭借其强大的硬件配置与丰富的扩展能力,为车路协同、特种车辆车载、机器视觉、医疗影像等领域提供了卓越的解决方案。最…...
基于c++的LCA倍增法实现
原理就不写了,自己找b站视频学习 #include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; const int MAXN 100005; // 最大节点数 const int MAXLOG 20; // 最大对数深度 vector<…...
探索大语言模型(LLM):语言模型从海量文本中无师自通
文章目录 引言:当语言模型学会“自己教自己”一、自监督学习:从“无标签”中挖掘“有监督”信号二、语言模型的自监督训练范式:两大经典路径1. 掩码语言模型(Masked Language Modeling, MLM)——以BERT为例2. 自回归语…...
大语言模型 - 运行、微调的显存计算详解与优化 全量微调、LoRA 优化策略
写在前面 随着Transformer架构的大语言模型(LLM)不断发展,其参数规模也在迅速增加。无论是进行模型推理还是微调训练,GPU显存消耗都是开发和应用LLM时的重要考量。本文将详细探讨大模型运行(推理)与微调时…...
【音视频】视频解码实战
FFmpeg流程 从本地读取YUV数据编码为h264格式的数据,然后再存⼊到本地,编码后的数据有带startcode与FFmpeg 示例⾳频编码的流程基本⼀致。 函数说明 avcodec_find_encoder_by_name:根据指定的编码器名称查找注册的编码器。avcodec_alloc_co…...
计算机网络学习笔记 4-6章
第 4 章 网络层 【考纲内容】 (一)网络层的功能 异构网络互连;路由与转发;SDN 基本概念;拥塞控制 (二)路由算法 静态路由与动态路由;距离 - 向量路由算法࿱…...
游戏哪些接口会暴露源IP?_深度解析服务器通信安全隐患
一、用户认证体系中的IP泄露陷阱 在游戏登录验证环节,采用明文传输的HTTP协议接口会将客户端IP直接暴露在TCP握手阶段。某头部MOBA游戏曾因使用HTTP Basic认证方式,导致黑客通过抓取三次握手数据包获取服务器真实IP。游戏行业权威测试显示,使…...
树莓派学习专题<11>:使用V4L2驱动获取摄像头数据--启动/停止数据流,数据捕获,缓存释放
树莓派学习专题<11>:使用V4L2驱动获取摄像头数据--启动/停止数据流,数据捕获,缓存释放 1. 启动和停止数据流2. 捕获数据3. 释放缓存 1. 启动和停止数据流 使用命令 VIDIOC_STREAMON 启动摄像头数据流,使用…...
adb push 报错:CreateProcess failure, error 123
客户使用adb push 可执行程序的时候报错如下所示 原因:文件目录里边带中文导致 解决方法:将文件目录里中文改成英文就好了...
【实战篇】数字化打印——打印格式设计器的功能说明
前言 myBuilder内置了覆盖丰富场景的打印格式设计器,效果统一,功能完善。 设计器一:小票 用于设计小票、水单等滚筒纸张的场景,例如:超市购物小票 主要功能 打印格式的保存、下载、上传设计时功能:撤销…...
【数据挖掘】时间序列预测-时间序列预测策略
时间序列预测策略 (1)单步预测与多步预测(2)直接多步预测(3)递归多步预测(4)直接递归的混合预测(5)多输入多输出预测 (1)单步预测与多…...
京东商品详情数据爬取难度分析与解决方案
在当今数字化商业时代,电商数据对于市场分析、竞品研究、价格监控等诸多领域有着不可估量的价值。京东,作为国内首屈一指的电商巨头,其商品详情页蕴含着海量且极具价值的数据,涵盖商品价格、库存、规格、用户评价等关键信息。然而…...
【Linux】线程
一.线程概念 我们在学习进程的时候已经知道了,进程内核数据结构pcb自己的代码和数据。那么单单一个task_struct是什么呢? 我们将单个的task_struct叫做轻量级进程,而这个轻量级进程也叫做线程。以往我们在了解进程的时候,一个进…...
WPF-遵循MVVM框架创建图表的显示【保姆级】
文章速览 1、技术栈实现步骤1、创建WPF工程项目2、引入框架 Caliburn.Micro、数据可视化库ScottPlot.WPF3、创建文件夹,并创建相应的View & ViewModel4、创建启动类5、将启动类设置为启动项6、编写View7、编写VM8、将VM和View中的图表进行绑定9、备注 示例效果 …...
深入详解人工智能数学基础—概率论-KL散度在变分自编码器(VAE)中的应用
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
《代码整洁之道》第9章 单元测试 - 笔记
测试驱动开发 (TDD) 是一种编写整洁代码的“规程”或“方法论”,而不仅仅是测试技术。 JaCoCo 在运行测试后生成详细的覆盖率报告的工具, maven 引用。 测试驱动开发 测试驱动开发(TDD)是什么? TDD 不是说写完代码…...
每日c/c++题 备战蓝桥杯(P2392 kkksc03考前临时抱佛脚)
【题解】期末考试抱佛脚最短时间(动态规划 | 二进制背包) 题目链接 题目背景 kkksc03 的大学生活非常颓废,临近期末考试才开始疯狂复习。他有 4 门科目需要复习,每一科都有若干道题目,每道题目需要一定的时间完成。…...
徽客松S1 | 合肥首场 AI 黑客松招募
越来越多的黑客松在各个城市出现!5 月 10 日,合肥,12 小时极速挑战。 我们和本次「徽客松」发起人 SDL 也是在一个黑客松上相识。当你的城市还没有黑客松可参加,与其等待,不如学习 SDL,自己发起一个&#…...
单片机-89C51部分:6、按键
飞书文档https://x509p6c8to.feishu.cn/wiki/EtkHw8MG0ipz3NkHlZEcwpEnn4g 一、应用场景: 轻触开关、按键、电容开关、光栅传感器、微动、关电开关 二、原理: 轻触按键可以理解为两根导线,按下时导线连接,松开时导线断开。我们可…...
小结: DHCP
交换机的物理接口分批地址池、全局分配地址池 分批地址池(接口地址池/局部分配) 按物理接口(如 VLAN 接口、SVI、物理端口)划分,每个接口单独配置一个小型地址池。适合规模较小、子网划分清晰的场景。配置方法示例&…...
matlab simulink中理想变压激磁电流容易有直流偏置的原因分析。
simulink把线性变压器模块拉出来,设置没有绕线电阻的变压器,激磁电感和Rm都有,然后给一个50%占空比的方波,幅值正负10V,线路中设置一个电阻,模拟导线阻抗。通过示波器观察激磁电流,发现电阻越小…...
国产三维CAD皇冠CAD在「通用设备制造业」建模教程:台式起重机
在制造业数字化转型的浪潮中,三维CAD软件已成为装备设计的核心工具,而国产软件的崛起正悄然改变行业格局。皇冠CAD(CrownCAD)作为中国自主研发的云端三维CAD平台,凭借全栈可控的底层架构、高效协同的设计流程及复杂场景…...
Day 12
文件操作 文件文件操作文件函数课堂笔记 文件 1)概述 FILE 所有平台的名字都一样,FILE 是一个结构体类型,里面的成员功能一样,不同平台成员的名字不一样。 FILE *fp 1、fp指针,只用调用了fopen().在堆区分配空间,把地址返回给fp 2、fp指针…...
Lua 第11部分 小插曲:出现频率最高的单词
在本章中,我们要开发一个读取并输出一段文本中出现频率最高的单词的程序。像之前的小插曲一样,本章的程序也十分简单但是也使用了诸如迭代器和匿名函数这样的高级特性。 该程序的主要数据结构是一个记录文本中出现的每一个单词及其出现次数之间关系的表。…...
自然语言处理之机器翻译:注意力机制在低资源翻译中的突破与哲思
## 被忽视的7000种语言 在人工智能翻译技术突飞猛进的今天,一个残酷的事实被刻意掩盖:全球7000种语言中,超过95%缺乏构建现代机器翻译系统所需的基础资源。当我们在庆贺Transformer模型将英德翻译BLEU值推高至40%时,那些承载着人类文明基因的少数民族语言,正在经历着前所未…...
SQL 处理重复数据之技巧(Techniques for Handling Duplicate Data with SQL)
SQL 处理重复数据之技巧 ❝ 在日常数据库操作中,我们经常会遇到重复数据的问题。重复数据不仅会占用存储空间,还可能导致数据分析结果不准确。本文将详细讲解 SQL 中处理重复数据的常用方法,帮助你更高效地管理数据库中的数据。 一、为什么会…...
Redis01-基础-入门
零、文章目录 Redis01-基础-入门 1、认识 NoSQL NoSQL 知识请参考:https://blog.csdn.net/liyou123456789/article/details/132612444 2、认识 Redis (1)简介 Redis(Remote Dictionary Server,远程字典服务&…...
辞九门回忆
2025年月日,13~30℃,挺好的 待办: 《高等数学2》期末试卷 高数重修电子版材料 冶金《物理》期末试卷 《物理[2]》期末试卷 批阅冶金《物理》作业→→统计平时成绩 遇见:遇见一位小姐姐。 感受或反思:不主动推动关系&a…...
全球城市范围30米分辨率土地覆盖数据(1985-2020)
Global urban area 30 meter resolution land cover data (1985-2020) 时间分辨率年空间分辨率10m - 100m共享方式保护期 277 天 5 时 42 分 9 秒数据大小:8.98 GB数据时间范围:1985-2020元数据更新时间2024-01-11 数据集摘要 1985~2020全球城市土地覆…...
java编程式、声明式事务简单介绍
大家吼鸭!今天学习新项目的时候,项目中运用了编程式项目,有点不理解什么叫编程式事务,于是我去查询了一些资料,大概了解了一下。现在做一个简单的介绍。 编程式事务和声明式事务的区别 现在想象一个场景,…...
Golang 遇见 Kubernetes:云原生开发的完美结合
Golang 和 Kubernetes 简介 Golang 概述 Golang,也称为 Go,是由 Google 开发的一种开源编程语言。Go 由 Robert Griesemer、Rob Pike 和 Ken Thompson 设计,于 2009 年首次发布,此后在各个领域都获得了广泛的关注,尤其…...
第三章,GRE和MGRE
VPN---虚拟专用网络 VPN的核心技术----隧道技术---封装 GRE---通用路由封装 配置 GRE的配置: R1: [r1]interface Tunnel 0/0/0 ---创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 ---给隧道接口分配一个IP地址 [r1-Tunnel0/0/0]t…...
redis常用集合操作命令
在 Redis 的命令行界面(redis-cli)中, Redis 的集合(Set)是无序的,且集合中的元素是唯一的。Redis 本身没有直接提供获取集合中某个特定属性的命令,因为集合中的元素是简单的值,而不…...
vue3中ref在js中为什么需要.value才能获取/修改值?
文章目录 [TOC](文章目录) 一、ref定义值什么情况下需要.value1. 情况1:在js中需要使用.value2. 情况2:在html模版中不需要使用.value3. 情况31.代码2.效果3. 二、重新了解一下vue2和vue3的响应式1.vue2(Object.defineProperty)2.vue3(proxy&…...
使用vue2 开发一个纯静态的校园二手交易平台-前端项目练习
这篇文章给大家分享一个适合练习学习前端技术的项目:校园二手交易平台系统。 因为最近在学习vue相关的技术,所以就根据学习的前端技术,来写一些纯前端的项目来练习,这篇文章主要是分享一下 我做的这个项目的一些功能,如…...
使用wavesurferJs实现录音音波效果
效果图展示 插件安装 npm i wavesurfer实现过程 <!-- author: weileiming date: 2025-04-26 14:04:08 description: 悬浮音波层 props:isRecord: 录制状态waveOptions: 音波基础配置overlayStyle: 基础蒙层配置 methods:togglePlay: 切换录制状态 --> <template>…...
Golang 类型方法
在 Go 语言中,方法绑定到任意类型的特性可以称为 “类型方法(Type Methods)” 或 “接收者方法(Receiver Methods)”,它体现了以下几种核心编程思想: 1. 官方术语:接收者方法&#x…...
多模态常见面试题
多模态常见面试 一、最近关注的论文,多模态视觉大模型(CLIP,DALLE)?二、blip2的架构,优势和之前多模态模型的区别?三、多模态融合后,怎样知道最终结果受哪种模态影响更大?四、多模态中常见的SOTA模型有哪些…...
LangChain构建大模型应用之RAG
RAG(Retrieval-augmented Generation 检索增强生成)是一种结合信息检索与生成模型的技术,通过动态整合外部知识库提升大模型输出的准确性和时效性。其核心思想是在生成答案前,先检索外部知识库中的相关信息作为上下文依据…...