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

Linux 进程控制(二) (进程等待wait/waitpid)

目录一、进程等待的重要性二、进程等待的三个问题1. 进程等待是什么?2. 为什么要有进程等待?3. 进程等待是怎么做的?三、先看僵尸进程现象四、wait概念讲解函数功能使用方法阻塞状态五、waitpid概念讲解函数功能使用方法退出码和推出信号waitpid第二个参数int* statuswaitpid等待指定的子进程waitpid等待多个子进程六、非阻塞轮询waitpid第三个参数options七、总结一、进程等待的重要性当子进程退出时若父进程未及时处理将导致僵尸进程的产生进而引发内存泄漏问题。僵尸进程是已经终止但未被回收的进程它们会持续占用系统资源。即使使用 kill -9命令也无法清除因为无法终止一个已经结束的进程。要解决僵尸进程问题父进程必须通过进程等待机制来回收子进程资源并获取子进程退出的状态信息。父进程需要获取子进程的执行状态包括任务是否正常完成、是否出现异常、执行结果是否正确以及错误产生的原因。二、进程等待的三个问题1. 进程等待是什么?进程等待是指父进程通过调用wait或waitpid系统函数实现对子进程的状态监控和资源回收。具体功能包括检测子进程是否已终止若终止则进入Z状态回收子进程资源获取子进程退出信息将子进程状态从Z状态僵尸状态转变为X状态死亡状态2. 为什么要有进程等待?进程等待主要解决两个关键问题处理僵尸进程僵尸进程无法被直接终止必须通过进程等待机制来回收资源避免内存泄漏这是必须解决的问题获取执行状态通过进程等待可以获取子进程的退出状态从而了解子进程的任务完成情况。这个功能可根据实际需求选择使用虽然某些场景下不需要关注子进程状态但为了满足多样化的使用需求操作系统必须提供该功能3. 进程等待是怎么做的?父进程通过调用wait()或waitpid()系统调用来回收子进程从而解决僵尸进程问题。三、先看僵尸进程现象我们通过 fork() 创建父子进程子进程循环3次打印信息后 exit(0) 终止父进程无限循环打印信息未回收子进程最终导致子进程成为僵尸进程。如下所示:僵尸进程产生的核心原因本质是 “子进程先于父进程退出但父进程未执行‘回收子进程资源’子进程退出时会保留少量核心信息如退出码、PID等待父进程通过 wait() / waitpid() 读取此时子进程进入僵尸态Z状态。代码中父进程进入无限 while(1) 循环完全未调用 wait() 或 waitpid() 无法读取子进程退出信息导致子进程残留的资源无法释放永久处于僵尸态直到父进程被手动终止。那么在这个过程中我们使用脚本去监控进程变为僵尸的状态脚本代码如下://脚本代码 while :; do ps ajx | head -1 ps ajx | grep mycommand | grep -v grep; sleep 1; echo -----------------------------; done运行结果:当子进程退出父进程不去等待子进程那么子进程就会变成僵尸进程造成内存泄漏那么我们应该如何解决呢那么就是父进程使用wait/waitpid去等待子进程下面我们先进行介绍wait在进行讲解上述wait之前我们还应该认识到一个事情当前子进程的pid是21926其ppid是21925这个21925就是父进程父进程的pid就是21925同时父进程的ppid是17474其中17474就是父进程的父进程那么我们grep过滤一下查看发现它就是bash即bash是当前父进程的父进程即在命令行中启动的进程是bash的子进程四、wait概念讲解在Linux系统手册第2节中可以查阅到关于wait和waitpid系统调用的详细说明。使用这两个系统调用时需要包含以下头文件#include sys/types.h #include sys/wait.h由于wait的参数status与waitpid功能相关我们将这两者共有的status参数放在waitpid部分统一讲解。wait函数的参数类型是一个int*类型指针实际使用时可以传入NULL值来调用wait等待进程。函数功能wait函数的主要功能是等待当前进程的任意子进程状态改变检测并等待进程进入僵尸(Z)状态获取进程退出信息并释放进程资源成功等待子进程退出时返回子进程的PID(始终大于0)可通过判断返回值是否大于0来确定等待是否成功对于单个子进程的情况可直接比较wait返回值与fork返回值是否相等(fork在父进程中返回子进程PID)若当前进程未创建任何子进程(即没有子进程可等待)wait将返回-1表示失败使用方法那么下面我们使用这个wait让父进程去等待子进程的退出代码中父进程通过 fork() 创建子进程子进程执行 RunChild() 父进程进入 else 分支先休眠4秒。同时子进程循环2次 cnt2 → 1 每秒打印PID/PPID/计数2秒后 exit(0) 终止此时父进程仍在休眠未回收子进程短暂成为僵尸进程。父进程在休眠4秒后调用 wait(NULL) 阻塞等待子进程成功回收后打印“等待成功”再休眠2秒最终父进程正常退出。0-2秒子进程每秒打印1次共2次之后子进程退出。2-4秒子进程已退出父进程仍在 sleep(4) 子进程处于僵尸态Z状态无任何打印。4秒时父进程 wait(NULL) 成功回收子进程打印“我是父进程...子进程的pid: xxx”。4-6秒父进程 sleep(2) 无打印6秒后父进程执行 return 0 退出程序结束。运行结果:我们可以观察到前2秒子进程和父进程都在运行然后过了两秒子进程退出由于父进程此时在休眠无暇等待子进程所以子进程此时会成为僵尸进程再过两秒父进程休眠完成此时等待子进程成功那么此时子进程的资源就被释放了子进程被回收父进程等待子进程完成后并且父进程被设置为休眠2秒所以此时会观察到只有父进程在运行的场景阻塞状态当子进程持续运行且父进程调用wait等待时父进程中的wait函数会持续检测子进程状态直到子进程退出为止。在此期间父进程将无法执行其他代码而是持续在系统调用wait中轮询检测以下信息子进程是否处于Z僵尸状态子进程是否已退出若子进程始终不退出wait调用将无法返回导致父进程进入阻塞状态无法继续执行后续代码。但是为解决此问题我们可以采用waitpid的非阻塞轮询机制来优化处理流程。那么为了演示父进程的阻塞状态我们可以将子进程执行的RunChild函数修改一下让它直接死循环打印当子进程调用它的时候就会一直死循环打印进程信息同时父进程就一直使用wait等待子进程退出即可运行结果:最终结果导致父进程陷入无限等待无法回收永远不会退出的子进程。此时父进程进入阻塞状态处于等待队列中。操作系统会将父进程从CPU运行队列中移除停止对其调度。父进程的PCB会被转移到子进程PCB的等待队列中等待子进程状态变化即子进程退出变为Zombie状态。由此可知进程阻塞不仅发生在等待硬件资源就绪时如scanf等待键盘输入也可能发生在等待软件资源就绪的情况下。这里的父进程就是在等待子进程状态变化即子进程退出变为Zombie状态这一软件资源就绪。五、waitpid概念讲解同样的我们可以通过man 2 waitpid命令查看相关手册使用时需要包含头文件#include sys/types.h #include sys/wait.h函数功能waitpid是wait的增强版它有三个参数第一个参数指定要等待的子进程PID传入-1表示等待任意子进程传入特定PID表示等待指定的子进程第二个参数是指针类型的输出参数用于获取子进程的退出信息。在演示中我们暂时传入NULL表示不获取退出信息后续会详细讲解如何获取。第三个参数控制等待方式传入0表示阻塞等待类似wait)传入WNOHANG表示非阻塞等待非阻塞等待结合循环可实现轮询机制最有意义的用法是在轮询时让父进程同时处理其他任务返回值说明成功等待子进程时返回子进程PID如果指定的PID不是当前进程的子进程则返回-1表示等待失败使用方法我们在父进程中使用waitpid等待子进程退出其中第一个参数传入-1表示等待当前父进程的任意一个子进程退出第二个参数传入NULL表示不想获取子进程的退出信息第三个参数传入0表示进行和wait进行一样的阻塞等待模式运行结果:为什么子进程的退出码为啥是512难道不应该是2吗?实则不然这是因为waitpid的第二个参数获取的status的原因其实waitpid的第二个参数status的设计大有用工waitpid函数的第二个参树status用于获取子进程的完整退出信息包括退出状态、退出码以及core dump标志关于core dump标志将在后续信号相关文章中详细讨论。子进程的退出场景可分为三种情况父进程主要关注两个关键信息子进程是否异常终止若正常终止执行结果是否正确通过退出码判断0表示成功非0表示失败不同数值对应不同错误原因由于需要通过一个整型变量status同时存储退出信号和退出码信息操作系统采用了位运算的方式巧妙利用32位整数的比特位布局。实际应用中我们主要关注前16个比特位当进程异常终止时退出信号为非零值表示异常类型此时不关心退出码对应比特位未被使用当进程正常终止时退出信号为0Linux系统中不存在0号信号故用0表示无异常通过退出码判断执行结果是否正确在linux的信号中我们使用kill -l查看之后发现linux的信号中根本没有0号信号所以使用0来表示进程没有收到退出信号即程序正常运行退出码和推出信号1. 产生主体不同退出码子进程自己通过 exit(n) 或 return n 主动设置是“自愿终止”时的“结果报告”。退出信号Linux内核或其他进程发送的信号如SIGSEGV、SIGKILL是“被迫终止”时的“死亡原因”。2. 含义与用途不同退出码仅表示“正常终止后的执行状态”0执行成功非0执行失败如1参数错、2文件不存在自定义含义。退出信号仅表示“异常终止的原因”每个信号对应一种错误如11段错误、9被强制杀死此时退出码无意义。3. 与status的关联不同用 WIFEXITED(status) 判断退出信号为1时才能用 WEXITSTATUS(status) 取退出码。用 WIFEXITED(status) 判断推出信号为0时才能用 WTERMSIG(status) 取退出信号。1. 异常终止退出信号非0对应具体异常原因退出码无意义进程被强制终止没机会设置。2. 正常终止退出信号为0表示无异常、自愿结束退出码有意义是子进程主动设置的执行结果。只要退出信号非0进程异常终止退出码就完全没意义只有进程通过 exit() / return 主动终止退出信号0退出码才是子进程预先设置的“执行结果报告”有实际含义。一旦退出信号非0比如被SIGSEGV信号打崩进程是“被动猝死”根本没机会执行 exit(n) 去设置退出码——此时status里“退出码对应的比特位”是随机无效值读出来也没有任何参考价值。waitpid第二个参数int* statusstatus的32个比特位的前16位的存储以及如何进行位运算提取对应的退出码和退出信号如下那么此时我们正确进行位运算提取status对应的退出信号和退出码即可运行结果:此时我们的退出信号和退出码就可以正常提取出来了其实操作系统提供了对应提取退出信号和退出码的宏函数来供我们使用通常来讲操作系统提供的WIFEXITED是用来提取status的退出信号的但是这个提取的退出信号会被转化为bool值因为如果出现了异常此时提取出来的退出信号是非0那么说明代码有极大可能是没有执行完子进程收到了退出信号即子进程就出现了异常错误退出码也就没有了意义如果没有出现异常此时提取出来的退出信号就为0此时退出码有意义于是就使用WEXITSTATUS提取status中的退出码于是我们的代码就可以转化成下面这样去进行使用运行结果:让我们思考一个问题当子进程退出时其内核数据结构task_structPCB中会保存退出信息包括退出信号exit_signal和退出码exit_code。那么为什么父进程必须通过wait等系统调用才能获取子进程的状态数据父进程能否直接访问内核空间读取子进程的task_struct数据答案是否定的原因如下进程独立性原则父子进程虽然共享代码和数据但当修改数据时会触发写时拷贝机制使得各自拥有私有副本。因此子进程修改的数据父进程无法直接获取。安全隔离机制操作系统不信任任何用户进程。父子进程的代码由用户编写如果允许父进程直接访问内核空间读取子进程数据就意味着用户可以随意修改内核数据结构这将导致系统混乱。因此必须通过操作系统提供的wait等系统调用来获取子进程数据。实际上父进程可以通过其他方式向子进程传递数据。例如在后续学习中我们会了解到父进程可以通过进程替换传递自定义环境变量给子进程。这些环境变量可以包含任意字符串内容子进程就能据此执行相应操作。waitpid等待指定的子进程waitpid的第一个参数传入子进程的pid就可以让父进程等待指定的子进程但是需要注意这个指定的子进程必须是当前进程的子进程如果是其它的进程那么waitpid将会等待子进程失败返回-1父进程是可以获取到子进程的pid传入waitpid的因为父进程fork创建子进程fork给父进程返回的就是子进程的pid运行结果:waitpid等待多个子进程如果当前进程使用for循环去创建多个子进程的时候我们该如何使用waitpid去进行多个子进程的等待呢那么我们也使用同样的for循环方式去让父进程进行N次等待即可这里的等待是阻塞等待当前进程的任意子进程那么在这个过程中我们将使用脚本去监控进程的状态脚本代码如下//脚本代码 while :; do ps ajx | head -1 ps ajx | grep mycommand | grep -v grep; sleep 1; echo -----------------------------; done运行结果:如上我们就可以同时创建出来的多个子进程并且对这多个子进程进行等待回收这里需要注意由于子进程执行后父进程一直在等待子进程所以子进程在退出的瞬间就会被父进程等待成功进行回收所以这里我们看不到子进程的进入僵尸状态当然如果想观察到子进程的僵尸状态那么可以在两个for循环之间让父进程休眠比单个子进程的休眠时间长即可这样子进程打印休眠结束此时父进程还在休眠无暇等待子进程此时子进程的僵尸状态就可以被我们检测到上面的代码只是演示了如何创建和等待多个子进程,下面我们在此基础上继续演示让多个子进程执行不同的任务,执行完之后父进程进行回收:第8行typedef void (*callback_t)();的意思是定义一个新的类型别名 callback_t用来表示“指向无参、无返回值函数的指针”。拆解一下void (*)() 这是一个函数指针类型表示“指向一个不接收参数、返回值为 void 的函数”。typedef ... callback_t 把这个复杂的类型起一个别名叫做 callback_t 。所以callback_t 就代表“一类函数指针”只要是无参数和返回值是 void 的函数都可以用这个类型来表示第9行的枚举表示定义一组有名字的整型常量用来表示程序的不同退出状态。用 return OK; 比 return 0; 更清楚地表达“程序正常退出”的意图用 exit(USAGE_ERR); 比 exit(1); 更明确地表示“参数使用错误”。需要注意的是枚举默认规则编译器自动赋值枚举里不写数字时编译器自动从 0 开始依次 1第32行CreateChildProcess 函数的作用是根据传入的子进程数量通过 fork 循环创建出多个子进程每个子进程会从任务数组中拿到属于自己的任务并执行执行完就退出而父进程只负责把所有子进程的 PID 记录下来第47行WaitAllChild 函数则是让父进程遍历之前记录的所有子进程 PID通过 waitpid 逐个阻塞等待子进程退出并完成回收同时打印出每个子进程的退出码避免产生僵尸进程。主函数先检查命令行参数是否正确必须传入一个表示进程数量的数字(这里创建的子进程的数量是3)不满足就提示用法并退出接着定义好保存子进程PID的容器和存放任务的函数指针数组提前给每个子进程分配好要执行的Task或Hello任务然后调用创建子进程的函数按指定数量创建子进程并让它们分别执行对应任务最后调用等待子进程的函数让父进程统一等待并回收所有子进程程序正常结束。Task 和 Hello 是两个功能结构完全一样、只是打印内容不同的任务函数它们都会循环5次每秒打印一条信息分别标明当前是哪个子进程在执行 Task 还是 Hello 任务、进程ID、父进程ID以及剩余次数执行完5次后子进程就正常退出。运行结果:从运行结果可以看出父进程PID 993444创建了3个子进程严格按照任务表执行PID 993445和993447执行【Task】PID 993446执行【Hello】三个子进程并发执行交替打印输出说明它们是并发运行的操作系统在调度执行。所有子进程的父进程IDppid都是993444形成了“一父三子”的进程树结构。每个子进程都循环执行了5次任务cnt 从4递减到0符合Task() 和Hello() 的逻辑。所有子进程执行完毕后正常退出退出码为0父进程成功回收无僵尸进程。六、非阻塞轮询waitpid第三个参数optionswaitpid函数的第三个参数options用于指定阻塞方式。当传入0时waitpid会像wait一样让父进程执行阻塞等待。此外还可以传入WNOHANG参数实现非阻塞等待。关于waitpid的返回值成功等待子进程时会返回子进程的PID0如果等待的不是当前进程的子进程则返回-10在非阻塞模式下若子进程状态未改变会返回0在阻塞模式下参数为0或使用wait父进程会一直等待直到子进程状态改变期间会被操作系统置为阻塞状态。而在非阻塞模式下参数为WNOHANG如果子进程状态未改变waitpid会立即返回0允许父进程通过循环实现非阻塞轮询并执行其他任务。需要注意的是在等待间隙执行的任务不宜过重如大文件拷贝应以轻量级任务为主如状态检测或日志打印。我们可以将这些任务封装到函数指针数组中并通过管理函数进行增删查改操作。下面我们通过代码演示一下:运行结果:于是我们就可以观察到我们的父进程一边检测子进程一边做自己的事情即父进程创建子进程实现了非阻塞轮询自己的事情当子进程退出的时候此时waitpid返回等待的子进程的pidid接收waitpid的返回值id 0父进程判断子进程是否出现异常以及结果是否正确并且还可以扩展一下我们在命令行中执行的命令程序这个命令程序就是bash通过fork创建的子进程那么bash就会对这个命令进行阻塞等待并且对于我们执行的其它命令不响应运行结果:在这个运行过程中bash会阻塞等待它的子进程对于用户执行的其它命名将不会响应小编尝试执行诸如lspwd命令都无效即bash对我们的命令不响应当我们想要退出的时候按下ctrl c即可终止退出进程fork了一个子进程,父子谁先运行?不确定,调度器说了算一般父子进程,谁先退出?子进程先退出,然后父进程负责进行资源回收七、总结本文详细讲解了Linux系统中进程等待的重要性与实现方式。主要内容包括进程等待的必要性子进程退出时若未被回收会形成僵尸进程导致内存泄漏父进程必须通过wait/waitpid获取子进程退出状态和资源回收进程等待的实现机制wait函数阻塞等待任意子进程退出waitpid函数更灵活的等待方式可指定子进程PID和等待模式通过status参数获取子进程退出状态正常/异常终止及退出码实际应用场景单子进程和多子进程的回收处理阻塞与非阻塞等待方式的区别父进程在等待期间执行其他任务的轮询机制核心原理操作系统通过位运算在status中编码退出信息进程独立性原则要求必须通过系统调用获取子进程数据父进程对子进程的资源回收责任文章通过代码示例展示了僵尸进程的产生与回收过程以及如何正确使用wait/waitpid系统调用来避免内存泄漏。感谢大家的观看!

相关文章:

Linux 进程控制(二) (进程等待wait/waitpid)

目录 一、进程等待的重要性 二、进程等待的三个问题 1. 进程等待是什么? 2. 为什么要有进程等待? 3. 进程等待是怎么做的? 三、先看僵尸进程现象 四、wait 概念讲解 函数功能 使用方法 阻塞状态 五、waitpid 概念讲解 函数功能 使用方法 退出码和推出信号 …...

操作HTML网页

操作HTML使用工具&#xff0c;pycharm&#xff0c;新建一个HTML一、HTML网页的介绍简单HTML网页框架可以在右上角浏览器中实现二、常用标签1.标题标签<h1>标题<h1>这里使用的<!--注释内容-> <!-->不仅可以写注释还可以注释代码&#xff0c;想要注释掉的…...

M2LOrder情感分析效果展示:电商商品评价情感极性+细粒度情绪叠加分析

M2LOrder情感分析效果展示&#xff1a;电商商品评价情感极性细粒度情绪叠加分析 1. 引言&#xff1a;当AI学会读懂人心 你有没有遇到过这样的情况&#xff1f;看着电商平台上密密麻麻的商品评价&#xff0c;想要快速了解用户反馈却无从下手。好评、差评、中评混杂在一起&…...

SOONet效果展示:MAD/Ego4D SOTA精度实测——‘a man takes food out of the refrigerator’精准定位截图

SOONet效果展示&#xff1a;MAD/Ego4D SOTA精度实测——‘a man takes food out of the refrigerator’精准定位截图 1. 引言&#xff1a;当AI学会“看视频找片段” 想象一下&#xff0c;你有一段长达一小时的监控录像&#xff0c;需要快速找到“一个人从冰箱里取出食物”这个…...

AudioSeal Pixel Studio惊艳效果:AI语音克隆攻击样本中精准定位原始水印位置

AudioSeal Pixel Studio惊艳效果&#xff1a;AI语音克隆攻击样本中精准定位原始水印位置 1. 专业级音频水印技术解析 AudioSeal Pixel Studio 是一款基于Meta开源的AudioSeal算法构建的音频保护与检测工具。这款工具能够在几乎不影响音质的情况下&#xff0c;为音频文件嵌入隐…...

BAAI/bge-m3镜像部署全流程:从启动到HTTP调用详细步骤

BAAI/bge-m3镜像部署全流程&#xff1a;从启动到HTTP调用详细步骤 1. 项目简介 BAAI/bge-m3是一个强大的多语言语义相似度分析引擎&#xff0c;基于北京智源人工智能研究院的开源模型构建。这个模型是目前开源领域最先进的语义嵌入模型之一&#xff0c;在多语言文本理解、长文…...

文件IO操作详解

这篇文章我将总结关于文件IO的一些概念的东西和关于文件IO类的使用1.认识路径2.文件类型3.文件系统操作4.文件内容操作认识路径路径也是一个目录结构&#xff0c;是一颗目录树&#xff08;N叉搜索树&#xff09;~~~绝对路径&#xff1a;E:\JavaCode\文件IO我们在文件夹中&#…...

Phi-4-reasoning-vision-15B多场景落地:从办公文档处理到工业质检界面分析

Phi-4-reasoning-vision-15B多场景落地&#xff1a;从办公文档处理到工业质检界面分析 1. 引言&#xff1a;当AI学会“看图说话”与“看图思考” 想象一下&#xff0c;你手头有一份复杂的财务报表PDF&#xff0c;里面全是密密麻麻的数字和图表&#xff0c;你需要快速提取关键…...

GEO优化源码系统能做什么?五大核心功能模块及其应用场景详解

温馨提示&#xff1a;文末有资源获取方式AI新时代&#xff0c;流量入口已发生结构性迁移。当潜在客户在DeepSeek、豆包等AI中询问“哪个品牌更好”时&#xff0c;GEO&#xff08;生成引擎优化&#xff09; 就是让你的企业品牌和产品出现在AI结果中的唯一路径。市面上的GEO软件动…...

cv_unet_image-colorization精彩案例:抗战史料黑白照片智能上色成果

cv_unet_image-colorization精彩案例&#xff1a;抗战史料黑白照片智能上色成果 1. 项目简介与核心价值 黑白照片承载着历史的重量&#xff0c;但色彩的缺失也让许多珍贵的瞬间显得遥远而模糊。想象一下&#xff0c;你手中有一张祖辈在抗战时期的合影&#xff0c;照片中的人物…...

Zerobrew garbage collect深度解析:释放磁盘空间的高效方法

Zerobrew garbage collect深度解析&#xff1a;释放磁盘空间的高效方法 【免费下载链接】zerobrew A drop-in, 5-20x faster, Rust-based experimental Homebrew alternative 项目地址: https://gitcode.com/gh_mirrors/ze/zerobrew Zerobrew作为一款基于Rust开发的Home…...

nlp_gte_sentence-embedding_chinese-large实战教程:余弦相似度阈值调优与业务适配

nlp_gte_sentence-embedding_chinese-large实战教程&#xff1a;余弦相似度阈值调优与业务适配 你是不是遇到过这样的问题&#xff1f;用文本向量模型做语义搜索&#xff0c;明明感觉两段话意思差不多&#xff0c;但模型给的相似度分数就是不高&#xff0c;导致该搜到的没搜到…...

Chord高清视频理解案例:1080P视频边界框定位精度实测报告

Chord高清视频理解案例&#xff1a;1080P视频边界框定位精度实测报告 1. 引言&#xff1a;当AI学会“看”视频 想象一下&#xff0c;你有一段30秒的短视频&#xff0c;里面有一只猫从沙发跳到茶几上。现在&#xff0c;你需要知道&#xff1a; 这只猫在视频的哪几秒出现了&am…...

Realistic Vision V5.1部署案例:Windows/Linux双平台Streamlit界面配置详解

Realistic Vision V5.1部署案例&#xff1a;Windows/Linux双平台Streamlit界面配置详解 想在自己的电脑上体验专业级的写实人像摄影&#xff0c;但又觉得本地部署AI模型太复杂&#xff1f;今天&#xff0c;我们就来手把手教你&#xff0c;如何在Windows和Linux系统上&#xff…...

RexUniNLU真实作品:某银行季度财报摘要的自动事件抽取与风险点标注

RexUniNLU真实作品&#xff1a;某银行季度财报摘要的自动事件抽取与风险点标注 1. 引言&#xff1a;当财报分析遇上AI 想象一下&#xff0c;你是一家投资机构的研究员&#xff0c;每天需要阅读几十份、上百页的上市公司财报。你的任务是快速从中找出关键事件&#xff1a;利润…...

Bidili Generator入门必看:SDXL 1.0底座与LoRA权重协同原理

Bidili Generator入门必看&#xff1a;SDXL 1.0底座与LoRA权重协同原理 你是不是也遇到过这样的问题&#xff1a;好不容易找到一个喜欢的AI绘画风格模型&#xff08;LoRA&#xff09;&#xff0c;兴冲冲地下载下来&#xff0c;结果发现它和你的SDXL大模型“水土不服”&#xf…...

工业组态 × 数据大屏 × ThingsBoard:SceneV 数据大屏可视化

用 Meta2D 打造工业级数据大屏&#xff1a;SceneV 今天要为大家介绍一个基于 Meta2D 框架构建的开源前端可视化项目——SceneV&#xff0c;它是一个功能强大、高度可定制的低代码/无代码数据大屏设计器&#xff0c;特别适合与 ThingsBoard 物联网平台对接&#xff0c;实现工业…...

开源轻量影像工具:Jimeng AI Studio (Z-Image Edition)镜像免配置部署指南

开源轻量影像工具&#xff1a;Jimeng AI Studio (Z-Image Edition)镜像免配置部署指南 想快速上手一个功能强大、界面清爽的AI绘画工具&#xff0c;但又不想折腾复杂的模型下载和环境配置&#xff1f;今天要介绍的Jimeng AI Studio (Z-Image Edition)镜像&#xff0c;或许就是…...

Janus-Pro-7B快速上手:无需GPU环境也能跑通的开源多模态模型

Janus-Pro-7B快速上手&#xff1a;无需GPU环境也能跑通的开源多模态模型 1. 开篇&#xff1a;认识这个强大的多模态模型 如果你正在寻找一个既能看懂图片又能生成内容的多模态AI模型&#xff0c;而且希望不需要昂贵的GPU就能运行&#xff0c;那么Janus-Pro-7B绝对值得你关注。…...

java里内存、GC、性能调优的常用方法

内存调优&#xff1a; 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这 个对象就不会被垃圾回收器回收&#xff0c;这种情况就称之为内存泄漏。 常见的GC ROOT 线程栈里的局…...

PYSKL未来路线图:探索骨架动作识别的终极功能与创新算法

PYSKL未来路线图&#xff1a;探索骨架动作识别的终极功能与创新算法 【免费下载链接】pyskl A toolbox for skeleton-based action recognition. 项目地址: https://gitcode.com/gh_mirrors/py/pyskl PYSKL作为一款专注于骨架动作识别的工具库&#xff0c;正不断进化以满…...

Android开发者必备:cube-sdk高级特性与性能优化指南

Android开发者必备&#xff1a;cube-sdk高级特性与性能优化指南 【免费下载链接】cube-sdk A light package for Android development, it handles loading image and network request. 项目地址: https://gitcode.com/gh_mirrors/cu/cube-sdk cube-sdk是一款轻量级Andr…...

10个实用Skylark内置函数:提升你的配置脚本效率

10个实用Skylark内置函数&#xff1a;提升你的配置脚本效率 【免费下载链接】skylark Skylark in Go: the Skylark configuration language, implemented in Go [MOVED to go.starlark.net] 项目地址: https://gitcode.com/gh_mirrors/sk/skylark Skylark是一种高效的配…...

Alipay Easy SDK安全机制详解:自动加签验签与证书管理最佳实践

Alipay Easy SDK安全机制详解&#xff1a;自动加签验签与证书管理最佳实践 【免费下载链接】alipay-easysdk Alipay Easy SDK for multi-language(java、c#、php、ts etc.) allows you to enjoy a minimalist programming experience and quickly access the various high-freq…...

claude-code-best-practice版本控制:管理AI辅助开发项目的完整指南

claude-code-best-practice版本控制&#xff1a;管理AI辅助开发项目的完整指南 【免费下载链接】claude-code-best-practice practice made claude perfect 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-best-practice claude-code-best-practice是一…...

Crinkler核心功能解析:上下文建模压缩如何实现极致压缩比

Crinkler核心功能解析&#xff1a;上下文建模压缩如何实现极致压缩比 【免费下载链接】Crinkler Crinkler is an executable file compressor (or rather, a compressing linker) for compressing small 32-bit Windows demoscene executables. As of 2020, it is the most wid…...

PyQt-SiliconUI开源社区指南:贡献代码与获取支持的完整路径

PyQt-SiliconUI开源社区指南&#xff1a;贡献代码与获取支持的完整路径 【免费下载链接】PyQt-SiliconUI A powerful and artistic UI library based on PyQt5 / PySide6&#xff0c;基于PyQt5 / PySide6的UI框架&#xff0c;灵动、优雅而轻便 项目地址: https://gitcode.com…...

从0到1:用Topit提升Mac生产力的10个实用场景

从0到1&#xff1a;用Topit提升Mac生产力的10个实用场景 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit Topit是一款专为Mac用户设计的窗口置顶工具&#xff0c…...

【MySQL】事务:ACID 特性

原子性&#xff08;atomicity&#xff09;&#xff1a;原子性是指事务是一个不可分割的工作单位&#xff0c;要么全部提交&#xff0c;要么全部失败回滚。即要么转账成功&#xff0c;要么转账失败&#xff0c;是不存在中间的状态。如果无法保证原子性会怎么样?就会出现数据不一…...

从gh_mirrors/aw/awesome-quincy-larson-emails看编程教育趋势:Quincy Larson的每周洞察

从gh_mirrors/aw/awesome-quincy-larson-emails看编程教育趋势&#xff1a;Quincy Larson的每周洞察 【免费下载链接】awesome-quincy-larson-emails This repository is an archive of emails that are sent by the awesome Quincy Larson every week. 项目地址: https://gi…...