Linux软件编程:进程
本文摘要:文章系统介绍了进程管理的核心概念与技术要点。首先阐述了进程与程序的区别,详细说明了进程虚拟地址空间的结构(包括代码段、数据段、堆栈等)及其4GB内存布局。其次列举了常用的进程监控命令(如top、ps、kill等)及其应用场景。接着解析了Linux系统的进程调度算法(时间片轮转、多级反馈队列等)和五种进程状态(运行态、就绪态等)。最后通过C语言系统调用示例(fork()、wait()等)演
一、进程的基本概念
1.1 程序与进程
-
程序:静态存储在硬盘上的指令与数据的集合。
-
进程:程序的一次动态执行过程,包括创建、调度、执行到终止的完整生命周期。进程是系统进行资源分配和调度的基本单位。
1.2 进程的虚拟地址空间
每个进程在启动时,操作系统会为其分配一个独立的0–4GB虚拟地址空间,结构如下:
| 段名 | 存储内容 | 说明 |
|---|---|---|
| .text | 代码指令 | 只读,存放程序代码 |
| .rodata | 只读数据(如字符串常量) | 不可修改 |
| .data | 已初始化的全局变量与静态变量 | 编译时分配,运行时加载 |
| .bss | 未初始化的全局变量与静态变量 | 进程启动时初始化为0 |
| stack | 局部变量、函数调用信息 | 默认大小8MB,向低地址增长 |
| heap | 动态分配的内存 | 由程序员管理,向高地址增长 |
| kernel space | 内核代码与数据 | 用户进程无法直接访问 |
多个进程虽然共享相同的虚拟地址空间布局,但通过MMU(内存管理单元)映射到不同的物理内存区域,实现了进程间的内存隔离。
二、进程的管理与监控命令
以下命令在终端中用于查看、控制进程状态:
| 命令 | 功能说明 | 示例 |
|---|---|---|
top |
实时查看系统进程与CPU占用率 | top |
ps -ef |
查看系统中所有进程的详细信息 | ps -ef | grep bash |
ps -aux |
查看进程状态(包括CPU、内存占用) | ps -aux | grep nginx |
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内核采用多种调度策略,常见的有:
-
先来先服务(FCFS)
-
短作业优先(SJF)
-
优先级调度
-
时间片轮转(Round Robin)
CPU为每个进程分配一个时间片(通常5–10ms),时间片用完则切换进程,实现宏观上的并发执行。 -
多级反馈队列(MLFQ)
-
负载均衡调度
-
抢占式调度
调度算法的选择直接影响系统的响应速度、吞吐量及公平性。
四、进程的状态
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)结尾的文件名的文件






更多推荐



所有评论(0)