Linux proc文件系统 内存影射
文章目录
- 常见的内存分配函数
- /proc/pid/ 目录解析
- 用户进程的内存空间分配算法
- mmap 分配大内存可能不在堆中
- 换为 malloc 现象相同
常见的内存分配函数
- malloc / calloc / realloc(来自 C 标准库)
void *malloc(size_t size):分配 size 字节的内存。
void *calloc(size_t nmemb, size_t size):分配并初始化为0的内存,大小为 nmemb * size。
void *realloc(void *ptr, size_t size):重新分配一块内存。
释放函数:
void free(void *ptr):释放由 malloc/calloc/realloc 分配的内存。
- mmap / munmap(Linux 系统调用级别)
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset):用于分配匿名内存或映射文件。
int munmap(void *addr, size_t length):释放 mmap 分配的内存。
常用于共享内存、匿名内存区域的分配,灵活性更高。// 使用 mmap 分配匿名内存
size_t size = 4096; // 分配 1 页(通常 4KB)大小的内存
void *addr = mmap(NULL, size, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);if (addr == MAP_FAILED) {perror("mmap failed");return 1;
}
/proc/pid/ 目录解析
-
/proc/<pid>/maps : 内存映射区域概览 【程序地址空间】
该文件列出进程的每个虚拟内存区域的信息,包括地址、权限、偏移、设备、inode 以及映射的文件(如有)。
<起始地址>-<结束地址> <权限> <偏移> <设备号> <inode> <路径>
如图,是从上到下为低地址向高地址的程序地址空间。
-
2./proc/<pid>/status —— 进程状态摘要(含内存使用情况)
提供当前进程的状态、资源使用、权限、线程数等,常用于查看内存大小的总体信息。
VmPeak: 132456 kB 使用过的最大虚拟内存
VmSize: 130000 kB 当前分配的虚拟内存
VmRSS: 20480 kB 常驻内存集(实际占用物理内存)
VmData: 90000 kB 数据段使用内存
VmStk: 136 kB 栈区大小
VmExe: 1024 kB 代码段大小
VmLib: 16384 kB 进程加载的 共享库(Shared Library) 占用的虚拟内存大小
- 3./proc/<pid>/smaps —— maps 的详细版(精细统计每段内存)
该文件扩展了 maps 的内容,为每个内存段提供详细内存使用信息,如共享、私有的内存、页的大小等。
7f0c5f000000-7f0c5f021000 rw-p 00000000 00:00 0
Size: 132 kB 区域大小
Rss: 20 kB 实际驻留物理内存
Pss: 10 kB 平均共享内存
Shared_Clean: 0 kB 被多个进程共享的页面
Shared_Dirty: 0 kB
Private_Clean: 0 kB 私有页面
Private_Dirty: 20 kB
Referenced: 20 kB 被访问过的内存
Anonymous: 20 kB 匿名映射(如 malloc 分配的内存)
...
用户进程的内存空间分配算法
- 连续分配算法
-
定义:为进程分配一个连续的内存区域,进程的所有数据和代码都存放在该连续空间中。
-
典型算法:
单一连续分配:整个内存仅分配给一个进程(早期单任务系统)。
固定分区分配:内存划分为若干固定大小的分区,每个分区装入一个进程。
动态分区分配:根据进程需求动态划分内存,如首次适应、最佳适应算法。【连续分配算法】- 首次适应算法(First Fit):从空闲分区链的起始位置开始扫描,找到第一个大小足够满足请求的空闲分区,将其分割后分配给进程。
- 最佳适应算法(Best Fit):遍历整个空闲分区链,找到大小最接近请求且不小于请求的空闲分区进行分配。(实际上碎片化问题更严重)
-
特点:实现简单,但内存碎片问题严重,空间利用率低。
-
- 离散分配算法
- 定义:将进程拆分为多个部分,分配到不连续的内存块中,通过地址映射机制(如页表、段表)实现逻辑地址到物理地址的转换。
- 典型算法:
分页存储管理:进程划分为固定大小的页(Page),内存划分为页框(Frame),页与页框一一对应。
分段存储管理:进程划分为逻辑上独立的段(Segment),如代码段、数据段,各段分配独立的内存区域。
段页式存储管理:结合分段和分页,先分段再分页。 - 特点:有效解决内存碎片问题,支持虚拟内存,是现代操作系统的主流方案。
现代操作系统(如 Linux、Windows)对用户进程的内存管理采用基于分页的虚拟内存机制,属于离散分配算法的范畴,但实现细节更为复杂。
mmap 分配大内存可能不在堆中
小内存分配(通常小于 128KB)
通过 堆(Heap) 分配,使用 brk 系统调用扩展进程的堆空间,内存区域在 /proc/pid/maps 中标记为 [heap]。
大内存分配(通常大于等于 128KB)
通过 匿名映射(Anonymous Mapping) 分配,使用 mmap 系统调用在虚拟地址空间中创建独立的内存区域,这类区域在 /proc/pid/maps 中标记为 rw-p 00000000 00:00 0(无文件关联的匿名映射),不属于传统堆或共享区。
编写程序,连续申请分配六个128MB空间(记为1~6号),然后释放第2、3、5号的128MB空间。然后再分配1024MB,再分配64M内存,观察 /proc/pid/maps, 【解释说明用户进程空间分配属于课本中的离散还是连续分配算法?首次适应还是最佳适应算法?用户空间存在碎片问题吗?】
代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>#define ALLOC_MB(x) ((x) * 1024 * 1024)void *alloc_region(size_t size) {void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);if (ptr == MAP_FAILED) {perror("mmap");exit(1);}return ptr;
}void print_hint(const char *msg) {printf("\n==== %s ====\n", msg);printf("pid = %d,请查看 /proc/%d/maps\n", getpid(), getpid());printf("按 Enter 继续...\n");getchar();
}int main() {void *blocks[6];// 分配六块 128MB 匿名内存for (int i = 0; i < 6; i++) {blocks[i] = alloc_region(ALLOC_MB(128));memset(blocks[i], 0, 1); // 确保内存实际分配}print_hint("已分配 6 块 128MB");// 释放第 2、3、5 块munmap(blocks[1], ALLOC_MB(128));munmap(blocks[2], ALLOC_MB(128));munmap(blocks[4], ALLOC_MB(128));print_hint("已释放第 2、3、5 块");// 分配 1024MBvoid *big = alloc_region(ALLOC_MB(1024));memset(big, 0, 1);print_hint("已分配 1024MB");// 再分配 64MBvoid *extra = alloc_region(ALLOC_MB(64));memset(extra, 0, 1);print_hint("已分配额外的 64MB");sleep(60);return 0;
}
-
分配 6 个 128MB 内存块:
[heap]下一行的 7fc8c95d8000-7fc8f95d8000 即为分配的6个128MB内存块
0x7fc8f95d8000 - 0x7fc8c95d8000 = 0x30000000 = 768MB
mmap 分配的大块内存,不在 [heap] 上! -
释放第 2、3、5 号内存块:
[heap]下这三段:
7fc8c95d8000-7fc8d15d8000 rw-p …
7fc8d95d8000-7fc8e15d8000 rw-p …
7fc8f15d8000-7fc8f95d8000 rw-p …
刚好是 128*3 = 384 MB. 地址连续但 有缺口,说明确实释放了中间段 -
分配一个 1024MB 内存块:
7fc8c95d8000-7fc8d15d8000 变为 7fc8895d8000-7fc8d15d8000 这是分配了1024MB内存
0x7fc8d15d8000 - 0x7fc8895d8000 = 0x48000000 = 1207959552 bytes = 1152 MB -
额外分配一个 64MB 内存块:
7fc8f15d80000-7fc8f95d80000 变为了7fc8ed5d8000-7fc8f95d8000
= 0x7fc8f95d8000 - 0x7fc8ed5d8000
= 0x080000000 (十六进制)
= 128MB + 64MB = 192MB malloc 的 64MB 被放入了这块扩展后的区域中。
换为 malloc 现象相同
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>#define ALLOC_MB(x) ((x) * 1024 * 1024)void *alloc_region(size_t size) {void *ptr = malloc(size);if (ptr == NULL) {perror("malloc");exit(1);}return ptr;
}void free_region(void *ptr, size_t size) {free(ptr);
}void print_hint(const char *msg) {printf("\n==== %s ====\n", msg);printf("pid = %d,请查看 /proc/%d/maps\n", getpid(), getpid());printf("按 Enter 继续...\n");getchar();
}int main() {void *blocks[6];getchar();// 分配六块 128MB 内存for (int i = 0; i < 6; i++) {blocks[i] = alloc_region(ALLOC_MB(128));memset(blocks[i], 0, 1); // 确保内存实际分配}print_hint("已分配 6 块 128MB");// 释放第 2、3、5 块free_region(blocks[1], ALLOC_MB(128));free_region(blocks[2], ALLOC_MB(128));free_region(blocks[4], ALLOC_MB(128));print_hint("已释放第 2、3、5 块");// 分配 1024MBvoid *big = alloc_region(ALLOC_MB(1024));memset(big, 0, 1);print_hint("已分配 1024MB");// 再分配 64MBvoid *extra = alloc_region(ALLOC_MB(64));memset(extra, 0, 1);print_hint("已分配额外的 64MB");sleep(60);return 0;
}
起始:
5635d3a68000-5635d3a69000 r--p 00000000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a69000-5635d3a6a000 r-xp 00001000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6a000-5635d3a6b000 r--p 00002000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6b000-5635d3a6c000 r--p 00002000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6c000-5635d3a6d000 rw-p 00003000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3fcf000-5635d3ff0000 rw-p 00000000 00:00 0 [heap]
7fa337f61000-7fa337f83000 r--p 00000000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa337f83000-7fa3380fb000 r-xp 00022000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa3380fb000-7fa338149000 r--p 0019a000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa338149000-7fa33814d000 r--p 001e7000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa33814d000-7fa33814f000 rw-p 001eb000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa33814f000-7fa338155000 rw-p 00000000 00:00 0
7fa338168000-7fa338169000 r--p 00000000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338169000-7fa33818c000 r-xp 00001000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa33818c000-7fa338194000 r--p 00024000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338195000-7fa338196000 r--p 0002c000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338196000-7fa338197000 rw-p 0002d000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338197000-7fa338198000 rw-p 00000000 00:00 0
7ffe3d307000-7ffe3d328000 rw-p 00000000 00:00 0 [stack]
7ffe3d3f1000-7ffe3d3f5000 r--p 00000000 00:00 0 [vvar]
7ffe3d3f5000-7ffe3d3f7000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
分配 6 块 128MB: 发现也不在堆中
5635d3a68000-5635d3a69000 r--p 00000000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a69000-5635d3a6a000 r-xp 00001000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6a000-5635d3a6b000 r--p 00002000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6b000-5635d3a6c000 r--p 00002000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6c000-5635d3a6d000 rw-p 00003000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3fcf000-5635d3ff0000 rw-p 00000000 00:00 0 [heap]
7fa307f5b000-7fa337f61000 rw-p 00000000 00:00 0
7fa337f61000-7fa337f83000 r--p 00000000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa337f83000-7fa3380fb000 r-xp 00022000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa3380fb000-7fa338149000 r--p 0019a000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa338149000-7fa33814d000 r--p 001e7000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa33814d000-7fa33814f000 rw-p 001eb000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa33814f000-7fa338155000 rw-p 00000000 00:00 0
7fa338168000-7fa338169000 r--p 00000000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338169000-7fa33818c000 r-xp 00001000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa33818c000-7fa338194000 r--p 00024000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338195000-7fa338196000 r--p 0002c000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338196000-7fa338197000 rw-p 0002d000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338197000-7fa338198000 rw-p 00000000 00:00 0
7ffe3d307000-7ffe3d328000 rw-p 00000000 00:00 0 [stack]
7ffe3d3f1000-7ffe3d3f5000 r--p 00000000 00:00 0 [vvar]
7ffe3d3f5000-7ffe3d3f7000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
释放第 2、3、5 块后现象相同:
5635d3a68000-5635d3a69000 r--p 00000000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a69000-5635d3a6a000 r-xp 00001000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6a000-5635d3a6b000 r--p 00002000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6b000-5635d3a6c000 r--p 00002000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3a6c000-5635d3a6d000 rw-p 00003000 08:05 655630 /home/wyx/work/SZU_OS/ex3/memtest2.out
5635d3fcf000-5635d3ff0000 rw-p 00000000 00:00 0 [heap]
7fa307f5b000-7fa30ff5c000 rw-p 00000000 00:00 0
7fa317f5d000-7fa31ff5e000 rw-p 00000000 00:00 0
7fa32ff60000-7fa337f61000 rw-p 00000000 00:00 0
7fa337f61000-7fa337f83000 r--p 00000000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa337f83000-7fa3380fb000 r-xp 00022000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa3380fb000-7fa338149000 r--p 0019a000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa338149000-7fa33814d000 r--p 001e7000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa33814d000-7fa33814f000 rw-p 001eb000 08:05 1050757 /usr/lib/x86_64-linux-gnu/libc-2.31.so
7fa33814f000-7fa338155000 rw-p 00000000 00:00 0
7fa338168000-7fa338169000 r--p 00000000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338169000-7fa33818c000 r-xp 00001000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa33818c000-7fa338194000 r--p 00024000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338195000-7fa338196000 r--p 0002c000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338196000-7fa338197000 rw-p 0002d000 08:05 1050743 /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fa338197000-7fa338198000 rw-p 00000000 00:00 0
7ffe3d307000-7ffe3d328000 rw-p 00000000 00:00 0 [stack]
7ffe3d3f1000-7ffe3d3f5000 r--p 00000000 00:00 0 [vvar]
7ffe3d3f5000-7ffe3d3f7000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]
相关文章:
Linux proc文件系统 内存影射
文章目录 常见的内存分配函数/proc/pid/ 目录解析 用户进程的内存空间分配算法mmap 分配大内存可能不在堆中换为 malloc 现象相同 常见的内存分配函数 malloc / calloc / realloc(来自 C 标准库) void *malloc(size_t size):分配 size 字节…...
服务器时间发生跳变导致hghac中对应主机状态频繁切换为crash或stop
文章目录 环境症状问题原因解决方案相关文档报错编码 环境 系统平台:N/A 版本:N/A 症状 集群状态: [rootbthbj-hgywsjkjq-ip28-cen76 ~]# hghactl list Cluster: highgo-ee-cluster —---------------------—---------- | Member | Ho…...
“智”造升级:金众诚如何赋能重型机械企业高效项目管理?
据悉,由中国重型机械工业协会主办的2025中国(郑州)重型机械装备展览会(以下简称:重型机械装备展),将于2025年10月15-17日在河南省郑州市中原国际会展中心隆重举办。 作为中国重型机械行业唯一的…...
反向操作:如何用AI检测工具优化自己的论文“人味”?
大家好,这里是论文写手的一线自救指南😤 在AIGC横行的今天,谁还没偷偷用过AI写几段论文内容?但问题来了:学校越来越会“识AI”了! 有的学校甚至不看重复率,只盯AIGC率报告,一句“AI…...
前端面试宝典---js垃圾回收机制
什么是垃圾回收 垃圾回收是指一种自动内存管理机制,当声明一个变量时,会在内存中开辟一块内存空间用于存放这个变量。当这个变量被使用过后,可能再也不需要它了,此时垃圾回收器会自动检测并回收这些不再使用的内存空间。垃圾回收…...
【docker】--容器管理
文章目录 容器重启--restart 参数选项及作用**对比 always 和 unless-stopped****如何查看容器的重启策略?** 容器重启 –restart 参数选项及作用 重启策略 no:不重启(默认)。on-failure:失败时重启(可限…...
如何下载和安装 Ghost Spectre Windows 11 24H2 PRO
如何下载和安装 Ghost Spectre Windows 11 24H2 PRO 我们都希望拥有一台运行速度飞快的电脑系统,但对于那些使用普通硬件的用户来说,这并不总是可能的。所以,如果你觉得你的 Windows 11 电脑运行缓慢,你并不孤单。许多用户,包括 Reddit 和 YouTube 上的技术爱好者,都在放…...
软考软件设计师中级——软件工程笔记
1.软件过程 1.1能力成熟度模型(CMM) 软件能力成熟度模型(CMM)将软件过程改进分为以下五个成熟度级别,每个级别都定义了特定的过程特征和目标: 初始级 (Initial): 软件开发过程杂乱无章…...
有关多线程
一、多线程到底是什么?简单说一说 你可以把程序想象成一台工厂。单线程就是工厂里只有一个员工,他做事情、搬产品、打包都靠一个人,他忙起来速度会慢一些。而多线程就像有多个员工同时工作,他们各自干自己的事情,整体…...
静电的起因与静电效应:技术分析与应用
杭州干扰净电子科技有限公司出品: 静电(Electrostatics)是由于电荷积累或转移引起的现象,广泛存在于日常生活和工业环境中。静电的起因主要包括接触起电、摩擦起电和感应起电,而其效应可能引发静电放电(ES…...
Python知识框架
一、Python基础语法 变量与数据类型 变量命名规则 基本类型:int, float, str, bool, None 复合类型:list, tuple, dict, set 类型转换与检查(type(), isinstance()) 运算符 算术运算符:, -, *, /, //, %, ** 比较…...
npm install 报错
1、protobufjs7.4.0 postinstall: node scripts/postinstall verbose stack Error: protobufjs7.4.0 postinstall: node scripts/postinstall 确认是否有postinstall# node scripts/postinstallCannot find module /home/rio/scripts/postinstall解决办法: # 添加…...
ESP32WIFI工具加透传
工欲善其事,必先利器其器 项目首页 - ESP-12F烧录使用软件与说明书:ESP-12F 烧录使用软件与说明书本仓库提供了ESP-12F模块的烧录使用软件及相关说明书,帮助用户快速上手并使用ESP-12F模块进行开发 - GitCode ATCWMODE 是 ESP32 系列芯片中用于设置 Wi…...
44、私有程序集与共享程序集有什么区别?
私有程序集(Private Assembly)与共享程序集(Shared Assembly)是.NET框架中程序集部署的两种不同方式,它们在部署位置、版本控制、访问权限等方面存在显著差异,以下是对二者的详细比较: 1. 部署…...
Hadoop集群故障节点隔离操作指南
一、确认故障节点状态 1.查看集群节点状态 hdfs dfsadmin -report # 显示所有DataNode状态(存活/宕机/存储利用率) 输出中标记为 Dead 或 Decommissioning 的节点为异常节点。 2.分析监控指标 通过Prometheus/Grafana监控平台检查节点资源(CPU、内存、磁盘I…...
流速仪数据处理及流量断面线绘制
1 需求描述 在实际航道测量项目中,有测量断面线流量流速的需求,得使用流速仪在现场进行测量,相关操作在之前已经写了记录。本次手册记录后期数据处理与流量线绘制,以该区域为例。 流速仪设备操作说明 2 规范要求 3 流量断面表格…...
android实现USB通讯
在 Android 上枚举 USB 设备除了使用 UsbManager.getDeviceList() 方法外,还有以下几种常见的方式: 1. 使用 USB 设备过滤器(XML 配置) 通过在 AndroidManifest.xml 中配置 USB 设备过滤器,可以让系统自动检测并通知…...
公链开发及其配套设施:钱包与区块链浏览器
公链开发及其配套设施:钱包与区块链浏览器的技术架构与生态实践 ——2025年区块链基础设施建设的核心逻辑与创新突破 一、公链开发:构建去中心化世界的基石 1. 技术架构设计的三重挑战 公链作为开放的区块链网络,需在性能、安全性与去中心…...
SVM在医疗设备故障维修服务决策中的应用:策略、技术与实践
SVM在医疗设备故障维修服务决策中的应用:策略、技术与实践 医疗设备的高可靠性、安全性及严格合规性要求,使其故障维修决策具有显著的特殊性。支持向量机(SVM)凭借小样本学习、非线性建模及高精度分类能力,可有效解决…...
如何高效集成MySQL数据到金蝶云星空
MySQL数据集成到金蝶云星空:SC采购入库-深圳天一-OK案例分享 在企业信息化建设中,数据的高效流转和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——“SC采购入库-深圳天一-OK”,详细探讨如何通过轻易云数据…...
NACOS基于长链接的⼀致性模型
1. 配置⼀致性模型 sdk-server ⼀致性 server 间⼀致性 Server 间同步消息接收处理轻量级实现,重试失败时,监控告警。断网:断网太久,重试任务队列爆满时,无剔除策略。 2. 服务⼀致性模型...
Docker 常见问题及其解决方案
一、安装与启动问题 1.1 安装失败 在不同操作系统上安装 Docker 时,可能会出现安装失败的情况。例如,在 Ubuntu 系统中,执行安装命令后提示依赖缺失。这通常是因为软件源配置不正确或系统缺少必要的依赖包。 解决方案: 确保系统…...
Nginx 动静分离在 ZKmall 开源商城静态资源管理中的深度优化
在 B2C 电商高并发场景下,静态资源(图片、CSS、JavaScript 等)的高效管理直接影响页面加载速度与用户体验。ZKmall开源商城通过对 Nginx 动静分离技术的深度优化,将静态资源响应速度提升 65%,带宽成本降低 40%…...
Lighthouse 自定义审计
以下是关于 Lighthouse 自定义审计的基本知识点总结: 一、Lighthouse 自定义审计核心概念 1. 审计机制架构 #mermaid-svg-lzu9WEel4gUome5N {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lzu9WEel4gUome5N .erro…...
龙虎榜——20250514
上证日线收阳线,大盘股相对强势,整体跌多涨少,量能较昨日放大,大金融发力,但总体处于日线上涨末端,注意风险。 深证日线冲高回落,触及前期压力位,量能未放大,总体处于日…...
基于javaweb的SpringBoot自习室预约系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
二分查找的边界问题
前言 二分查找(Binary Search)是一种高效的查找算法,时间复杂度为O(log n)。它适用于已排序的数组或列表。本文将详细介绍二分查找的两种常见写法:闭区间写法和左闭右开区间写法。 一、二分查找基本思想 二分查找的核心思想是"分而治之"&am…...
应用示例1:交通灯
基于FPGA的交通灯控制系统实现原理详解 目录 基于FPGA的交通灯控制系统实现原理详解一、项目简介二、数字电路与基础知识1. 交通灯系统的有限状态机(FSM)2. 数码管显示原理3. 二进制转BCD显示4. 时钟与分频三、功能需求与系统结构功能需求系统结构四、各模块设计原理说明1. 时…...
Docker 介绍与使用
Docker 文章目录 Docker介绍与虚拟机的比较启动速度占用资源 优势更容易迁移更容易维护更容易扩展 使用场景持续集成提供可伸缩的云服务搭建微服务架构 镜像与容器镜像构成(分层结构)镜像与容器的区别 安装 Docker常用命令介绍镜像相关容器相关 实战&…...
[数据结构]6. 队列-Queue
队列-Queue 1. 介绍2. 队列实现2.1 基于链表的实现2.2 基于数组的实现 3. 队列操作CreateInitializeDestoryPushPopFrontBackSizeEmpty 1. 介绍 队列(queue) 是一种遵循先入先出规则的线性数据结构。将队列头部称为“队首”,尾部称为“队尾”…...
mybatis plus (sqlserver) 根据条件来获取id最大的,或者是新增的最新的一条记录(同条件可能会有多条出现)
1、mysql的版本 limit 1 QueryWrapper<Userinfo> queryWrapper new QueryWrapper<>();queryWrapper.eq("fid", payment.getFid());return userinfoMapper.selectOne(queryWrapper.orderByDesc("id").last("limit 1")); 只要类似以…...
打卡DAY25
DAY 25 异常处理 知识点回顾: 1. 异常处理机制 2. debug过程中的各类报错 3. try-except机制 4. try-except-else-finally机制 在即将进入深度学习专题学习前,我们最后差缺补漏,把一些常见且重要的知识点给他们补上,加深…...
【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析
目录 一.sizeof和strlen 1.1--sizeof 1.2--strlen 1.3--sizeof和strlen的对比 二.数组和指针笔试题解析 2.1--一维数组 2.2--字符数组 2.2.1--代码1: 2.2.2--代码2: 2.2.3--代码3: 2.2.4--代码4 : 2.2.5--代码5&#…...
Java 异常处理之 BufferUnderflowException(BufferUnderflowException 概述、常见发生场景、避免策略)
一、BufferUnderflowException 概述 BufferUnderflowException 是 Java NIO 包中的一个运行时异常,是 RuntimeException 的子类 public class BufferUnderflowException extends RuntimeException {... }# 继承关系java.lang.Object-> java.lang.Throwable->…...
OpenCV人脸识别LBPH算法原理、案例解析
文章目录 前言一、LBPH 算法原理概述1、LBP 特征计算2、均匀模式与旋转不变性3、直方图统计与识别 二、环境准备1、安装依赖2、数据集结构 三、代码实现(完整代码约 150 行)1、导入库与配置2、加载数据与标签生成3、 模型训练与保存4、 实时人脸识别5、主…...
Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器
一、软件介绍 文末提供程序和源码下载 Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器; Javascript execution Javascript 执行Support of Web APIs (partial, WIP)支持 Web API(部分、WIP)Compatible with Pla…...
Docker 疑难杂症解决指南:从入门到进阶的全面剖析
Docker 作为容器化技术的代表,凭借其轻量级、可移植性和高效资源利用率,已成为开发、测试和部署应用的标准工具。然而,在实际使用中,用户常常会遇到镜像构建失败、容器启动异常、网络配置问题等疑难杂症。本文将从镜像构建、容器生…...
CodeBuddy Craft,我的编程搭子
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 你好,我是悟空。 背景 最近项目组事情挺多,一个人要干多个人的活,而且写…...
如何实现一个运动会计分系统?(C语言版)
一、需求分析 设计一个运动会计分系统,计分信息包括参加学校,参与项目,性别,名次个数,各个学校获得名次信息。该系统具有以下功能 数据录入: 链表或结构体数组组织数据数据报表: 依照规定的报表格式对数据打印报表数据排序: 按照要求对数据进行统计,含简单统计及综合统计…...
linux内核主要由哪五个模块构成?
Linux内核是一个高度模块化的系统,其核心功能通常被划分为以下五大模块,共同协作实现操作系统的基础功能: 1. 进程管理(Process Management) 核心功能:负责进程的创建、调度、终止,以…...
编程日志5.5
树的结构代码 #include<iostream> using namespace std; //由于树的每个结点可能有一些孩子结点,这些孩子结点的数量不确定,所以可以用一个链表来把所有的孩子结点给串起来 //链表结点定义 //这段代码定义了一个结构体ListNode,用于表示链表中的一个结点。这个结构…...
React学习———React.memo、useMemo和useCallback
React.memo React.memo是React提供的一个高阶组件,用于优化函数组件的性能,它通过记忆组件的渲染结果,避免在父组件重新渲染时,子组件不必要的重新渲染 React.memo会对组件的props进行浅比较,如果props没有变化&#…...
OpenCV实现数字水印的相关函数和示例代码
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 实现数字水印的相关函数 用OpenCV来实现数字水印功能,需要使用一些位操作函数,我们需要先了解一下这些函数。 1. bitwise_and函数 bitwise_and函数是OpenCV中的位运算函数之一&…...
【CUDA】Sgemm单精度矩阵乘法(下)
目录 前言1. 优化技巧5:使用register模拟二级缓存(内积转外积)2. 优化技巧6:使用register模拟二级缓存 float43. 优化技巧7:global memory转置再存放shared memory4. 优化技巧8:使用double buffer加速矩阵…...
cursor 学习
参考:AI编程神器!Cursor无限续杯!白嫖白嫖!!!...
学术论文的科研流程概述 视频会议记录
CCF-Talk SPP131期 浙江大学研究员彭思达的报告。 举例视频生成要多快好省。 提升代码能力:先明白基础的函数,可以复现一个网络。最好是实现一个操作系统。...
【Linux笔记】——Linux线程理解与分页存储的奥秘
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——进程信号的捕捉——从中断聊聊OS是怎么“活起来”的 🔖流水不争,争的…...
ACM算法
在ACM模式下使用JavaScript/TypeScript获取输入值 在ACM编程竞赛或在线判题系统(如LeetCode、牛客网等)中,JavaScript/TypeScript需要特定的方式来获取输入值。以下是几种常见的获取输入的方法: 1. 使用Node.js的readline模块 这是最常见的处理ACM模式…...
家用或办公 Windows 电脑玩人工智能开源项目配备核显的必要性(含 NPU 及显卡类型补充)
一、GPU 与显卡的概念澄清 首先需要明确一个容易误解的概念:GPU 不等同于显卡。 显卡和GPU是两个不同的概念。 【概念区分】 在讨论图形计算领域时,需首先澄清一个常见误区:GPU(图形处理单元)与显卡(视…...
FastByteArrayOutputStream和ByteArrayInputStream有什么区别
FastByteArrayOutputStream 和 ByteArrayInputStream 是两种完全不同的 Java I/O 类,它们的主要区别体现在 设计目的 和 使用场景 上。以下是详细对比: 1. 核心区别总结 特性FastByteArrayOutputStream (Spring框架)ByteArrayInputStream (JDK原生)所属…...