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


相关推荐
Deitymoon10 分钟前
linux——TCPIP协议原理
linux·网络
独小乐19 分钟前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
SPC的存折29 分钟前
2、Docker命令与镜像、容器管理
linux·运维·服务器·docker·容器·eureka
D4c-lovetrain33 分钟前
Linux个人心得26 (redis主从复制全流程,详细版)
linux·运维·服务器
晴天¥42 分钟前
达梦数据库共享存储集群搭建(DSC双节点+Openfiler-IP SAN存储)
linux·数据库·达梦数据库
吃着火锅x唱着歌1 小时前
LeetCode 150.逆波兰表达式求值
linux·算法·leetcode
Bert.Cai1 小时前
Linux whoami命令详解
linux·运维
x***r1511 小时前
驱动精灵离线版使用指南:免联网快速安装驱动(万能网卡版)
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志1 小时前
Linux GPIO子系统与中断驱动开发:从入门到实战(完整版)
linux·运维·驱动开发
青城山下————2 小时前
CentOS 7 安装 PostgreSQL 13(国内镜像 + 远程访问)完整实践教程
linux·postgresql·centos