Linux系统编程:进程管理、内存对比与树莓派应用
一、认识进程和线程,在Linux系统下查看系统中各进程的编号pid并终止一个进程pid
1.进程和线程
进程:操作系统分配资源(如内存、CPU时间片)的基本单位。每个进程有独立的内存空间,进程间通信需要较复杂的机制(如管道、信号、共享内存等)。
线程:进程内的执行单元,共享同一进程的资源(如内存、文件句柄)。线程间通信更高效,但需注意同步问题(如竞态条件)。
2.用 ps -a 命令查看系统中各进程的编号pid且用 kill 命令终止一个进程pid
命令如下
#在后台运行一个 sleep 120 秒的进程
sleep 120 &#查看进程的PID
ps -a
输出示例:PID TTY TIME CMD1234 pts/0 00:00:00 bash5678 pts/1 00:00:00 ps终止进程
kill PID(如kill 1234)
操作结果:

二、Linux的“虚拟内存管理”与stm32中的 真实物理内存(内存映射)的区别
1.Linux虚拟内存管理
虚拟内存是操作系统对物理内存的抽象层,通过 硬件(MMU) 和 软件(内核页表) 协作实现。
| 特性 | 说明 |
|---|---|
| 虚拟地址空间 | 每个进程拥有独立的虚拟地址空间(如0x0000~0xFFFF),与物理内存解耦。 |
| 分页机制 | 内存按固定大小(如4KB)分页,通过页表(Page Table)映射虚拟页到物理页或磁盘(Swap)。 |
| 内存保护 | 页表项标记内存权限(读/写/执行),防止非法访问(如代码区只读)。 |
| 按需分配 | 物理内存仅在实际访问时分配(触发缺页中断),避免浪费。 |
| 共享内存 | 多个进程可共享同一物理页(如动态库代码)。 |
| Swap机制 | 将不活跃的内存页换出到磁盘,缓解物理内存不足。 |
示例:
- 进程A访问虚拟地址
0x1234→ MMU查页表 → 映射到物理地址0x5678。 - 若目标页不在物理内存中,触发缺页中断 → 内核从磁盘加载该页。
2.STM32物理内存映射
TM32等微控制器无MMU,直接通过物理地址访问内存和外设,其设计目标是实时性和确定性:
| 特性 | 说明 |
|---|---|
| 物理地址直接访问 | 所有代码直接操作物理地址(如0x20000000为SRAM起始地址)。 |
| 内存与外设统一编址 | 外设寄存器通过特定地址访问(如0x40000000为GPIOA寄存器地址)。 |
| 静态内存分配 | 内存布局在编译时确定(通过链接脚本),无动态分页或交换机制。 |
| 无内存保护 | 所有代码均可访问任意物理地址,易因错误操作导致系统崩溃。 |
| 确定性延迟 | 无地址转换开销,访问外设和内存的时间可精确计算,适合实时系统。 |
示例:
操作STM32的GPIO:
volatile uint32_t *GPIOA = (uint32_t*)0x40020000; // 直接访问GPIOA寄存器地址
*GPIOA |= 0x01; // 设置PA0引脚为高电平
3. 关键区别对比
| 维度 | Linux虚拟内存 | STM32物理内存 |
|---|---|---|
| 地址空间 | 虚拟地址隔离(进程安全) | 直接物理地址(无隔离) |
| 硬件依赖 | 依赖MMU实现地址转换 | 无MMU,直接访问物理地址 |
| 内存分配 | 动态分页,按需分配 | 静态分配,编译时固定 |
| 内存保护 | 通过页表权限实现(读/写/执行) | 无保护,代码可任意修改内存或外设 |
| 实时性 | 因地址转换和缺页中断导致延迟不确定 | 访问延迟确定,适合实时控制 |
| 应用场景 | 通用多任务系统(如服务器、PC) | 资源受限的嵌入式实时系统(如电机控制、传感器) |
4. 注意事项
-
在Linux中:
- 用户程序通过
malloc申请的是虚拟内存,实际物理内存分配由内核管理。 - 直接访问物理地址需通过
/dev/mem或内存映射(mmap),且需要root权限。
- 用户程序通过
-
在STM32中:
- 需手动管理内存,避免溢出(如栈、堆大小需在链接脚本中明确定义)。
- 操作外设时需严格遵循寄存器地址和时序,错误写入可能导致硬件故障。
总结:Linux虚拟内存是抽象层,解决多任务安全与资源扩展问题;STM32物理内存映射是直接控制,满足实时性和硬件效率需求。两者适用于截然不同的场景,理解其差异是开发跨平台系统的关键。
三、Linux系统调用函数 fork()、wait()、exec() 等的含义和调用方法
1.用xterminal(或者putty等)远程登录自己阿里云服务器Ubuntu系统的账号,在home目录下创建一个子目录,然后使用vi编辑一个c代码,gcc编译,实现一个系统调用函数的例子
下图为整个命令流程:

c文件起名为fork_exec_wait.c,代码如下(此代码是deepseek写的):
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid = fork(); // 创建子进程if (pid < 0) {fprintf(stderr, "Fork failed\n");return 1;} else if (pid == 0) {// 子进程执行ls -l命令execlp("ls", "ls", "-l", NULL);perror("exec failed"); // 若exec失败,输出错误return 1;} else {// 父进程等待子进程结束wait(NULL);printf("子进程执行完毕。\n");}return 0;
}
编辑好代码后在下方命令行输入:wq+Enter(一定要Enter!),然后点击发送就退出去了

2.在树莓派中创建账号,在该账号+home目录下,完成同样的操作
PS:一定要让树莓派跟你的电脑都连你的手机热点!!!
打开putty连接树莓派(关于树莓派可以看我另一个博客)无显示器安装访问树莓派3B+_如何在没用显示器的情况下给树莓派安装系统-CSDN博客
(1)创建账号(过程如下,详细看上面链接的博客)

(2)授权新账号使用sudo(方便进行安装一些工具等操作)
指令解释如下:
//添加
sudo usermod -aG sudo cq # -a表示追加,-G指定组//检查
groups cq # 输出应包含 "sudo"

(3)切换账号并安装gcc(编译工具)
指令解释如下:
//切换用户
pi@raspberrypi:~ $ su - cq//sudo whoami # 测试sudo权限,返回 "root"
cq@raspberrypi:~ $ sudo whoami//安装gcc
cq@raspberrypi:~ $ sudo apt install gcc
结果如下:

(4)创建作业目录并编写代码
//创建目录
mkdir -p ~/work6 //进入目录
cd ~/syscall_practice # 使用nano编辑器(xterminal中用的vi)
nano fork_exec_wait.c
c文件代码(同xterminal中):
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid < 0) {fprintf(stderr, "Fork失败\n");return 1;} else if (pid == 0) {execlp("ls", "ls", "-l", NULL);perror("exec失败");return 1;} else {wait(NULL);printf("子进程执行完毕。\n");}return 0;
}
保存退出:Ctrl+O → 回车 → Ctrl+X(nano编辑器操作)
(5)编译并运行
指令:
//编译
gcc fork_exec_wait.c -o demo //运行
./demo
结果:

四、总结
本次实验我了解了进程和线程,通过查找资料了解了Linux虚拟内存和STM32物理内存的区别,还通过Xterminal在阿里云服务器以及通过Putty在树莓派上完成了系统调用实践。学到了很多,偷偷吐槽一下,putty不能复制粘贴代码,挺难受的。
相关文章:
Linux系统编程:进程管理、内存对比与树莓派应用
一、认识进程和线程,在Linux系统下查看系统中各进程的编号pid并终止一个进程pid 1.进程和线程 进程:操作系统分配资源(如内存、CPU时间片)的基本单位。每个进程有独立的内存空间,进程间通信需要较复杂的机制…...
ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞
UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题原因二、设置碰撞2.读入数据 总结 前言 ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞 一、问题原因 在UE5中,角色和敌人没有碰撞可能是由多种原因导致的,以下是一些可能的原因及解决方法:…...
基于Flask的MBA考生成绩查询系统设计与实现
基于Flask的MBA考生成绩查询系统设计与实现 序言 2024年吉林大学MBA在职研究生考试成绩公布后,考生收到的成绩单为PDF格式文档。为方便考生快速查询个人成绩及排名信息,笔者基于Python Flask框架开发了本查询系统。该系统支持关键词模糊查询、序号范围…...
GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议
蓝牙的 GATT(Generic Attribute Profile) 是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议,用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT(Attribute Proto…...
DHCP之报文格式
字段说明: op (op code): 表示报文的类型,取值为 1 或 2,含义如下 1:客户端请求报 2:服务器响应报文 Secs (seconds):由客户端填充,表示从客户端开始获得 IP 地址或 IP 地址续借后所使用了的秒数,缺省值为 3600s。 F…...
React 文件上传新玩法:Aliyun OSS 加持的智能上传组件
文件上传是前端开发中的“老朋友”,但如何让它既简单又强大,还能无缝对接云端存储?今天,我要带你认识一个超酷的 React 组件 AliUploader,它不仅支持拖拽上传、批量编辑和文件排序,还直接把文件传到 Aliyun…...
群体智能优化算法-变色龙优化算法(Chameleon Swarm Algorithm, CSA,含Matlab源代码)
摘要 变色龙优化算法(Chameleon Swarm Algorithm, CSA)是一种受变色龙行为启发的群体智能优化算法。该算法模拟了变色龙在自然界中通过变换颜色来适应环境的能力,以此为基础,设计了一个适应性强、搜索能力广泛的优化算法。CSA 通…...
使用 React 和 Konva 实现一个在线画板组件
文章目录 一、前言二、Konva.js 介绍三、创建 React 画板项目3.1 安装依赖3.2 创建 CanvasBoard 组件 四、增加画布控制功能4.1 清空画布4.2 撤销 & 重做功能 五、增加颜色和画笔大小选择5.1 选择颜色5.2 选择画笔大小 六、最终效果七、总结 一、前言 在线画板是许多应用&…...
GitHub高级筛选小白使用手册
GitHub高级筛选小白使用手册 GitHub 提供了强大的搜索功能,允许用户通过高级筛选器来精确查找仓库、Issues、Pull Requests、代码等。下面是一些常用的高级筛选用法,帮助你更高效地使用 GitHub 搜索功能。 目录 搜索仓库搜索Issues搜索Pull Requests搜…...
通过第k个最大元素深入浅出快排和堆排序
快排和堆排序在确定k个元素有着得天独厚的优势,原因是无论快排还是堆排序在每一轮排序中均可以确定一个元素 快排:每一轮排序均可以确定一个元素位置堆排序:每一轮排序都可以确定一个最小值或最大值 他们的时间复杂度都是O(nlogk)ÿ…...
NVR接入录像回放平台EasyCVR视频系统守护舌尖上的安全,打造“明厨亮灶”云监管平台
一、方案背景 近年来,餐饮行业食品安全和卫生等问题频发,比如后厨卫生脏乱差等,持续引发关注,这些事情导致连锁反应,使其收益遭受损失。同时,给消费者造成了心理和生理上的伤害。 加强餐饮行业的监管成为…...
Airflow+Spark/Flink vs. Kettle
在迁移亿级(单表超过1.3亿)结构化数据(达梦→星环)的场景下,Airflow(结合分布式计算框架)的综合效果优于Kettle,以下是详细对比与方案建议: 一、核心对比:Air…...
Cribl 导入文件来检查pipeline 的设定规则(eval 等)
Cribl 导入文件来检查pipeline 的设定规则(eval 等) 从这个页面先下载,或者copy 内容来创建pipeline: Reducing Windows XML Events | Cribl Docs...
[C++面试] new、delete相关面试点
一、入门 1、说说new与malloc的基本用途 int* p1 (int*)malloc(sizeof(int)); // C风格 int* p2 new int(10); // C风格,初始化为10 new 是 C 中的运算符,用于在堆上动态分配内存并调用对象的构造函数,会自动计算所需内存…...
一周学会Pandas2 Python数据处理与分析-Jupyter Notebook安装
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Jupyter (Project Jupyter | Home)项目是一个非营利性开源项目,于2014年由IPython项目中诞生…...
第30周Java分布式入门 消息队列 RabbitMQ
RabbitMQ章节介绍 一、RabbitMQ概述 RabbitMQ学习内容: 本章节将学习RabbitMQ的概念、安装启动、管理后台、代码实操、交换机工作模式以及Spring Boot整合RabbitMQ。消息队列定义: 消息队列是一种用于在分布式系统中传递消息的机制。消息队列特性: 消息队列具有异步、解耦、削…...
北斗导航 | THE GNSS AMBIGUITY RATIO-TEST REVISITED: A BETTER WAY OF USING IT【论文要点】
THE GNSS AMBIGUITY RATIO-TEST REVISITED: A BETTER WAY OF USING IT 总结该论文的核心贡献及关键方法如下:论文核心内容概述 传统比率测试的局限性 传统比率测试通过比较最优与次优模糊度解的残差平方和比值(即 R = q (...
MySQL 面试知识点详解(索引、存储引擎、事务与隔离级别、MVCC、锁机制、优化)
一、索引基础概念 1 索引是什么? 定义:索引是帮助MySQL高效获取数据的有序数据结构,类似书籍的目录。核心作用:减少磁盘I/O次数,提升查询速度(以空间换时间)。 2 索引的优缺点 优点缺点加速…...
Linux / Windows 下 Mamba / Vim / Vmamba 安装教程及安装包索引
目录 背景0. 前期环境查询/需求分析1. Linux 平台1.1 Mamba1.2 Vim1.3 Vmamba 2. Windows 平台2.1 Mamba2.1.1 Mamba 12.1.2 Mamba 2- 治标不治本- 终极版- 高算力版 2.2 Vim- 治标不治本- 终极版- 高算力版 2.3 Vmamba- 治标不治本- 终极版- 高算力版 3. Linux / Windows 双平…...
deepseek v3-0324 Markdown 编辑器 HTML
Markdown 编辑器 HTML 以下是一个美观的 Markdown 编辑器 HTML 页面,支持多种主题切换和实时预览功能: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&q…...
视频设备轨迹回放平台EasyCVR如何搭建公共娱乐场所远程视频监控系统
一、背景介绍 由于KTV、酒吧、足疗店等服务场所人员流动频繁、环境复杂,一直是治安管理的重点区域。为有效打击 “黄赌毒”、打架斗殴、寻衅滋事等违法犯罪的活动,打造安全有序的娱乐消费环境,我国相关部门将加大对这类场所的清查与管控力度…...
网络安全基础知识总结
什么是网络安全 采取必要措施,来防范对网络的攻击,侵入,干扰,破坏和非法使用,以及防范一些意外事故,使得网络处于稳定可靠运行的状态,保障网络数据的完整性、保密性、可用性的能力(CIA)。 举例…...
Python设计模式:克隆模式
1. 什么是克隆模式 克隆模式的核心思想是通过复制一个已有的对象(原型)来创建一个新的对象(克隆)。这种方式可以避免重复的初始化过程,从而提高效率。克隆模式通常涉及以下几个方面: 原型对象:…...
【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆
在 Visual Studio 中使用 Dotfuscator 进行混淆 Dotfuscator 是 Visual Studio 自带的混淆工具(Dotfuscator Community Edition,简称 CE)。它可以混淆 C# 类库(DLL)或应用程序(EXE),…...
积分赛——获取环境温度
设计要求 从DS18B20温度传感器上获取环境温度,并将其温度值显示到数码管上(保留两位小数)。 当“S4”定义为发送按键,按键S4按下时,串口向PC端发送当前采集的温度值; 串口发送格式: Temp:26.…...
LogicFlow获取锚点数据的自定义key并添加的连接的Edge边数据中
1、重写 PolylineEdgeModel 类(其它 EdgeModel 都可以) class CustomNetWorkNodeEdge extends PolylineEdge { } class CustomNetWorkNodeEdgeModel extends PolylineEdgeModel {getData() {const data super.getData();//获取开始锚点自定义属性添加到…...
【python中级】解压whl文件内容
【python中级】解压whl文件内容 1.背景2.解压1.背景 【python中级】关于whl文件的说明 https://blog.csdn.net/jn10010537/article/details/146979236 补充以上博客: 在 旧版 setuptools 中(< v58),如果想生成 .whl,必须先pip install 安装 wheel 三方包! pip inst…...
Xilinx系列FPGA实现HDMI2.1视频收发,支持8K@60Hz分辨率,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我已有的4K/8K视频处理解决方案我已有的FPGA图像处理方案 3、详细设计方案设计框图硬件设计架构本HDMI2.1性能参数8K视频输入源Video PHY ControllerHDMI 2.1 Receive…...
如何把网页文章转为pdf保存
fnF12调出右边网页端的控制台 在下面输入代码 1、转CSDN上的文章 (function(){ use strict;var articleBox $("div.article_content");articleBox.removeAttr("style");var head_str ""; var foot_str ""; var olde…...
开源可视化大屏go-view前后端安装
一、后端安装 下载代码 git clone https://gitee.com/MTrun/go-view-serve修改配置 cd go-view-serve/ # 修改application-dev.yml的数据库文件地址 vi ./src/main/resources/application-dev.ymlapplication-dev.yml spring:datasource:driver-class-name: org.sqlite.JDB…...
