一、进程的基本概念

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内核采用多种调度策略,常见的有:

  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)结尾的文件名的文件


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐