一、进程和线程的概念
1.进程
进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的最小单元。
定义:进程是程序的一次执行实例,拥有独立的地址空间、资源(如内存、文件描述符等)和系统状态。
进程特点:
独立性:每个进程有独立的虚拟地址空间,互不干扰(通过进程间通信(IPC)才能交互)。
资源开销:创建、销毁或切换进程成本较高(需要分配独立资源)。
安全性:进程间隔离性强,一个进程崩溃通常不会影响其他进程。
查看命令:ps -aux 或 top。
创建方式:通过 fork() 系统调用(子进程复制父进程的地址空间)。
2.线程
线程是进程内独立的一条运行路线,是处理器调度的最小单元,也可以称为轻量级进程。
定义:线程是进程内的执行单元,共享同一进程的地址空间和资源,但拥有独立的栈和寄存器。
特点:
共享资源:同一进程的线程共享内存、文件描述符等,通信更高效(无需IPC)。
轻量级:创建、切换线程的开销远小于进程(因无需分配新地址空间)。
并发性:多线程可并行执行(在多核CPU上),适合计算密集型或I/O密集型任务。
风险:线程间缺乏隔离,一个线程崩溃可能导致整个进程终止。
查看命令:ps -eLf 或 top -H。
创建方式:通过 pthread_create()(POSIX线程库)。
3.用 ps -a 命令查看系统中各进程的编号pid,并用kill 命令终止一个进程pid
二、虚拟内存管理
1.Linux的虚拟内存管理
核心概念:
虚拟内存:进程看到的是虚拟地址空间(32位系统通常为4GB),由操作系统和硬件动态映射到物理内存或磁盘(Swap空间)。
关键机制:
分页:内存被划分为固定大小的页(通常4KB),通过页表(Page Table)实现虚拟地址到物理地址的转换。
按需分配:页仅在访问时加载到物理内存,未使用的页可能被换出到磁盘。
写时复制:进程fork时共享父进程内存,仅在修改时复制新页。
内存保护:通过页表权限位(读/写/执行)隔离进程,防止非法访问。
2.STM32的真实物理内存管理
核心概念:
物理内存直接映射:所有代码和数据的地址直接对应物理内存或外设寄存器(无MMU,无虚拟地址转换)。
关键特点:
静态分配:内存布局由链接脚本(如.ld文件)静态定义,分为栈、堆、全局变量等区域。
无内存保护:所有代码均可访问任意物理地址(包括外设寄存器),需开发者自行保证安全。
确定性:访问延迟固定,适合实时性要求高的场景。
3.区别对比
地址空间:Linux虚拟内存是虚拟地址,STM32物理内存是物理地址
内存隔离:Linux虚拟内存有内存隔离,为进程间隔离,STM32物理内存无内存隔离,所有代码共享内存。
动态分配:Linux虚拟内存支持动态分配,STM32物理内存需静态分配或简单动态分配。
外设访问:Linux虚拟内存通过设备驱动,STM32物理内存直接读写寄存器地址。
三、Linux系统调用函数
查看当前所在目录
创建子目录
vi编辑代码
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
// 使用系统调用函数write向标准输出写入数据
const char *message = “Hello, this is a system call example!\n”;
ssize_t bytes_written = write(STDOUT_FILENO, message, strlen(message));
if (bytes_written == -1) {
perror(“write”);
return 1;
}
return 0;
}
使用gcc编译
gcc -o syscall_example syscall_example.c
运行