Linux系统编程:进程管理、内存对比与树莓派应用

news2025/5/12 6:31:15

一、认识进程和线程,在Linux系统下查看系统中各进程的编号pid并终止一个进程pid

1.进程和线程

​进程​​:操作系统分配资源(如内存、CPU时间片)的基本单位。每个进程有独立的内存空间,进程间通信需要较复杂的机制(如管道、信号、共享内存等)。

线程​​:进程内的执行单元,共享同一进程的资源(如内存、文件句柄)。线程间通信更高效,但需注意同步问题(如竞态条件)。

2.用 ps -a 命令查看系统中各进程的编号pid且用 kill 命令终止一个进程pid

命令如下

#在后台运行一个 sleep 120 秒的进程
sleep 120 &


#查看进程的PID
ps -a
输出示例​​:
  PID TTY          TIME CMD
  1234 pts/0    00:00:00 bash
  5678 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不能复制粘贴代码,挺难受的。​​

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

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

相关文章

ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题原因二、设置碰撞2.读入数据 总结 前言 ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞 一、问题原因 在UE5中&#xff0c;角色和敌人没有碰撞可能是由多种原因导致的&#xff0c;以下是一些可能的原因及解决方法&#xff1a…

基于Flask的MBA考生成绩查询系统设计与实现

基于Flask的MBA考生成绩查询系统设计与实现 序言 2024年吉林大学MBA在职研究生考试成绩公布后&#xff0c;考生收到的成绩单为PDF格式文档。为方便考生快速查询个人成绩及排名信息&#xff0c;笔者基于Python Flask框架开发了本查询系统。该系统支持关键词模糊查询、序号范围…

DHCP之报文格式

字段说明&#xff1a; op (op code): 表示报文的类型&#xff0c;取值为 1 或 2&#xff0c;含义如下 1:客户端请求报 2:服务器响应报文 Secs (seconds):由客户端填充&#xff0c;表示从客户端开始获得 IP 地址或 IP 地址续借后所使用了的秒数&#xff0c;缺省值为 3600s。 F…

React 文件上传新玩法:Aliyun OSS 加持的智能上传组件

文件上传是前端开发中的“老朋友”&#xff0c;但如何让它既简单又强大&#xff0c;还能无缝对接云端存储&#xff1f;今天&#xff0c;我要带你认识一个超酷的 React 组件 AliUploader&#xff0c;它不仅支持拖拽上传、批量编辑和文件排序&#xff0c;还直接把文件传到 Aliyun…

群体智能优化算法-变色龙优化算法(Chameleon Swarm Algorithm, CSA,含Matlab源代码)

摘要 变色龙优化算法&#xff08;Chameleon Swarm Algorithm, CSA&#xff09;是一种受变色龙行为启发的群体智能优化算法。该算法模拟了变色龙在自然界中通过变换颜色来适应环境的能力&#xff0c;以此为基础&#xff0c;设计了一个适应性强、搜索能力广泛的优化算法。CSA 通…

使用 React 和 Konva 实现一个在线画板组件

文章目录 一、前言二、Konva.js 介绍三、创建 React 画板项目3.1 安装依赖3.2 创建 CanvasBoard 组件 四、增加画布控制功能4.1 清空画布4.2 撤销 & 重做功能 五、增加颜色和画笔大小选择5.1 选择颜色5.2 选择画笔大小 六、最终效果七、总结 一、前言 在线画板是许多应用&…

NVR接入录像回放平台EasyCVR视频系统守护舌尖上的安全,打造“明厨亮灶”云监管平台

一、方案背景 近年来&#xff0c;餐饮行业食品安全和卫生等问题频发&#xff0c;比如后厨卫生脏乱差等&#xff0c;持续引发关注&#xff0c;这些事情导致连锁反应&#xff0c;使其收益遭受损失。同时&#xff0c;给消费者造成了心理和生理上的伤害。 加强餐饮行业的监管成为…

Cribl 导入文件来检查pipeline 的设定规则(eval 等)

Cribl 导入文件来检查pipeline 的设定规则(eval 等) 从这个页面先下载,或者copy 内容来创建pipeline: Reducing Windows XML Events | Cribl Docs

一周学会Pandas2 Python数据处理与分析-Jupyter Notebook安装

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Jupyter (Project Jupyter | Home&#xff09;项目是一个非营利性开源项目&#xff0c;于2014年由IPython项目中诞生…

deepseek v3-0324 Markdown 编辑器 HTML

Markdown 编辑器 HTML 以下是一个美观的 Markdown 编辑器 HTML 页面&#xff0c;支持多种主题切换和实时预览功能&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&q…

视频设备轨迹回放平台EasyCVR如何搭建公共娱乐场所远程视频监控系统

一、背景介绍 由于KTV、酒吧、足疗店等服务场所人员流动频繁、环境复杂&#xff0c;一直是治安管理的重点区域。为有效打击 “黄赌毒”、打架斗殴、寻衅滋事等违法犯罪的活动&#xff0c;打造安全有序的娱乐消费环境&#xff0c;我国相关部门将加大对这类场所的清查与管控力度…

网络安全基础知识总结

什么是网络安全 采取必要措施&#xff0c;来防范对网络的攻击&#xff0c;侵入&#xff0c;干扰&#xff0c;破坏和非法使用&#xff0c;以及防范一些意外事故&#xff0c;使得网络处于稳定可靠运行的状态&#xff0c;保障网络数据的完整性、保密性、可用性的能力(CIA)。 举例…

【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆

在 Visual Studio 中使用 Dotfuscator 进行混淆 Dotfuscator 是 Visual Studio 自带的混淆工具&#xff08;Dotfuscator Community Edition&#xff0c;简称 CE&#xff09;。它可以混淆 C# 类库&#xff08;DLL&#xff09;或应用程序&#xff08;EXE&#xff09;&#xff0c…

积分赛——获取环境温度

设计要求 从DS18B20温度传感器上获取环境温度&#xff0c;并将其温度值显示到数码管上&#xff08;保留两位小数&#xff09;。 当“S4”定义为发送按键&#xff0c;按键S4按下时&#xff0c;串口向PC端发送当前采集的温度值&#xff1b; 串口发送格式&#xff1a; Temp:26.…

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…

自然语言处理|如何用少样本技术提升低资源语言处理?

一、引言 在全球化的背景下&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术取得了显著进展&#xff0c;为人们的生活和工作提供了便利。然而&#xff0c;大多数 NLP 研究和应用集中在少数高资源语言上&#xff0c;如英语和中文。据统计&#xff0c;全球存在超过 700…

系统安全——文件监控-FileMonitor

namespace FileSystemWatcherDemo {public partial class Form1 : Form{ public Form1(){InitializeComponent();UsingFileSystemWatcher();} /// <summary>/// 使用FileSystemWatcher方法/// </summary>void UsingFileSystemWatcher(){//6.2//FileSystemWa…

07-01-自考数据结构(20331)- 排序-内部排序知识点

内部排序算法是数据结构核心内容,主要包括插入类(直接插入、希尔)、交换类(冒泡、快速)、选择类(简单选择、堆)、归并和基数五大类排序方法。 知识拓扑 知识点介绍 直接插入排序 定义:将每个待排序元素插入到已排序序列的适当位置 算法步骤: 从第二个元素开始遍历…

【AI学习】MCP的简单快速理解

最近&#xff0c;AI界最火热的恐怕就是MCP了。作为一个新的知识点&#xff0c;学习的开始&#xff0c;先摘录一些信息&#xff0c;从发展历程、通俗介绍到具体案例&#xff0c;这样可以快速理解MCP。 MCP发展历程 来自i陆三金 Anthropic 开发者关系负责人 Alex Albert&#…