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

Linux 进程控制

文章目录

  • 1. 进程创建
    • 1.1 fork
    • 1.2 写时拷贝
  • 2.进程终止
    • 2.1 退出码
    • 2.2 进程如何返回退出码
  • 3. 进程等待
    • 3.1 wait
      • 3.1.1 阻塞等待
      • 3.1.2 退出码与退出信号
    • 3.2 waitpid

1. 进程创建

1.1 fork

我们可以使用fork函数来创建子进程,创建子进程后,父子进程之间就是两个执行流,可以分别完成不同的任务,也可以完成一个任务的不同模块。

1.2 写时拷贝

fork创建的子进程和父进程之间,数据和代码是共享的,但如果子进程要进行写入,就要发生写时拷贝。现在,我们来具体讲一讲子进程的写时拷贝。

子进程进行写入时,无法对虚拟地址空间写入,所以会由操作系统通过页表查找映射关系,如果不存在相应的映射关系,即出现错误,会由操作系统终止该进程;如果存在相应的映射关系,就会发生写时拷贝。

实质上,对于父进程中一个可读可写的数据而言,一旦创建子进程后,操作系统会将这个数据的权限更改为只读,此时一旦有任意一方(父进程或子进程)要对这个数据进行写入,就会发生写时拷贝,父进程和子进程发生数据分离,此时这个数据的权限又会变为可读可写。

在这里插入图片描述
现在,我们来思考一个问题:

为什么创建子进程后,不立刻进行数据分离呢?因为创建子进程后,父进程或子进程不一定会对数据修改,此时共享数据即可,没有另开内存空间的必要;而进行数据修改时,有需要,再开额外的内存空间。这种做法提高了内存内存空间的使用率,是一种惰性申请。

2.进程终止

什么是进程终止?进程创建时,由操作系统在内存中申请相关的资源;进程终止时,由操作系统释放内存中相关的资源。

那么,我们再来思考一个问题:一个进程终止,会有几种情况?

进程,本质上是为了完成相应任务而创建的,在此基础上,我们可以对进程终止时的情况作出分类:

  • 进程正常运行完,执行结果正确
  • 进程正常运行完,执行结果错误
  • 进程未正常运行完,异常终止

PS:我们在进程终止这个章节中,主要了解进程正常运行完的两种情况,关于进程异常终止的情况,我们在进程等待章节中会做介绍。

2.1 退出码

什么是退出码?我们可以回忆一下,main函数中最后的return 0以及曾经用过的exit(0)函数中的数字0,这些数字就是退出码。简而言之,退出码是用来标记一个进程退出时,结果是否正确的一个数字。退出码为0,表示任务执行成功;退出码为非0,表示任务执行失败或错误。

为什么要有退出码呢?父进程创建了子进程,此时,子进程任务执行结束,父进程要不要知道子进程任务完成的情况呢?毫无疑问,肯定是需要的。那父进程又怎样了解其子进程的任务完成情况呢?通过子进程的退出码。

所以,子进程的退出码最终会交给父进程,子进程task_struct结构内部有相应的变量存储退出码,父进程中也有相应的变量用以存储其子进程的退出码。

在Linux中,我们可以使用echo $?这个命令,来查看最近一个执行完的进程的退出码。

在这里插入图片描述
在这里插入图片描述
将退出码改为1,继续查看。
在这里插入图片描述
此时,所查看到的退出码就变为1了。

在Linux中,对于一部分非0的退出码有相应的定义,即不同的退出码,会表示不同的任务执行失败的原因,我们可以使用strerror这个函数来查看。strerror这个函数,形参给相应的退出码,会返回对应这个退出码的一个字符串。

在这里插入图片描述
在这里插入图片描述
看到上图中错误码2对应的错误信息,我们会想到,平时使用ls命令时,如果想要列出不存在的目录或文件,就会出现这样的信息。显然,这本质上就是该命令所对应进程的错误码,以字符串形式显示出的结果。

在这里插入图片描述
错误码2对应的恰好就是:No such file or directory

2.2 进程如何返回退出码

我们介绍三种进程返回退出码的方式。

  • main函数中return返回退出码
  • exit返回退出码:exit函数是C语言库中提供的一个函数调用,exit的形参即为相应的退出码。
  • _exit()返回退出码:注意区分_exit与exit,前者是操作系统提供的调用接口,后者是C语言提供的函数。_exit()与exit()用法相同。

接着,我们对这三种进程返回退出码的方式做一个区分。

return 和 exit 有何区别?

return 实质上表示的是函数调用结束,用来返回函数的返回值,所以,对于普通函数而言,return就是普通函数的返回;但对于main函数而言,return 就表示进程结束并返回相应退出码。

exit,本身就是一个用于进程退出,返回退出码的一个函数,所以无论使用在哪个地方,都能使进程退出。

因此,我们可以这样理解,exit 等同于main函数中的return。

exit和_exit有何区别?
这两个函数,在结束进程,返回相应退出码上没有什么区别。最大的区别在于, exit 函数退出进程时,会刷新输出缓冲区,而 _exit 这个系统调用并不会刷新输出缓冲区。

以下代码运行结果可作为依据:
在这里插入图片描述
在这里插入图片描述
没有任何结果,因为hello C++ 是被写入到输出缓冲区中,而_exit退出进程时,不刷新输出缓冲区,因此没有任何显示。

再来看exit.

在这里插入图片描述
在这里插入图片描述
此时有输出结果,说明输出缓冲区被刷新。
同时,上文提及 exit() 等同于main函数中的return,因此main函数中的 return 也会刷新输出缓冲区。

3. 进程等待

什么是进程等待呢?
进程等待,指的是父进程等待子进程结束,接收子进程的退出信息,并由操作系统释放子进程相关资源的过程。

进程等待有其存在的必要性。父进程一般情况下,都要去接收子进程的退出信息,但这一点并不是任何情况下都需要的;可子进程结束后,相应资源要进行释放,这却是必须的——因此,父进程必须要进行进程等待,否则子进程会变成僵尸进程,不会接收任何信号,无法被杀死,因而相关资源就无法被操作系统释放,这就导致了内存泄漏。

那么,我们改如何进行进程等待呢?以下介绍两种常用的进程等待方式。

3.1 wait

wait:是Linux中提供的系统调用接口,用于进程等待,且等待的是任意一个子进程,即哪个子进程先结束,就处理哪个子进程。---int wait(int* status)

我们暂且先不管wait的形参到底是什么意思,反正是一个指针,我们先传一个空指针,然后用wait来解决子进程的僵尸问题。

在这里插入图片描述

在上述代码中,父进程在子进程结束后约5s左右才会调用wait,因此在这5s期间,子进程会进入僵尸状态。而当父进程成功调用wait后,子进程就会解除僵尸状态,进入死亡,由操作系统释放相关资源。

在这里插入图片描述
在这里插入图片描述
我们可以看到,通过进程等待,成功解决了僵尸进程的问题。

接下来,我们来介绍wait相关的另外两个知识点。

3.1.1 阻塞等待

其一, wait进程等待是阻塞等待,也就是说父进程执行到wait之后,如果子进程没有结束,会卡住,即一直等待子进程结束后,再继续往下执行。我们可以来看下面的代码示例:

在这里插入图片描述
在这里插入图片描述
可以看到父进程在wait处卡住了,即阻塞等待,一直等到子进程推出后,才继续往下执行,输出waiting success。

3.1.2 退出码与退出信号

另外我们要讲的一点是关于wait的形参status和返回值。

wait的返回值有两个,如果等待成功,就返回子进程的pid;如果等待失败,等待失败是指等待一个不属于父进程或根本不存在的进程,实质上就是去等待一个不在父进程所管理的子进程链表中的进程(wait本质上就是到子进程链表中去循环检测有没有一个子进程退出了),此时就返回-1。

那么status又是什么东西?首先,我们要知道,传一个指针进去,是为了从wait中获取某些值,即status本质上是一个输出型参数。那么,wait这个系统调用,想给我们传递什么值呢?

我们可能会想到,父进程等待子进程,会需要子进程的退出码,所以status会记录子进程的退出码。但实际上,status不仅仅会记录退出码,它还会记录退出信号。

那退出信号又是什么呢?
前面我们讲过,一个子进程结束,可能有三种情况:正常退出,结果正确;正常退出,结果错误;异常退出(没有退出码)。

而我们现在有退出码来表示结果的错误与否,显然,我们还需要一个东西来表示是异常退出还是正常退出,这个东西就是退出信号。

我们可以使用kill -l命令,来查看Linux中的不同信号。

一个进程会异常退出,肯定是因为该进程进行了某些非法操作,因此被操作系统使用信号杀死,此时该进程的退出信号就记录了该进程是因为进行了什么非法操作而被操作系统终止的。

既然,int* status指向一个整型,而这个整型变量既表示退出码,又表示退出信息,这怎么做到呢?
Linux中,是这样处理的。一个整型变量有32位,高16位不用,用低16位。而低16位中的,高八位用以记录退出码信息,低八位中的最高位用以存储core dump(此处暂不做介绍),剩余的7位则用以存储退出信号。

我们来看代码示例:

在这里插入图片描述
上述代码写的是子进程正常退出,并且退出码为100的情况。我们来看执行结果:
在这里插入图片描述
status确实记录了退出码和退出信号两种信息,其中退出信号为0时,即表示正常退出。

接下来,我们再来看一个异常退出的情况。

在这里插入图片描述
在这里插入图片描述

此时,退出信号就为8,那么这表示什么非法操作呢?表示的是浮点数处理错误,既float process error。

在这里插入图片描述
但是,我们发现,每次通过status拿出退出码和退出信号,都要我们自己进行额外的位操作,这太麻烦了,因此我们可以用提供好的宏进行简化。
WIFEXITED这个宏可用于处理status,获取退出码;WEXITSTATUS这个宏可用于处理status,得到进程是否正常退出,0表示异常退出,1表示正常退出。这两个宏函数本质上也是在进行我们之前代码中所用的位操作,并不是什么高深的东西。

3.2 waitpid

waitpid也是一个用于进程等待的系统调用接口,不过waitpid与wait有一些区别。
waitpid:int waitpid(pid_t pid,int* status,int options)
我们可以看到,相比于wait,waitpid多了两个参数,一个是pid,另一个是options。

pid:这个参数用于指定子进程的pid,也就是说,waitpid可以进行特定子进程的等待。如果这个值给-1,那么就与wait相同,进行任意子进程的等待。

options:这个参数用于选择waitpid是阻塞等待,还是非阻塞等待。前面讲过,wait是默认阻塞等待,而waitpid可以进行选择——如果这个参数为0,则表示阻塞等待;如果参数为宏WNOHANG,那么就表示非阻塞等待。

那么,什么叫非阻塞等待呢?
非阻塞等待,也就是说在waitpid调用时,去查看子进程是否退出,如论子进程是否退出,waitpid都会返回——当子进程还在执行时,waitpid返回0;当子进程退出时,waitpid返回相应子进程的pid(当然,如果waitpid失败,失败原因与wait相同,则返回-1)。

由于非阻塞等待中,一次waitpid调用,只会等待一次,因此若使用非阻塞等待,需要将其放入一个循环中,不断重复waitpid调用,进行等待,即非阻塞轮询等待。

非阻塞轮询等待有什么好处呢?阻塞等待时,父进程需要等待子进程退出,才能继续执行后面的代码;而非阻塞轮询等待中,当一次调用waitpid,发现子进程未结束后,可以不用立刻再次调用waitpid,而是经过一段时间后再调用,而在这段时间内,父进程就可以去执行其它功能,这样就大大提高了进行运行的效率。

我们来看下面这个非阻塞轮询等待的示例代码:

在这里插入图片描述
在这里插入图片描述
此时,这种非阻塞轮询等待,最终输出的结果如下所示:
在这里插入图片描述
显然,此时的父进程非阻塞等待,在前后两次的waitpid调用之间,完成了两次打印工作。

相关文章:

Linux 进程控制

文章目录 1. 进程创建1.1 fork1.2 写时拷贝 2.进程终止2.1 退出码2.2 进程如何返回退出码 3. 进程等待3.1 wait3.1.1 阻塞等待3.1.2 退出码与退出信号 3.2 waitpid 1. 进程创建 1.1 fork 我们可以使用fork函数来创建子进程,创建子进程后,父子进程之间就…...

使用MobaXterm远程登录Ubuntu系统:SSH服务配置教程

一、MobaXterm介绍 MobaXterm官网:https://mobaxterm.mobatek.net/ MobaXterm类似于Xshell,是一个工具箱,功能比Xshell多。 直接去官网下载安装就可以,本文主要介绍开启Ubuntu的ssh服务,并通过MobaXterm实现远程登录…...

直线模组精度测试的标准是什么?

直线模组的精度测试是确保其性能和稳定性的重要环节。那么,大家知道直线模组精度测试的标准是什么吗? 1、定位精度:以最大行程为基准长度,用从基准位置开始实际移动的距离与指令值之间的最大误差的绝对值来表示。一般来说&#xf…...

RK3568 Debian调试记录

文章目录 1、环境介绍2、前言3、debian目录结构3.1、脚本调用顺序 4、编译debian4.1、构建debian编译所需的环境4.2、编译debian4.3、打包 5、系统启动6、debian适配6.1、新增板级配置单6.2、USB6.3、Wi-Fi / BT6.4、屏幕旋转6.5、触摸旋转6.6、时钟 7、测试8、总结 1、环境介绍…...

来自 Bisheng 关于微调的内容总结

来自 Bisheng 关于微调的内容总结 0. 引言1. 关于微调的总结 0. 引言 这篇文章的内容(主要是截图)是来自 Bisheng 关于微调的内容总结,内容来源于 B 站Up主七吟覃_BISHENG负责人的视频,感兴趣的可以观看原视频。 1. 关于微调的总…...

Git 工具的安装

目录 Git 工具介绍 Git 工具安装 创建本地仓库 配置本地仓库 Git 版本控制基本原理 本期开始,我们将学习如何使用 Git 工具,实现多版本控制。 Git 工具介绍 要了解 Git 工具我们得先了解版本控制器的概念。 有这样一个场景,如下图所…...

任务管理系统,Java+Vue,含源码与文档,科学规划任务节点,全程督办保障项目落地提效

前言: 在当今快节奏的工作环境中,高效的任务管理是确保项目按时完成、资源合理分配及团队协作顺畅的关键。任务管理系统作为提升工作效率的重要工具,通过数字化手段帮助用户组织、跟踪和完成各类任务。本文将详细阐述任务管理系统的五大核心…...

JavaScript基础知识合集笔记1——数据类型

文章目录 JavaScript中的数据类型基本数据类型引用类型存储区别 JavaScript中的数据类型 基本数据类型和复杂类型 基本数据类型 基础类型包含六种:Number、Bigint、String、Boolean、Undefined、null、symbol Number(特殊值NaN,意为“不是数值”) c…...

2025.04.26-美团春招笔试题-第四题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 图像智能降维处理 问题描述 卢小姐是一家图像处理公司的算法工程师,她正在开发一种高效的图像压缩算法。该算法基于奇异值分解(SVD)技术,通过保留图像矩阵中最重要的特征,在…...

测试基础笔记第十三天

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、流程控制语句-判断语句1.判断语句2.逻辑运算符3.elif多重判断4.if的嵌套5.if与逻辑运算符结合1.and2.or3.not 设计测试用例二、流程控制语句-循环语句1.while语…...

【昇腾】PaddleOCR转om推理

文章目录 1. 使用Paddle框架推理1.1 安装1.2 推理 2. paddle 转 ONNX3. 转om4. Ais_bench 命令推理5. Ais_bench 编写推理代码 概要: PyTorch官方提供了昇腾插件包,安装后虽然可以支持PytorchOCR和PaddlePaddle的推理任务,但性能通常低于GPU。…...

【数据融合】基于拓展卡尔曼滤波实现雷达与红外的异步融合附matlab代码

一、问题分析与技术难点 1. 传感器特性对比 传感器测量维度优势局限性噪声模型雷达距离 $ r $、方位角 $ \theta $、速度 $ v $测距精度高、全天候工作角度分辨率低、易受多径干扰高斯噪声,协方差矩阵 $ R_r \text{diag}(\sigma_r^2, \sigma_\theta^2, \sigma_v^…...

第一部分:网页的骨架 —— HTML

这目录 前言1. 初识 HTML:搭建地基和框架1.1 小例子: 创建一个最简单的 HTML 页面,包含 "Hello World"。1.2 练习 2. 常用文本与内容标签:填充墙体和房间2.1 小例子: 创建一个包含个人简介(使用标…...

RTMP 协议解析 1

介绍 📖 什么是 RTMP? RTMP协议(Real-Time Messaging Protocol,实时消息传输协议)是由Adobe公司(最初由Macromedia开发)设计的一种用于实时传输音频、视频和数据流的网络协议,主要…...

c++初始化数组

1.前言 话说数组是n年前的事了,我为啥现在又提到它呢?因为很多人不会初始化数组,所以今天我来教教大家 2.初始化数组 初始化数组就是定义数组,就像这样 int a[5]{0}; 这样是a[0]到a[5]全都等于0 如果要输出这个数组&#xf…...

支持Win和Mac的批量图片压缩方法

软件介绍 如果你的图片太大,传输或上传总是卡壳,那就需要一款好用的图片压缩工具了。今天推荐的这款工具支持Windows和Mac双系统,简直是图片压缩界的"变形金刚"! 图压(图片压缩双系统版) …...

autodl(linux)环境下载git-lfs等工具及使用

一、git-lfs工具下载 #初始化git.lfs命令 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs git lfs install 二、 huggingface-cli工具下载及使用 Linux设置huggingface的镜像: ex…...

云原生--核心组件-容器篇-3-Docker核心之-镜像

1、定义与作用 定义: Docker镜像是一个只读的模板,包含运行应用程序所需的所有内容,包括代码、依赖库、环境变量、配置文件等。简单来说,Docker镜像是一个轻量级、独立、可执行的软件包,它包含了运行某个软件所需的所有…...

Dify与n8n深度对比:AI应用开发与自动化工作流的双轨选择

Dify与n8n深度对比:AI应用开发与自动化工作流的双轨选择 在数字化转型加速的2025年,Dify和n8n作为两大主流工具,分别代表了AI应用开发与自动化工作流领域的顶尖解决方案。本文将从核心定位、功能特性、使用场景等维度展开对比,为…...

AI算法优化建筑形态与能耗管理 实现方案和技术架构

以下是基于AI算法优化建筑形态与能耗管理的实现方案与技术架构,结合行业实践与前沿技术趋势,分层次解析核心要素及实施路径: 一、技术架构设计 1. 数据采集与感知层 多源数据融合 传感器网络:部署温湿度、CO₂浓度、光照、人流密度等传感器,构建实时数据采集体系(如北京…...

【互联网架构解析】从物理层到应用层的全栈组成

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(Python网络请求)运行结果验证 三、性能对比测试方法论量化数据对比结果分…...

Redis和MQ的区别

redis是一个高性能的key-value数据库,支持消息推送功能,可以当做一个轻量级的队列服务器使用。 redis只是提供一个高性能的、原子操作内存键值队,具有高速访问能力,虽然可以做消息队列的存储,但不具备消息队列的任何功…...

多系统安装经验,移动硬盘,ubuntu grub修改/etc/fstab 移动硬盘需要改成nfts格式才能放steam游戏

笔记本一个系统,移动硬盘两个系统,当前系统sda4.jpg 移动硬盘需要再装一个linux会有boot/efi,启动的时候grub界面才能识别,单linux没有efi别的电脑识别不到 没efi甚至启动不了grub 按下f6.jpg 看看笔记本grub能不能识别得到移动硬…...

4.26学习——web刷题

把攻防世界的web做了20道左右&#xff0c;挑了几道学到东西的题目记录一下 攻防世界warmup 进到环境中读取源代码发先有个提示&#xff1a;source.php&#xff0c;进去看看 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$wh…...

Go 语言中的实时交互式编程环境

在 Go 语言中&#xff0c;确实有几种方法可以实现类似 Python REPL 的实时交互式编程体验&#xff0c;让你可以实时编写代码并查看输出&#xff0c;而无需每次都编译运行整个程序。 但是需要注意的是&#xff0c;由于 Go 是编译型语言&#xff0c;完全的实时交互体验不如解释型…...

动态规划求解leetcode300.最长递增子序列(LIS)详解

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…...

冯·诺依曼和哈佛架构​​​​两种架构的总线组成及核心特点

在计算机体系结构中&#xff0c;哈佛架构和冯诺依曼架构是两种不同的存储与总线设计范式&#xff0c;它们的总线组成和访问方式有显著差异。以下是两种架构的总线组成及核心特点的详细分析&#xff1a; 1. 冯诺依曼架构&#xff08;Von Neumann Architecture&#xff09; 核心…...

7.学习笔记-Maven进阶(P75-P89)-进度(p75-P80)

1.MAVEN-01-分模块开发的意义 &#xff08;一&#xff09;分模块开发意义 模块可以按功能划分&#xff0c;也可以按团队划分&#xff0c;所以把domain的方法抽取出来&#xff0c;进行共享&#xff0c;从而提高开发 的效率。 &#xff08;1&#xff09;分模块开发的意义&#xf…...

Java——令牌技术

目录 一、何为令牌 JWT令牌 介绍 JWT组成 二、JWT用于验证用户登录 三、JWT令牌生成和校验 简单用法 1.创建生成密钥的方法 2.接着添加过期时间&#xff0c;密钥&#xff0c;BASE64解码密钥的属性以及生成token的方法&#xff0c;合并上面生成密钥的方法&#xff0c;下面…...

【含文档+PPT+源码】基于Python校园跑腿管理系统设计与实现

项目介绍 本课程演示的是一款基于Python校园跑腿管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…...

Spring AI Alibaba - Milvus 初体验,实现知识库效果

先看效果 数据被存储在 milvus 中&#xff0c;包括原始数据和向量数据。 大模型使用向量化数据的回答&#xff1a; 环境准备 安装 milvus Milvus 是一款专为向量相似性搜索设计的高性能开源数据库。 本地测试环境可以直接 Standalone 模式安装&#xff0c;需要用到 docke…...

arcpy列表函数的应用

arcpy.ListDatasets() 该函数用于列出指定工作空间中的所有数据集&#xff08;如要素数据集、栅格数据集等&#xff09;。 语法&#xff1a; python arcpy.ListDatasets(wild_cardNone, feature_typeNone) • wild_card&#xff1a;用于筛选数据集名称的通配符。 • feat…...

上位机知识篇---时钟分频

文章目录 前言 前言 本文简单介绍了一下时钟分频。时钟分频&#xff08;Clock Division&#xff09;是数字电路设计中常见的技术&#xff0c;用于将高频时钟信号转换为较低频率的时钟信号&#xff0c;以满足不同模块的时序需求。它在处理器、FPGA、SoC&#xff08;片上系统&am…...

Redis的两种持久化方式:RDB和AOF

Redis持久化概述 Redis作为内存数据库&#xff0c;数据存储在内存中。为了保证数据在服务器重启或宕机时不丢失&#xff0c;Redis提供了两种持久化方案&#xff1a; RDB&#xff08;Redis Database&#xff09;&#xff1a;定时生成内存快照 AOF&#xff08;Append Only File&…...

1位的推理框架bitnet.cpp

源码&#xff1a;https://github.com/microsoft/BitNet bitnet.cpp 技术解析 ‌bitnet.cpp‌ 是专为 ‌低精度大语言模型&#xff08;如 BitNet b1.58&#xff09;‌ 设计的官方推理框架&#xff0c;其核心特性如下&#xff1a; 一、架构优势 ‌全栈优化引擎‌ 提供高度优化…...

教育领域的AIGC革命:构建多模态智能教学系统

一、智能教育系统技术架构 1.1 教育场景技术需求 教学环节 传统痛点 AIGC解决方案 课程设计 耗时耗力&#xff0c;创新不足 跨学科教案自动生成 课堂互动 单向传授&#xff0c;参与度低 多模态交互式虚拟教师 作业批改 重复劳动&#xff0c;反馈延迟 全自动批改与个性化评语 学…...

Simulink 数据存储机制:Base Workspace、Model Workspace 与 Data Dictionary 的核心区别

1. 核心定位与设计目标 存储方式本质核心设计目标Base WorkspaceMATLAB全局内存空间临时数据交互&#xff0c;快速原型开发Model Workspace模型私有数据容器模型数据隔离&#xff0c;防止命名冲突Data Dictionary专业数据管理文件(.sldd)复杂系统数据治理&#xff0c;支持团队…...

TI---UART通信

一、SysConfig 中 UART 配置的核心参数与生成逻辑 1. 基础参数配置&#xff08;图形化界面&#xff09; 配置项功能说明生成代码影响模式选择主机模式&#xff08;Master&#xff09;/ 从机模式&#xff08;仅部分芯片支持&#xff0c;如 UART 作为 I2C 桥接&#xff09;生成…...

spark总结

文章目录 一 spark简介1.1 什么是spark1.2 spark运行过程1.2.1 组成1.2.2 过程1.2.3 事例&#xff08;词频统计WordCount程序&#xff09; 1.3 spark运行模式1.4 pyspark 二 SparkCore2.1 RDD介绍2.2 RDD编写2.3 RDD算子2.4 RDD的持久化2.4.1 为什么需要缓存和检查点机制&#…...

【随笔】地理探测器原理与运用

文章目录 一、作者与下载1.1 软件作者1.2 软件下载 二、原理简述2.1 空间分异性与地理探测器的提出2.2 地理探测器的数学模型2.21 分异及因子探测2.22 交互作用探测2.23 风险区与生态探测 三、使用&#xff1a;excel 一、作者与下载 1.1 软件作者 作者&#xff1a; DOI: 10.…...

补码底层逻辑探讨

在计算机里面以二进制进行存储&#xff0c;二进制并不能区分正负数 为了处理负数&#xff0c;人们想了很多办法 1.原码 首先&#xff0c;很直观的区分方法就是设置一个flag 在二进制前面加一个符号位&#xff0c;0是正、1是负 但是在电路里面处理这样的信号却很复杂&#…...

第二大脑-个人知识库

原文链接:https://i68.ltd/notes/posts/20250407-llm-person-kb/ Quivr-第二大脑一样的个人助手&#xff0c;利用AI技术增强个人生产力 将 GenAI 集成到您的应用程序中的个性化 RAG,专注于您的产品而非 RAG项目仓库:https://github.com/QuivrHQ/quivr Star:37.7k官网:https:/…...

泰勒展开概念解释(图优化SLAM中非线性系统的线性处理)

1. 泰勒展开 泰勒展开是一种用多项式近似复杂函数的数学方法,其核心思想是通过函数在某一点的各阶导数信息,构建一个多项式来逼近原函数,即通过函数在某一点x0的各阶导数值,构造一个多项式 P(x),使得该多项式在 x0 附近与原函数 f(x) 的值及其导数尽可能匹配,数学形式为…...

CANape与MATLAB数据接口技术详解

目录 CANape与MATLAB数据接口技术详解 一、数据互操作背景与意义 1.1 汽车电子开发中的测量需求 1.2 技术标准演进分析 二、CANape数据导出深度解析 2.1 MDF文件结构说明 2.2 转换流程优化建议 三、MATLAB数据处理进阶技术 3.1 数据质量评估脚本 3.2 数据可视化增强方…...

per-task affinity 是什么?

Per-Task Affinity&#xff08;任务级CPU亲和性&#xff09;详解 Per-Task Affinity 是 Linux 调度器提供的一种机制&#xff0c;允许将单个任务&#xff08;进程/线程&#xff09;绑定到特定的 CPU 核心&#xff08;或核心集合&#xff09;上运行&#xff0c;从而优化性能、减…...

基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术

摘要&#xff1a;随着机器人技术的飞速发展&#xff0c;对运动控制系统的性能要求日益严苛。本文聚焦于基于先进MCU&#xff08;微控制单元&#xff09;的机器人运动控制系统设计&#xff0c;深入剖析其理论基础、实践方法与前沿技术。以国科安芯的MCU芯片AS32A601为例&#xf…...

Network.framework 的引入,不是为了取代 URLSession

Network.framework 的引入&#xff0c;不是为了取代 URLSession 如果你感觉 Network.framework 的引入, 可能是为了取代 URLSession, 那你就大错特错了&#xff01;这里需要非常准确地区分一下&#xff1a; &#x1f535; Network.framework 不是为了取代 URLSession。 &…...

gradle-缓存、依赖、初始化脚本、仓库配置目录详解

1.启用init.gradle文件的方法 在命令置顶文件&#xff0c;例如gradle --init-script yourdir/init.gradle -q taskName,你可以多次输入此命令来制定多个init文件把init.gradle文件放到USER_HOME/.gradle/目录下把以.gradle结尾的文件放到USER_HOME/.gradle/.init.d/目录下把以…...

提示词的神奇魔力——如何通过它改变AI的输出

一、引言&#xff1a;初识AI的惊艳与迷茫 最近这段时间&#xff0c;我像很多人一样&#xff0c;一头扎进了生成式AI的世界&#xff0c;尝试使用各种工具&#xff0c;从文字助手到图像生成器。一开始&#xff0c;我被它们的能力深深震撼&#xff0c;感觉就像突然拥有了一个无所…...

零基础上手Python数据分析 (24):Scikit-learn 机器学习初步 - 让数据预测未来!

写在前面 在前面的学习中,我们已经掌握了使用 Python、Pandas、NumPy、Matplotlib 和 Seaborn 进行数据处理、分析和可视化的全套核心技能。我们学会了如何从数据中提取信息、清洗数据、整合数据、探索数据模式并将其可视化呈现。 现在,我们站在了一个新的起点。数据分析不仅…...