深入Linux内存管理:从虚拟内存到OOM Killer的完整解析

news2026/5/21 7:08:57
1. 从物理到虚拟内存管理的演进与核心挑战干了这么多年系统开发和性能调优内存问题始终是那个最让人头疼但又不得不面对的“老朋友”。无论是半夜被报警叫醒处理线上服务的OOMOut of Memory崩溃还是为了优化一个关键服务的内存占用而反复剖析代码每一次与内存的“搏斗”都让我对这套复杂机制多一分敬畏。很多人觉得内存管理是内核开发者才需要关心的事但在我看来只要你的程序在Linux上跑理解内存的分配、回收乃至OOM的触发逻辑就是一项必备的生存技能。这不仅能帮你快速定位那些诡异的内存泄漏更能让你在设计系统时做出更合理、更健壮的资源规划。简单来说你可以把物理内存想象成一片真实的、有限的土地。早期系统直接在这片土地上“盖房子”运行程序谁都能看见谁家在哪儿不仅混乱安全性也差。虚拟内存的引入就像给每个进程发了一张专属的、巨大的“虚拟地产证”。进程以为自己拥有整片大陆比如32位系统是3GB的用户空间但实际上内核这位“超级管家”负责把虚拟地址映射到真实的物理“地块”上。进程之间看不到彼此的“地产证”实现了隔离进程想访问内核管理的“公共设施”必须通过严格的“系统调用”门卫安全性大大提升。当然这种间接访问会有开销。每次通过虚拟地址找物理地址都要查“映射表”页表。为了加速CPU里集成了一个叫TLBTranslation Lookaside Buffer的高速缓存专门存放最近用到的映射关系。得益于程序访问的局部性原理刚访问过的数据附近的数据很可能马上被访问TLB的命中率通常很高这使得虚拟内存机制在付出了可接受的微小性能代价后换来了安全性和灵活性的巨大提升。然而这套机制的复杂性也带来了新的挑战内存分配不再是一次性的而是涉及虚拟申请、物理映射、页面换出Swap、回收乃至最后的“清算”OOM等一系列复杂操作。今天我们就深入这套机制的腹地特别是从OOM这个终极“清算者”的视角来拆解Linux内存管理的核心框架。2. 内存分配管理的双城记内核空间与用户空间理解了虚拟内存的基本概念后我们来看看内核和用户进程在这套体系下是如何“生活”的它们的差异构成了内存管理的基石。2.1 内核空间特权者的“实权”分配系统启动之初确实是在物理内存上“裸奔”的。但内核很快会为自己建立一份“恒等映射”的页表也就是把一部分物理地址原封不动地映射为相同的虚拟地址保证自己能继续运行。完成更复杂的初始化后内核会建立完整的映射将自己放置在虚拟地址空间的高位区域32位在3GB以上64位在接近顶端的位置。内核空间的内存管理特点是“实在”分配即所得当内核调用kmalloc、vmalloc或alloc_pages等接口分配内存时它请求的是虚拟内存内核的内存管理子系统会同步分配物理内存并建立映射。对内核来说虚拟内存的分配通常意味着物理资源的即时占用。永不换出内核自身使用的物理内存页被称为“不可回收页”。即使系统内存极度紧张这些页面也不会被交换Swap到磁盘。这是因为内核需要确保其代码和数据随时可用且响应迅速换出会导致性能灾难和系统不稳定。线性映射区大部分物理内存会被内核通过一个固定的偏移量直接映射到内核虚拟空间即“线性映射区”或“低端内存”这使得内核能快速地将物理地址转换为虚拟地址反之亦然这对执行DMA操作或访问硬件缓冲区至关重要。2.2 用户空间平民的“承诺”与“兑现”用户进程的内存世界则完全不同其核心是“延迟”与“按需”。承诺虚拟空间当你的程序调用malloc()或mmap()时C库和内核只是在进程的虚拟地址空间中划出一块区域标记为可用。此时并没有分配任何物理内存。这就像银行承诺给你一笔信用额度但钱还没到你手上。按需兑现物理内存只有当进程真正读写这块内存地址时CPU的MMU发现页表里没有有效的物理映射会触发一个“缺页异常”。CPU暂停当前指令陷入内核。内核的缺页异常处理程序被调用它负责分配一个物理页帧将数据可能是清零也可能是从磁盘加载可执行文件内容填入该页然后更新页表建立虚拟地址到该物理页的映射。最后CPU回到用户空间重新执行那条引发异常的指令此时访问就正常了。这个过程称为“按需分页”。可被换出用户进程的物理内存页是“可回收页”。当系统物理内存不足时内核的内存回收机制可以将一段时间未使用的、非活跃的用户进程内存页的内容写入到交换分区Swap或交换文件中从而腾出物理页帧。当进程再次访问这些被换出的页面时又会触发一次缺页异常内核再将数据从Swap读回物理内存。这相当于把不常用的东西暂时存进仓库腾出家里空间。这种设计带来了巨大的灵活性一个进程可以申请远超物理内存总量的虚拟空间例如在64位系统上申请1TB只要它不同时使用这么多就行。但也带来了OOM的风险如果所有进程都试图“兑现”它们的承诺而物理内存加上Swap不够危机就来了。2.3 进程内存布局静态、自动与动态我们以经典的32位进程布局来理解用户空间的结构64位原理相同只是地址空间巨大高地址 ------------------ | 内核空间 | (通常用户进程不可访问) ------------------ 0xC0000000 (3GB) | 栈区 | (向下增长存放局部变量、函数调用信息) | ... | | ... | ------------------ | ... | (内存映射区域如动态库、mmap文件) ------------------ | 堆区 | (向上增长由malloc/free管理) ------------------ | 未初始化数据区 | (BSS段存放未初始化的全局/静态变量) ------------------ | 已初始化数据区 | (Data段存放初始化的全局/静态变量) ------------------ | 代码区 | (Text段存放程序指令) ------------------ 0x08048000 (附近随系统而定) | 保留区 | ------------------ 0x00000000 低地址代码区Text与数据区Data/BSS在程序加载时由内核一次性映射好大小固定。它们对应着可执行文件中的段有文件作为后备存储属于“文件页”。这部分我们通常无需操心。栈区Stack由编译器自动管理用于函数调用、局部变量。其分配和释放随着函数调用链自动进行故称“自动内存”。栈溢出是常见问题但通常由编程错误如无限递归、过大局部数组导致。堆区Heap这才是我们程序员主战场通过malloc、free、new、delete等手动管理称为“动态内存”。堆的大小通过brk或mmap系统调用来调整。brk移动堆顶指针用于扩展或收缩连续堆空间mmap可以创建独立于堆的匿名或文件映射区域。关于malloc库的演进早期的dlmalloc在单核时代很高效但在多线程SMP环境下全局锁成为瓶颈。于是出现了ptmallocGlibc默认分配器源于dlmalloc但引入了每线程私有堆arena的概念大幅减少了锁竞争。jemalloc最初用于FreeBSD在减少碎片和并发性能上表现优异被Redis、Firefox等广泛采用。scudo由LLVM项目开发强调安全性和性能现已成为Android默认分配器通过引入隔离、校验等手段缓解内存破坏漏洞。尽管有这些优秀的工具和规则如RAII、智能指针、引用计数动态内存管理仍是bug重灾区尤其是“内存泄漏”——申请了内存却忘记释放。长期泄漏会逐渐耗尽系统内存最终可能触发OOM Killer。我们接下来的重点就是看看当内存真的耗尽时系统是如何应对的。3. 内存回收的基本框架内核的“垃圾回收”机制物理内存是有限的共享资源。当内核或进程需要分配新页面但空闲内存低于某个阈值时内核必须启动回收机制腾出空间。这套机制分为同步和异步两条路径目标是在性能影响和内存释放之间取得平衡。3.1 同步直接回收分配路径上的紧急救援当进程尝试分配内存例如通过alloc_pages时如果发现空闲内存低于“低水位线”就会触发同步直接回收。这是一条“阻塞式”的路径当前分配请求会等待回收完成。其步骤像一个逐级升级的应急预案内存规整Compaction这是第一道温和的措施。内存碎片化后可能有很多分散的空闲页Page但无法分配出连续的多个页。内存规整通过移动“可移动页”主要是用户空间的匿名页和部分文件页让空闲页聚集在一起以满足连续内存分配请求。你可以把它理解为整理房间把散落各处的物品归位腾出大块空地。页帧回收Page Frame Reclaim如果规整后仍无法分配或请求的不是连续内存则开始真正的回收。回收对象主要是用户进程的“可回收页”分为两类文件页File Page有后备存储文件的页如代码段、数据段、内存映射的文件。其中未被修改的“干净文件页”是回收的首选因为直接丢弃即可需要时再从磁盘读回没有数据丢失风险速度也快。匿名页Anonymous Page没有文件后备的页如堆、栈使用的内存。回收它们必须将内容写入交换区Swap这是一个相对慢速的I/O操作。 回收策略由“页面置换算法”如LRU的近似实现决定优先回收最近最少使用且不活跃的页面。OOM Killer如果同步回收和异步回收见下文竭尽全力后系统仍无法回收到足够内存内核就会启动这个终极手段——选择一个“坏”进程杀死强制释放其占用的所有资源。这是为了阻止系统完全僵死属于“丢车保帅”。3.2 异步回收后台的默默守护者除了紧急时刻的同步回收内核还运行着后台守护线程kswapd它负责在内存压力尚可时进行异步回收目的是维持系统的空闲内存水位。工作原理内核设置了几个关键水位线min,low,high。当空闲内存低于low水位时会唤醒kswapd。kswapd开始扫描并回收页面直到空闲内存回到high水位。它工作在后台不阻塞当前进程用户体验更平滑。NUMA感知在多核NUMA架构的服务器上内存访问有远近之分。kswapd是per-node每个内存节点一个而非 per-CPU 的。因为内存分配策略通常优先从进程所在的本地NUMA节点分配所以哪个节点内存紧张就唤醒哪个节点的kswapd这符合NUMA的优化原则。对于普通的台式机或手机单节点只有一个kswapd线程。与规整协作kswapd回收页面后可能会产生碎片。因此内核还有kcompactd线程在kswapd工作后被唤醒进行异步的内存规整改善内存的连续性。注意频繁的kswapd活动或同步回收尤其是涉及大量Swap I/O时是系统内存压力大的明确信号。你可以通过vmstat 1命令观察siswap in和soswap out列的非零值或使用sar -B查看页扫描频率来提前预警内存不足问题。4. OOM原理详解虚拟的承诺与物理的清算OOM分为两种虚拟内存OOM和物理内存OOM它们发生在不同的层面原因也不同。4.1 虚拟内存OOM过度承诺的艺术与限制虚拟内存OOM发生在用户空间表现为malloc()、mmap()等调用返回NULL错误码为ENOMEM。很多人疑惑64位进程的虚拟地址空间不是近乎无限吗怎么会分配失败这就引出了Linux的“过度承诺”Overcommit策略。内核通过/proc/sys/vm/overcommit_memory这个参数来控制虚拟内存的分配策略0(OVERCOMMIT_GUESS)默认模式。内核会进行一种启发式检查允许分配的虚拟内存总量超过物理内存Swap的总和但不会太过分。它拒绝明显荒谬的请求比如一次性申请远超总物理内存的量但对于大量小请求的累积超限可能无法阻止。这是一种折中策略。1(OVERCOMMIT_ALWAYS)总是允许。只要虚拟地址空间还有空余任何大小的分配请求都成功。这给了应用程序最大的灵活性但风险也最高。如果所有进程都试图兑现它们的承诺物理内存必然耗尽。这种模式常用于科学计算或某些特定负载需要管理员对应用行为有充分了解。2(OVERCOMMIT_NEVER)严格禁止过度承诺。这是最保守的模式。它计算一个“可提交内存”上限通常是物理内存 * 百分比 Swap百分比由overcommit_ratio控制默认50%然后减去系统保留内存。任何导致总已提交虚拟内存超过此上限的分配都会立即失败。这可以防止系统因过度承诺而陷入物理OOM但可能导致一些需要大量稀疏内存的应用如某些数据库、稀疏矩阵计算无法启动。选择建议对于大多数服务器和桌面环境默认的0是合理的选择。如果你需要更高的可预测性避免物理OOM可以设置为2但需要监控应用是否因此分配失败。设置为1需要非常谨慎通常只在特定场景下使用。4.2 物理内存OOM与OOM Killer最后的审判当虚拟内存的“承诺”需要被“兑现”即分配物理页但系统物理内存包括通过回收和Swap真的无法满足时物理内存OOM就发生了。此时OOM Killer被触发。OOM Killer的核心逻辑很简单选择一个进程杀死以释放其内存。关键在于“如何选择”。选择算法主要依据每个进程的oom_score值分值越高越容易被选中。相关用户接口/proc/[pid]/oom_score(只读)系统实时计算出的得分范围0-1000。值越大越可能被杀。/proc/[pid]/oom_score_adj(读写root权限)调整oom_score的 knob范围-1000到1000。最终得分是oom_score (oom_score_adj * total_pages / 1000)。将其设为-1000可确保该进程的得分0从而免于被OOM Killer杀死成为OOM_DISABLE。系统关键进程如init,sshd通常设为此值。/proc/[pid]/oom_adj(已弃用)旧接口为兼容保留请使用oom_score_adj。选择算法精要简化版遍历所有进程跳过不可杀的进程如内核线程、init进程、设置了OOM_DISABLE的进程。对每个候选进程计算其oom_badness即oom_score的基础部分。现代内核如4.x以后的计算公式非常直接oom_badness ≈ 进程驻留物理内存(RSS) 交换区占用(Swap) 页表内存开销简单说谁实际占用的物理和交换内存总量最大谁的得分就最高。这是一个重大改变。早期内核如2.6的算法会考虑进程运行时间越长越不容易杀和nice值优先级高越不容易杀但这可能导致缓慢内存泄漏的进程“逍遥法外”。现在的算法更简单、更公平、也更有效——谁吃内存最多谁最可能是“罪魁祸首”。加上oom_score_adj的调整值。选择得分最高的进程。向选中的进程发送SIGKILL信号强制终止。查看与调试你可以通过cat /proc/[pid]/oom_score查看任意进程的当前得分。当OOM Killer触发时内核日志dmesg或/var/log/kern.log会记录详细信息包括被杀进程的pid、名称、oom_score以及它占用的内存情况。搜索Out of memory: Kill process即可找到。4.3 Android Low Memory Killer (LMK)主动防御机制在Android系统中除了标准的Linux OOM Killer还有一套Low Memory Killer (LMK)机制。它的设计哲学是“主动防御提前清理”。触发时机更早LMK在系统内存开始紧张但还未耗尽时就介入根据预设的内存阈值逐级杀死进程以维持系统响应能力避免陷入必须调用OOM Killer的极端境地。选择逻辑不同LMK不计算复杂的oom_score。它只依据oom_score_adj的值。系统为不同类型的进程预设了不同的oom_score_adj级别如前台应用、可见服务、后台服务、缓存应用等。当内存低于某个阈值时LMK就杀死oom_score_adj大于等于该阈值的进程中oom_score_adj值最大的那个。管理范围LMK默认只管理oom_score_adj 0的进程这主要涵盖了所有的Android应用进程。系统核心Native进程的oom_score_adj通常设为负值如-1000不受LMK影响。协同工作LMK和OOM Killer构成了双重防线。LMK在前端进行精细化的、基于应用生命周期的内存管理OOM Killer作为最后的后备机制在LMK未能阻止内存耗尽时用更粗暴但有效的方式回收内存。5. 实战如何分析和应对内存问题理解了原理我们最终要落到实操上。当系统出现内存压力或发生OOM时如何快速定位和分析5.1 监控与预警指标使用free -h和top/htopfree看整体关注available列真正可用的内存而不仅仅是free。buff/cache占用高通常是正常的这部分内存会被快速回收。top看进程按%MEM内存占比或RES常驻内存排序找出内存消耗大户。使用vmstat 1si,so如果持续大于0说明正在发生Swap交换是内存不足的明确信号。cs上下文切换次数暴增可能因为内存回收导致进程频繁被阻塞/唤醒。使用sar -B 1pgscank/s,pgscand/s分别表示kswapd和直接回收扫描的页面数。数值高表示回收压力大。pgsteal/s成功回收的页面数。检查/proc/meminfoCommitLimit和Committed_AS在overcommit_memory2时判断是否接近上限。SwapCached被换出但可能还被需要的页面这部分如果再次被访问可以快速恢复。PageTables页表占用过大如超过几百MB可能意味着进程数量极多或使用了大量内存映射。5.2 OOM发生后的诊断流程第一步查看内核日志。运行dmesg -T | grep -i out of memory\|kill process或检查/var/log/kern.log。日志会明确告诉你哪个进程被杀了它的pid、oom_score以及当时的内存概况。第二步分析被杀进程。确认该进程是否是你自己的应用。如果是结合应用日志分析在OOM前它在做什么大量数据处理、文件加载、缓存增长。第三步检查系统状态。OOM发生时系统的整体内存使用情况可以通过监控系统回溯。是某个进程突然暴涨还是内存被缓慢侵蚀Swap是否已用尽第四步复现与排查。尝试在测试环境复现。使用内存分析工具Valgrind Massif堆内存分析利器可以生成内存使用随时间变化的快照图。jemalloc/tcmalloc自带分析工具如果应用使用了这些分配器它们通常提供更强大的内存剖析和泄漏检测功能如jemalloc的pprof。pmap、/proc/[pid]/smaps查看进程详细的内存映射找出哪个段heap, stack, mmap在持续增长。GDB/核心转储如果条件允许配置系统在OOM时生成核心转储sysctl vm.panic_on_oom0并配置kernel.core_pattern然后用GDB分析崩溃现场。5.3 预防与调优建议合理设置oom_score_adj对于非常重要的守护进程或服务可以将其oom_score_adj设为负数如-500或-1000降低其被杀的概率。但请谨慎使用避免让有内存泄漏的进程“逃逸”。优化应用内存使用使用内存池对于频繁申请释放的小对象自定义内存池可以避免碎片化并提升性能。及时释放资源确保所有malloc/new都有配对的free/delete。在C中优先使用智能指针std::unique_ptr,std::shared_ptr和RAII范式。监控内存增长在应用内关键点记录内存使用量如通过getrusage或/proc/self/statm设置内部预警阈值。系统级调优调整Swappiness/proc/sys/vm/swappiness默认值60。值越高内核越倾向于使用Swap。对于数据库等追求极致性能的服务可以调低如10让内核更倾向于回收文件页缓存而不是交换匿名页。对于桌面系统可以适当调高以提升多任务流畅度。确保足够的Swap空间Swap是物理内存的延伸也是OOM前的最后缓冲。建议Swap空间大小为物理内存的1-2倍对于现代大内存服务器比例可以更低但不应为0。限制进程资源使用cgroups特别是memory子系统为关键服务组设置内存使用上限memory.limit_in_bytes。这样即使该组内进程发生泄漏也只会影响该组不会拖垮整个系统。同时可以设置memory.oom_control来控制在cgroup内发生OOM时的行为。内存管理就像一场精密的平衡游戏。理解从虚拟地址到物理页的映射到分配器的行为再到内核回收和OOM的触发逻辑能让你从被动地应对崩溃转变为主动地规划资源、预防问题。下次当你再看到“Killed”消息时希望你能胸有成竹地打开日志开始一场有条不紊的“破案”之旅。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…