Linux软件编程:进程

一、进程的基本概念

1.1 程序与进程

  • 程序:静态存储在硬盘上的指令与数据的集合。

  • 进程:程序的一次动态执行过程,包括创建、调度、执行到终止的完整生命周期。进程是系统进行资源分配和调度的基本单位。

1.2 进程的虚拟地址空间

每个进程在启动时,操作系统会为其分配一个独立的0--4GB虚拟地址空间,结构如下:

段名 存储内容 说明
.text 代码指令 只读,存放程序代码
.rodata 只读数据(如字符串常量) 不可修改
.data 已初始化的全局变量与静态变量 编译时分配,运行时加载
.bss 未初始化的全局变量与静态变量 进程启动时初始化为0
stack 局部变量、函数调用信息 默认大小8MB,向低地址增长
heap 动态分配的内存 由程序员管理,向高地址增长
kernel space 内核代码与数据 用户进程无法直接访问

多个进程虽然共享相同的虚拟地址空间布局,但通过MMU(内存管理单元)映射到不同的物理内存区域,实现了进程间的内存隔离。


二、进程的管理与监控命令

以下命令在终端中用于查看、控制进程状态:

命令 功能说明 示例
top 实时查看系统进程与CPU占用率 top
ps -ef 查看系统中所有进程的详细信息 `ps -ef
ps -aux 查看进程状态(包括CPU、内存占用) `ps -aux
kill 向进程发送信号,常用-9强制终止 kill -9 1234
killall 根据进程名终止进程 killall -9 firefox
& 将进程置于后台运行 ./server &
jobs 查看当前终端下的后台任务列表 jobs
fg 将后台任务调至前台执行 fg %1
nice 以指定优先级启动进程(-20最高,20最低) nice -n 10 ./app
renice 调整已运行进程的优先级 renice -n 5 1234

三、进程调度算法

Linux内核采用多种调度策略,常见的有:

  1. 先来先服务(FCFS)

  2. 短作业优先(SJF)

  3. 优先级调度

  4. 时间片轮转(Round Robin)

    CPU为每个进程分配一个时间片(通常5--10ms),时间片用完则切换进程,实现宏观上的并发执行。

  5. 多级反馈队列(MLFQ)

  6. 负载均衡调度

  7. 抢占式调度

调度算法的选择直接影响系统的响应速度、吞吐量及公平性。


四、进程的状态

Linux进程在其生命周期中会经历以下几种状态:

状态标识 状态名称 说明
R 运行态 进程正在CPU上执行
R 就绪态 进程已准备好,等待CPU调度
S 可唤醒等待态 进程因等待某资源(如I/O)被挂起,可被信号唤醒
D 不可唤醒等待态 进程等待某关键资源(如磁盘I/O),不可被中断
T 停止态 进程被用户或系统暂停(如Ctrl+Z
Z 僵尸态 进程已终止,但其资源尚未被父进程回收
X 结束态 进程完全终止,资源已回收

五、进程相关系统调用(C语言)

5.1 进程创建:fork()

复制代码
#include <unistd.h>
pid_t fork(void);
  • 功能:创建子进程,子进程复制父进程的地址空间。

  • 返回值:

    • 父进程返回子进程PID;

    • 子进程返回0;

    • 失败返回-1。

5.2 获取进程ID

复制代码
pid_t getpid(void);   // 获取当前进程PID
pid_t getppid(void);  // 获取父进程PID

5.3 进程终止

复制代码
#include <stdlib.h>
void exit(int status);

或使用return语句。status为进程退出状态,可由父进程通过wait()获取。

5.4 进程等待

复制代码
#include <sys/wait.h>
pid_t wait(int *status);

父进程调用wait()阻塞直至某个子进程结束,并回收其资源。


今日练习

  1. 为一个进程创建2个子进程,子进程中打印自己的PID和父进程的PID,父进程中打印自己的PID和2个子进程的PID

  2. 遍历指定目录,打印出所有的媒体文件(.flv、.avi、.rmvb、.rm)结尾的文件名的文件


相关推荐
0xDevNull11 小时前
Linux切换JDK版本详细教程
linux
进击的丸子11 小时前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
Johny_Zhao2 天前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
chlk1233 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑3 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件3 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号4 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash4 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI4 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行5 天前
Linux和window共享文件夹
linux