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


相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言