嵌入式第三十四篇——linux系统编程——进程

一、进程本质与核心结构

进程是程序在计算机中的执行过程,操作系统为其分配内存、CPU等资源,是资源调度和分配的基本单位。与静态存储在硬盘中的程序不同,进程具有动态性,涵盖创建、调度、运行到消亡的完整生命周期。

程序是永存的代码与数据集合,而进程是暂时的执行过程。进程会经历状态变化,支持并发执行,且多个进程之间会竞争系统资源。一个程序可多次运行生成多个进程,一个进程也可关联运行一个或多个程序。

进程控制块(PCB)是描述进程的核心结构体,包含进程运行所需的所有关键信息:

  • 进程标识符(PID):唯一标识进程的编号
  • 系统属性:当前工作路径、用户ID(UID)、组ID、umask权限掩码(默认0002)
  • 资源管理:进程打开的文件列表(默认最大1024个)、栈大小(默认8192KB即8M)等资源限制
  • 运行状态:信号处理配置、CPU寄存器状态、程序计数器(PC)等
  • 内存映射:虚拟地址与物理地址的映射关系,由内存管理单元(MMU)负责地址转换

二、内存空间与隔离机制

进程的内存空间划分为多个区域:

  • 代码段(Code):存储程序的可执行代码,权限为只读
  • 数据段(Data):存储已初始化的全局变量和静态变量
  • 堆(Heap):动态内存分配区域,由程序员通过malloc、free等函数手动管理
  • 栈(Stack):存储局部变量、函数参数和返回地址,默认大小为8M,遵循"先进后出"原则
  • 共享/映射区(Share/map):用于进程间共享数据或映射文件内容

多进程环境中,操作系统通过两大机制保障稳定性和安全性:

  • 内存隔离:借助MMU实现虚拟内存技术,每个进程拥有独立的虚拟地址空间
  • 权限控制:进程访问内核资源需通过权限校验,防止未授权操作破坏系统稳定性

三、进程分类与核心功能

根据运行特性和使用场景,进程可分为三类:

  • 交互式进程:运行过程中需要用户输入交互,如终端命令执行、图形界面应用
  • 批处理进程:通过shell脚本批量执行预设命令,无需实时用户干预
  • 守护进程:后台自动运行的进程,默认处于休眠状态,通常以"d"为后缀命名

进程的核心价值在于实现"并发"------操作系统在一个时间段内同时运行多个任务的能力。宏观上看多个进程似乎在同时运行;微观上,由于CPU资源有限,通过调度算法实现进程的快速切换。

四、进程状态与转换机制

Linux系统中进程具有以下关键状态:

  • 运行态(Running,0):分为用户运行态和内核运行态,进程正在占用CPU执行指令
  • 就绪态:进程已具备运行条件,等待CPU调度
  • 可中断睡眠状态(Interruptible,1):进程因等待资源而睡眠,可被信号唤醒
  • 不可中断睡眠状态(Uninterruptible,2):进程深度睡眠,用于关键资源等待
  • 暂停状态(Stopped):进程被暂停执行,需通过特定信号恢复
  • 终止态(3):进程执行完毕或异常终止
  • 僵死状态(Zombie):子进程消亡后,用户内存空间释放,但内核中的PCB未被回收

状态转换规则:

  • 就绪态→运行态:CPU调度器选择就绪队列中的进程分配时间片
  • 运行态→就绪态:进程时间片耗尽,或有更高优先级进程进入就绪态
  • 运行态→阻塞态(睡眠状态):进程等待资源,主动放弃CPU
  • 阻塞态→就绪态:等待的资源满足,进程被唤醒
  • 运行态→终止态:进程正常结束或异常终止
  • 终止态→僵死态:子进程先于父进程消亡,PCB未被回收

五、进程调度算法

Linux采用多种调度算法:

  • 时间片轮转:将CPU时间划分为固定长度的时间片,按顺序分配给就绪进程
  • 短任务优先:优先调度执行时间较短的进程,减少平均等待时间
  • 进程优先级:进程拥有静态优先级(PR)和动态优先级(NI)
  • 完全公平调度算法(CFS):基于"完全公平"原则,动态调整调度权重

六、进程上下文切换

当一个进程的时间片耗尽或主动放弃CPU时,操作系统会触发上下文切换:

  • 保存当前进程状态:将进程的PCB信息、CPU寄存器值、程序计数器(PC)、内存数据等缓存至硬盘
  • 释放CPU资源:当前进程从运行态转为就绪态或阻塞态
  • 加载目标进程:从硬盘读取待运行进程的缓存数据,恢复其PCB、寄存器状态

七、进程操作命令与函数

常用命令:

  • ps aux:显示系统中所有进程的详细信息
  • top:实时监控进程状态,动态刷新CPU、内存使用情况
  • kill -9 pid:强制终止指定PID的进程
  • killall -9 进程名:强制终止所有同名进程
  • ulimit -a:查看当前用户的进程资源限制

核心系统函数:

  • pid_t fork():从当前进程克隆一个子进程
  • pid_t getpid(void):获取当前进程的PID
  • pid_t getppid(void):获取当前进程的父进程PID
  • void exit(int status):C库函数,终止进程时刷新缓冲区
  • void _exit(int status):系统调用,终止进程时不刷新缓冲区
  • pid_t wait(int *status):父进程阻塞等待任意子进程退出

八、特殊进程

僵尸进程:

  • 产生原因:子进程先于父进程消亡,父进程未调用wait/waitpid回收其PCB
  • 危害:僵尸进程的PCB占用内核内存,长期积累会导致内核内存不足
  • 排查:通过ps auxtop命令查看状态为"Z"的进程

孤儿进程:

  • 产生原因:父进程先于子进程消亡,子进程失去父进程
  • 处理机制:孤儿进程会自动被init进程(PID=1)或系统指定进程收养
相关推荐
贡献者手册2 小时前
SQLite 的进阶版,面向边缘计算、嵌入式场景的高性能本地数据库【Turso Database】
数据库
TH_12 小时前
6、前台界面传递老数据,导致业务数据错误
数据库
普通网友3 小时前
深入探讨Linux驱动开发:字符设备驱动开发与测试_linux 驱动开发设备号(2)
java·linux·驱动开发
hakuii3 小时前
linux中的一些配置
linux·运维·服务器
d111111111d3 小时前
STM32得中断服务函数,为什么不能有返回值
笔记·stm32·单片机·嵌入式硬件·学习
阿蒙Amon3 小时前
JavaScript学习笔记:12.类
javascript·笔记·学习
时光の尘3 小时前
嵌入式面试八股文(十九)·裸机开发与RTOS开发的区别
linux·stm32·单片机·iic·rtos·spi
光影少年3 小时前
PostgreSQL数据库学习路线
数据库·学习·postgresql
哈哈老师啊3 小时前
Springboot简单二手车网站qs5ed(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端