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

Linux 进程从入门到实战(一)

.个人主页晓风飞专栏数据结构|Linux|C语言路漫漫其修远兮吾将上下而求索文章目录进程为什么要存在内存操作系统进程什么是进程PCB进程控制块操作系统如何管理进程示例getpid查看进程的做法进程的 CWD当前工作目录bashkill进程状态问题2为什么同一个函数会返回两次问题3为什么同一个变量id即 0又大于0进程状态调度队列内嵌式双链表偏移量阻塞状态进程状态基本状态阻塞状态阻塞的本质3. 挂起状态挂起分类Swap 分区细节挂起状态的补充整体流程总结进程为什么要存在内存数据流动的本质是拷贝数据在计算机体系结构中流动CPU 不直接与外设打交道。CPU 需要数据时只能从内存中读取写数据时也只能写入内存。存储分级问题外设速度太慢与 CPU 之间存在巨大的速度代差因此 I/O 操作的效率相对较低。内存的作用c编译形成可执行程序代码数据文件程序运行前必须先加载到内存中这是体系结构的规定从纯硬件角度出发。内存为计算机提供了更高的性价比提升了整体运行效率。操作系统操作系统是一个管理软硬件资源的软件。广义操作系统操作系统内核 核心应用软件狭义操作系统操作系统内核Linux 内核主要包含进程管理文件管理内存管理驱动与设备管理进程什么是进程教材定义运行起来的程序就是进程加载到内存中的程序叫做进程。更准确的理解进程 内核数据结构task_struct 程序的代码和数据。可以类比为学生 学籍信息 本人。用户让操作系统执行某个任务、加载某个程序都会被转换成进程。一切指令执行、工具执行、软件执行本质上都是进程在运行。进程就是用户要做什么PCB进程控制块PCB 内部包含了描述进程的所有属性。操作系统通过“先描述再组织”的方式来管理进程类似于找工作进程是求职者PCB 是简历CPU 是面试官操作系统是 HR 调度。在 Linux 中输入 top 命令可以查看进程类似于 Windows 的任务管理器。os内部可以同时存在多个进程操作系统如何管理进程操作系统必须对进程进行管理管理方式是“先描述再组织”。每个进程在内核中都有一个对应的内核数据结构——PCBProcess Control Block进程控制块struct task_struct { 进程属性链接字段 }进程的前身我们叫做程序, 程序在没有加载到内存之前以文件的形式存储在磁盘上冯·诺依曼原理。程序加载到对应内存中才会变成进程当程序加载到内存时操作系统不仅会加载代码和数据还会在内核中创建一个 task_struct包含了描述当前进程所有属性的结构体也包含了程序在内存中的代码和数据操作系统创建进程。结构体来描述该进程。如果内存中存在多个进程操作系统会将所有 PCB 连接起来形成一个链表。CPU 调度时会遍历链表选择优先级最高的进程来执行。操作系统对进程的管理本质上就是对链表进行增删查改。示例getpid#includestdio.h#includeunistd.h#includesys/types.hintmain(){pid_tidgetpid();while(1){printf(hello, i am a proces , pid: %d\n,id);sleep(1);fflush(stdout);}return0;}对应的Makefileyproc:code.c gcc-o $ $^.PHONY:clean clean:rm-f myproc~运行 ./myproc 后可以看到当前进程的 PID如 2367。getpid() 本质上是从 task_struct 中获取进程的 PID 字段。structtask_struct{pid_tpid;}ctrlc本质是终止进程终止后下次再运行操作系统给与的pid值不同查看进程的做法1.process-/proc 2命令linux一切皆文件数字目录本身是特定进程对应的pid我们在一个端口运行程序另一个端口查看进程如果这时候把进程的可执行程序删除会不会对进程暂时有影响吗我们输入rm proc删除掉正在执行的程序这时候在进进程里ls下可以发现可执行程序属性冒红发现被deleted删除了进程的 CWD 如果指向一个被删除的目录进程依然可以正常运行内核会持有目录的引用计数不会立刻释放但此时你用相对路径创建文件会失败因为对应的目录已经不存在了。注意进程的 CWD当前工作目录在哪里CWD 存储在进程文件系统信息结构体 fs_struct 中并由进程控制块 task_struct 内的指针所管理。子进程会继承父进程的 CWD。为什么需要 CWD实现 “工作目录隔离”避免路径冲突不同进程可以有不同的 CWD比如你在两个终端里分别在dirA和dirB下运行同一个程序它们打开的config.txt会分别对应dirA/config.txt和dirB/config.txt互不干扰。“文件不存在时进程帮忙创建”本质也是基于 CWD比如你用fopen(“new.txt”, “w”)创建文件内核会基于进程的 CWD把相对路径解析成绝对路径再创建文件。如果没有 CWD内核不知道文件该创建在哪个目录下。chdir更改当前进程的工作路径进程可以通过int chdir(const char *path); 修改自己的 CWD但这个修改只会影响当前进程和它后续创建的子进程不会影响父进程比如终端。#getcwd获取当前进程的工作路径我在/home/dzh/work目录下gcc编译程序#includestdio.h// 必须有 ##includeunistd.h#includesys/types.hintmain(){charpwd[128];getcwd(pwd,128);printf(before: %s\n,pwd);chdir(/home/dzh/work);getcwd(pwd,128);printf(after: %s\n,pwd);pid_tidgetpid();FILE*fpfopen(log.txt,w);(void)fp;while(1){printf(hello, I am a process, pid: %d\n,id);sleep(1);}return0;}这时候可以看到程序当前路径变成了home/dzh2命令ps查看当前目录进程ps ajx | grep procmyps ajx 看 父子进程关系、PID、PPID、PGID、SID偏进程关系ps aux | grep procmyps aux 看 CPU、内存占用、运行时间、用户偏资源占用实用命令ps ajx |head -1 ps ajx | grep procmy先打印表头再搜索你的进程这样你看结果时每一列是什么意思一目了然ps ajx | head -1 # 只输出第一行标题头 # 并且前面成功才执行后面ps ajx | grep procmy # 搜索你的进程 procmybashash 命令行解释器本身也是一个进程它以死循环的方式运行负责接收用户输入的命令并创建子进程来执行。通过 ps ajx 可以查看进程间的父子关系。当你登录 Linux 后系统给你启动的-bash进程就是你当前终端的父进程查看你的 bash 进程 PIDecho $$查看它的父进程通常是终端/sshdps -ef | grep $PPID它的工作就是接收你输入的命令创建子进程来执行。killkill -9进程可以kill掉bash会发现掉线类似bash它是如何创建字进程的呢fork创建子进程#includestdio.h#includeunistd.h#includesys/types.h#includestdlib.hintmain(){printf(fork 之前我是一个进程pid: %d, ppid: %d\n,getpid(),getppid());fork();printf(fork 之后我是一个进程pid: %d, ppid: %d\n,getpid(),getppid());sleep(1);return0;}pid#includestdio.h#includeunistd.h#includesys/types.h#includestdlib.hintmain(){pid_tidfork();if(id0){while(1){printf(读书...\n);sleep(1);}}elseif(id0){while(1){printf(种地...\n);sleep(1);}}return0;可以看到两个进程同时在运行进程状态子进程以父进程为模板进行创建父进程创建子进程代码默认是被子进程共享的子进程后续默认只能执行父进程fork之后的代码问题1为什么给子进程返回0给父进程返回子进程的pid子进程返回 0子进程知道自己是谁不需要通过返回值来获取 PID可以通过 getpid() 获取返回 0 只是告知它是子进程。一个父进程可以创建多个子进程1:n 关系父进程需要知道每个子进程的 PID才能对它们进行管理比如 wait() 等待、kill() 终止。如果父进程也返回 0它就分不清哪个是哪个子进程了。就像家长有多个孩子每个孩子只需要知道 “我是孩子”但家长必须知道每个孩子的学号才能点名、管理。问题2为什么同一个函数会返回两次a如果函数都准备return了这个函数的核心工作做完了吗常规函数工作没做完就不会走到 return一旦 return函数就结束了只返回一次。但是fork() 的核心工作是创建一个新进程在父进程中将 task_struct 复制一份修改属性PID、PPID 等并将新进程放入调度队列。新进程创建完成后两个进程都会继续执行 fork() 的剩余逻辑父进程将子进程 PID 写入自己的变量并返回子进程将 0 写入变量并返回。因此fork() 不是同一个函数被调用了两次而是两个进程各自执行了该函数的 return 部分。问题3为什么同一个变量id即 0又大于0核心在于进程独立性与写时复制Copy-on-Write。fork() 时子进程会复制父进程的虚拟地址空间因此父子进程的变量 id 在虚拟地址上是相同的但它们映射到不同的物理内存。写时复制机制刚 fork() 完成时父子进程共享同一块物理内存只读。当任意一方需要修改数据时系统会复制一份新的物理内存给修改方之后双方的变量就完全独立了。因此父进程的 id 和子进程的 id 是两个不同的物理内存变量只是虚拟地址相同它们的值可以不同且互不影响。这个地址不可能是物理地址-虚拟地址反回的本质就是写入本质不是同一个变量只不过是虚拟地址相同物理内存中其实是分开的进程状态进程状态本质就是task——struct内部的一个整型变量站在操作系统原理角度解释进程状态运行阻塞挂起FIFO调度算法进程处于运行状态可是task_struct他不是属于双链表怎么能还属于调度队列呢内核链表的实现int a 104个字节a标识一个地址类型决定大小结构体呢c语音对任何类型开辟空间的时候变量的地址在数字上等于开辟的众多字节中地址最小的那个数字调度队列在单CPU系统中每一个CPU都必须有一套自己的调度队列。调度队列本质上就是一个队列结构把所有处于就绪态的进程的PCB以某种数据结构连接起来。只要一个进程的PCB位于这个调度队列中我们就称它处于R状态运行状态——注意R状态并不代表进程正在CPU上运行而是代表它随时可以被调度。内嵌式双链表传统的链表节点通常会包含数据域例如structnode{intdata;structnode*prev,*next;};但内核中的链表节点不包含任何业务属性只包含前驱和后继指针structlist_head{structlist_head*prev,*next;};那么如何将链表节点嵌入到进程控制块PCB中呢Linux的做法是在PCB结构体内部定义一个list_head类型的成员。例如structtask_struct{// ... 很多字段structlist_headrun_list;// 用于挂入调度队列structlist_headwait_list;// 用于挂入等待队列// ...};关键技巧已知结构体内某个成员的地址如何反推出整个结构体的起始地址通过计算成员在结构体中的偏移量。内核提供了container_of宏#definecontainer_of(ptr,type,member)\((type*)((char*)(ptr)-offsetof(type,member)))这样就可以通过链表节点的指针找到整个PCB的起始地址。利用这种技术一个PCB可以同时属于多个队列全局进程链表、每个CPU的运行队列、设备的等待队列等。这就实现了灵活的组织。偏移量求对象d在obj中的偏移量因为系统是64位取地址占8字节强转int取地址是4字节所以用long longd的偏移量是16遍历用偏移量找到pid内核为什么要这么做1.对内核对象进行管理更具有通用性2struct task_struct{//进程其他属性struct list_head link;struct list_head queue_linkstruct list_head hash;}一个进程插入多个结构一个struct task_struct就可以属于双链表也可以属于调度队列未来还可以属于任何结构阻塞状态比如c语言中的scanf输入时用户没有输入操作系统管理硬件也要先描述在组织所有它所描述的对应硬件结构体里也可以包含进程相关的链接字段当一个进程正在运行比如执行scanf发现底层的硬件没有就绪就会把进程pcb从cpu调度中剥离下来放到比如键盘的等待队列中进程就不被调度了就阻塞了当硬件准备好了操作系统又会把等待队列中的把对应的等待进程重新放回运行队列里进而进行调用读取进程状态基本状态在操作系统学科中进程有三种基本状态运行态、就绪态、阻塞态。此外还有挂起态。运行态进程正在CPU上执行。就绪态进程已经准备好只等CPU调度。阻塞态进程因为等待某种资源如键盘输入、磁盘I/O而主动放弃CPU。挂起态当内存资源严重不足时操作系统会把部分进程的代码和数据交换到磁盘的swap分区以释放内存空间。挂起可以发生在阻塞态或就绪态上。这个过程对用户透明操作系统不会主动告诉用户“我把你的进程挂起了”。进程状态本质上是 task_struct 中的一个整型变量。从操作系统原理的角度进程的基础状态主要有三种就绪态等待 CPU、运行态正在占用 CPU、阻塞态等待 I/O 或事件。当系统内存紧张时还会将某些进程的代码和数据换出到磁盘形成挂起态又可细分为静止就绪和静止阻塞。阻塞状态例如在 C 语言中执行 scanf如果用户没有输入硬件设备如键盘就未就绪。操作系统管理硬件也遵循“先描述再组织”的原则硬件的结构体中会包含与进程相关的链接字段。当进程执行 scanf 发现底层硬件未就绪时操作系统会将进程的 PCB 从 CPU 调度队列中移除放入该硬件如键盘的等待队列中。此时进程不再被调度进入阻塞状态。当硬件准备就绪后操作系统会将等待队列中的进程重新放回运行队列继续执行。阻塞的本质当一个进程执行到scanf等待键盘输入时如果键盘没有数据进程就会进入S状态可中断睡眠。这是Linux中的一种阻塞状态。它的底层过程是1. 进程正在CPU上运行调用scanf。 2. 操作系统发现键盘设备尚未就绪没有数据可读。 3. 操作系统将当前进程的PCB从调度队列中摘下。 4. 将该PCB挂入键盘设备描述结构体的等待队列中。 5. 进程状态从R改为S。 6. 当用户敲击键盘键盘产生中断驱动程序获知设备就绪。 7. 驱动程序将等待队列中的PCB摘下重新放回调度队列。 8. 进程状态从S改回R。 9. CPU调度该进程继续执行scanf读取数据。总结所谓的阻塞就是进程在等待某种资源。它等待什么资源就把自己的PCB放到那个资源的等待队列里。3. 挂起状态核心概念用时间换取内存空间。当系统物理内存紧张时操作系统会将暂时无法运行的进程的代码段、数据段从物理内存移至磁盘的 Swap 分区 暂存仅保留 PCB。待条件满足后再将数据从磁盘调入内存加入调度队列等待 CPU 执行。内存紧张时系统频繁做进程换入换出本质就是用 IO 时间成本换取内存空间以此腾出运行空间。即便开启阻塞挂起、运行挂起内存依旧严重不足时系统就会执行杀进程操作直接终止占用资源多的进程彻底释放内存。日常电脑、手机软件无故闪退大多就是系统内存耗尽主动清理杀掉进程导致。两种挂起区分阻塞挂起进程处于等待阻塞状态时提前将代码数据换到磁盘分区等待条件满足后再调回内存、加入调度队列等待运行。就绪挂起进程在就绪调度队列排队还未轮到 CPU 执行就先把数据转出磁盘轮到调度再调入内存执行。挂起 数据换出存磁盘激活 数据换回内存频繁读写磁盘外设会大幅拖慢系统运行速度这就是多开软件设备卡顿的核心原因。补充知识操作系统安装时会自动划分交换分区专门用来存放被挂起转出的进程数据。Windows、Linux 系统都可自行查看磁盘分区直观看到该分区空间。挂起分类阻塞挂起进程因等待外设响应、系统资源或信号等进入阻塞等待队列内存不足时其代码与数据被换出至 Swap 分区释放内存。就绪挂起进程已准备就绪在就绪队列中等待 CPU 调度。内存压力大时系统会提前将闲置的就绪进程置换到 Swap 分区为活跃进程腾出内存。Swap 分区细节作用充当“内存备胎”实现逻辑内存扩容统一存放被挂起进程的代码与数据缓解物理内存满载导致的系统运行阻塞。弊端底层依赖磁盘 I/O读写速度远低于物理内存。分区过大易导致系统过度依赖 Swap频繁触发换入换出操作消耗系统资源降低整机效率使进程唤醒加载耗时增加出现明显卡顿。大小建议小内存设备Swap 容量 物理内存容量常规办公设备Swap 容量 物理内存的 1/216G 及以上大内存设备配置 2~4G 即可服务器场景主流云服务器默认关闭 Swap 分区以节省磁盘资源、避免高频 I/O 损耗保障高性能稳定运行。系统弊端进程频繁换入换出产生海量磁盘 I/O拉高系统负载闲置进程唤醒需二次加载数据启动和响应速度变慢日常多开软件卡顿、后台程序掉线核心原因往往是内存爆满触发进程挂起置换。内存耗尽应急机制OOM 当进程挂起和 Swap 全部用尽后内存依然严重不足时操作系统会启动 OOM 进程查杀机制自动筛选高内存占用、低优先级的后台进程强制终止彻底释放其占用的全部内存资源以保障系统核心进程稳定运行。实际表现移动端 APP 无故闪退、后台应用被清理服务端高并发场景业务进程宕机、网站服务崩溃。理论状态与 Linux 实际状态的区别教材理论中的进程状态通常更完整包括新建态、就绪态、运行态、阻塞态、挂起态等划分细致。而 Linux 实际内核实现中的状态分类会略有不同更为具体。挂起状态的补充挂起状态在Linux中并没有单独的状态码显示。为什么打个比方你家里很穷你上大学的生活费是父母借钱凑的但父母不会每次给你钱时都说“这是借来的”。操作系统也一样它把进程的代码和数据换出到swap分区但不会在状态上体现出来。用户看到的仍然是S或R状态。这是Linux对用户的友好隐藏。整体流程总结内存充足所有进程常驻物理内存CPU 直接调度执行。内存紧张闲置的阻塞或就绪进程触发挂起数据存入 Swap 分区释放内存。进程就绪从 Swap 调取数据重回内存加入就绪队列等待调度。内存爆满挂起机制失效系统自动查杀多余进程兜底保障系统运行。

相关文章:

Linux 进程从入门到实战(一)

.个人主页:晓风飞专栏:数据结构|Linux|C语言路漫漫其修远兮,吾将上下而求索文章目录进程为什么要存在内存??操作系统进程什么是进程?PCB(进程控制块)操作系统如何管理进程&#xff1…...

遥测数据定义的生产级落地规范指南

在分布式架构与微服务体系中,将 Tracing(链路)、Metrics(指标)、Logs(日志)三种遥测数据有机构建为“三位一体” (3D Observability) 的可观测性网络,是保障系统高可用性的基石。 以…...

Java智能地址解析终极指南:企业级架构设计与高性能实现方案

Java智能地址解析终极指南:企业级架构设计与高性能实现方案 【免费下载链接】address-parse Java 版智能解析收货地址 项目地址: https://gitcode.com/gh_mirrors/addr/address-parse 面对电商、物流、外卖等系统中复杂多变的地址输入格式,传统的…...

AMD Ryzen SMU Debug Tool完整指南:轻松掌握硬件级调试的5个关键步骤

AMD Ryzen SMU Debug Tool完整指南:轻松掌握硬件级调试的5个关键步骤 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地…...

【Linux】网络基础2---Socket编程预备

📌 相关专栏 【Linux专栏】【C语言专栏】【测试专栏】 上期回顾【Linux 】网络基础1 文章目录1. 理解源IP地址和目的IP地址2. 认识端口2.1端口号范围划分2.2 理解 "端⼝号" 和 "进程ID"2.3 源端口号与目的端口号2.4 理解Socket2. 传输层的典型代…...

Python初学者项目练习23--计算圆的面积

一、练习题目 定义一个函数,这个函数用于计算并返回给定半径的圆的面积(要求结果保留两位小数) 二、代码 1.初始版本 代码如下: def area(r):"""作用:用于计算并返回给定半径的圆的面积(要求…...

RAG:终结AI幻觉,让你的大语言模型秒变“知识渊博”!

本文深入浅出地介绍了检索增强生成(RAG)技术,解释了其如何通过结合文档检索与大语言模型(LLM),有效减少AI幻觉现象。文章详细阐述了RAG的工作流程,包括数据分块、嵌入转换、向量数据库存储、问题…...

Go 内存优化骚操作

1. 零内存占位符:struct{}{}原理:struct{} 是空结构体,Go 编译器对其做了特殊处理,它在内存中不占任何空间(大小为 0 字节)。场景 A:实现集合 (Set)map[string]struct{}。比起 map[string]bool&…...

凡亿AD22--AD软件泪滴的添加与移除

一、泪滴的基础认知1.1 泪滴的定义泪滴是PCB设计中,在走线与焊盘、走线与过孔(导孔)连接位置添加的「圆弧状或渐变状过渡结构」,本质是连接部位的“过渡加固层”,肉眼可见为类似水滴或圆弧的形态,核心作用是…...

2025_NIPS_Language Models Don‘t Always Say What They Think: Unfaithful Explanations in Chain-of-T...

文章主要内容与创新点总结 一、主要内容 该研究聚焦大语言模型(LLMs)的思维链(CoT)提示法,核心探讨CoT解释的“不忠实性”——即模型生成的分步推理过程可能无法真实反映其预测的底层逻辑,反而会系统性地误导用户。 研究背景:CoT提示法通过引导模型输出分步推理再给出…...

【项目实训(个人8)】

继续进行法律文书智能摘要系统的开发,新增了几个功能,并优化了用户体验概述本次开发为法律文书智能摘要系统新增了两项核心功能。其一是摘要版本管理,支持同一文档的多版本摘要生成、存储、对比和回滚。用户在生成摘要时,系统自动…...

运放电源端串联磁珠

在运放电源端串联磁珠,是一种常见的高频噪声抑制设计手段,但需结合具体应用场景谨慎使用。以下是关键要点:---作用与目的 - 抑制高频噪声:磁珠对高频信号(通常 >10 MHz)呈现高阻抗,将电源线上…...

Re: Linux系统篇(十八)进程篇·三:深度硬核!全面起底 Linux 进程状态变化与内核链表动态解绑

◆ 博主名称: 晓此方-CSDN博客 大家好,欢迎来到晓此方的博客。 ⭐️Linux系列个人专栏: 【主题曲】Linux ⭐️此方的GitHub: github_此方 ⭐️Re系列专栏:我们思考 (Rethink) 我们重建 (Rebuild) 我们记录 (Record…...

意识的“调谐客观还原”理论

“调谐客观还原”理论,通常称为 Orch-OR,是诺贝尔物理学奖得主罗杰彭罗斯与麻醉学家斯图尔特哈梅罗夫于20世纪90年代初提出的一种极具争议的意识假说。该理论的核心观点是:意识并非产生于神经元之间的经典电化学连接,而是源于神经…...

基于 Python 有限元法的光子微腔仿真:从理论到代码实现

引言:光子微腔与有限元法的结合实例# 安装基础依赖 pip install numpy matplotlib scipy# 安装GMSH网格生成器 pip install gmsh# 安装FEMWELL光子学有限元库 pip install femwell# 安装FEniCSx(FEMWELL的底层依赖) # 对于Ubuntu/Debian系统 …...

5分钟学会AnyFlip电子书一键下载:免费PDF转换终极指南

5分钟学会AnyFlip电子书一键下载:免费PDF转换终极指南 【免费下载链接】anyflip-downloader Download anyflip books as PDF 项目地址: https://gitcode.com/gh_mirrors/an/anyflip-downloader 你是否曾经在AnyFlip上找到一本精彩的电子书,想要永…...

多语言交易所源码/币币交易+期权交易+永续合约+Defi借贷+新币申购+矿机理财/前端uniapp纯源码+后端php

简介: 多语言交易所源码/币币交易期权交易永续合约Defi借贷新币申购矿机理财/前端uniapp纯源码后端php 语言:7种,看图 前端是uniapp纯源码,只有手机端,后端是php框架,清理了后门的,是最开始蓝…...

86、【Agent】【OpenCode】bash 工具提示词(完结)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】bash 工…...

根据等价类划分法,**有效等价类**是指符合系统规格说明、应被系统正常接受的输入范围

根据等价类划分法,有效等价类是指符合系统规格说明、应被系统正常接受的输入范围。 题目中密码长度要求为 6–12位(含端点),即最小长度为6,最大长度为12,且为整数位数。 因此,关于密码长度的有效…...

【软考高级架构】案例题考前突击——构建可观测与弹性服务架构的实践设计

案例分析题:构建可观测与弹性服务架构的实践设计 案例背景 某金融科技公司搭建了基于Spring Cloud 的微服务系统,用于支撑其多租户 SaaS 金融平台,核心功能包括用户管理、交易撮合、支付结算、风控审计等模块。由于业务快速扩张、团队并行开发,系统逐渐暴露出如下痛点: …...

Java全栈工程师面试实录:从基础到微服务的深度技术对话

Java全栈工程师面试实录:从基础到微服务的深度技术对话 面试官与程序员的对话 面试官(李哥): 你好,欢迎来参加我们公司的面试。我是李哥,负责技术面试。先简单介绍一下你自己吧。 程序员(张浩&a…...

【YOLOv8多模态融合改进】| IEEE2025 分层特征融合模块HFF 自适应权重 + 三重注意力,强化弱小目标细节保留

一、本文介绍 本文记录的是利用分层特征融合模块HFF改进YOLOv8的可见光-红外双模态目标检测。 HFF(Hierarchical Feature Fusion)通过浅层-深层特征逐元素融合、空间-通道-像素三重注意力建模与自适应加权分配结合,实现多模态来源下不同语义层级特征的自适应重要性学习与精…...

AI+HR 全生命周期智能管理实战指南:从概念到落地,解锁组织效能新增长!​

在企业数字化转型的浪潮中,人力资源管理正经历着前所未有的变革。据行业数据,61% 的 HR 领导者已进入 GenAI 实施进阶阶段,82% 的企业计划在 12 个月内部署 AI 智能体,而 AI 驱动的企业人均效能已实现3.2 倍提升。当传统 HR 深陷事…...

2026年AI面试准确率TOP榜:92%一致性背后,谁在定义行业新标准?

当年ChatGPT的横空出世,让全世界第一次见识到通用大模型的对话能力;DeepSeek 的爆发,则将AI的火种真正播撒到中国各行各业的毛细血管中,而在人力资源行业作为数字化转型的前沿阵地,首当其冲迎来了AI的全面渗透 &#x…...

如何优化鸿蒙 App 的启动速度?

子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...

梳理尼日利亚外贸典型骗局分享高效避雷方法

与尼日利亚客户交易须防范D/P条款陷阱,信用证务必经第三国银行保兑,警惕提单信息泄露,掌握风控要点方能安全拓展西非市场。拒绝D/P托收条款切勿接受D/P付款方式。尼日利亚部分银行可能与客户勾结,在买方未付货款的情况下擅自放行提…...

ncmdumpGUI:免费解锁网易云音乐加密文件,3分钟实现跨设备播放自由

ncmdumpGUI:免费解锁网易云音乐加密文件,3分钟实现跨设备播放自由 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样…...

奇门对接顺丰电子面单:从200行“祖传代码”到优雅重构的经验分享

一、背景:那年写下的“能跑就行” 在我们的电商WMS系统中,发货环节需要通过菜鸟奇门电子面单接口向顺丰等快递公司申请运单号。这段核心代码写于多年前,当时的业务需求比较简单:只支持淘宝/天猫订单,快递也只有顺丰。…...

Java 程序员第 24 阶段:多 Agent 高阶实战,复杂业务场景完整落地实现

在多 Agent 基础篇中,我们探讨了角色协同、任务拆分的基本模式。本文进一步深入,聚焦高阶架构设计、跨服务协作与复杂场景完整落地,帮助读者构建生产级别的多 Agent 系统。一、高阶架构:从简单协同到生产级系统1.1 三层架构模型成…...

乒乓球教程

【课程教程资料】乒乓球入门必看,全方位发球技巧教学 文件大小: 3.9GB内容特色: 3.9GB高清发球拆解,握拍站位旋转全囊括适用人群: 零基础球友、校园社团、陪练家长核心价值: 20课时速成稳定发球,直接提升实战得分率下载链接: https://pan.qu…...