嵌入式第三十四篇——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)或系统指定进程收养
相关推荐
fpcc30 分钟前
跟我学C++中级篇——Linux中文件和链接及重定向
linux·c++
菜的不敢吱声5 小时前
swift学习第4天
服务器·学习·swift
2501_941805938 小时前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
晚枫歌F8 小时前
Dpdk介绍
linux·服务器
李慕婉学姐8 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
珠海西格电力8 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
想进部的张同学8 小时前
hilinux-3599---设备学习---以及部署yolo
学习·yolo·海思
数据大魔方8 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
风送雨8 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
Chasing Aurora9 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束