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


相关推荐
2601_9657984717 分钟前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
我头发多我先学33 分钟前
linux系统编程:初识进程
linux·运维·服务器
Freak嵌入式42 分钟前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
苍狗T1 小时前
LVS相关知识总结
linux·运维·服务器·lvs
lightqjx2 小时前
【Linux系统】基础 IO
linux·c语言·重定向·缓冲区·文件io·文件的系统调用
我星期八休息2 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
RisunJan3 小时前
Linux命令-skill(发送信号给进程)
linux·运维·服务器
潘正翔3 小时前
k8s基础_kubeadm搭建k8s集群
linux·运维·docker·云原生·容器·kubernetes
孪生质数-3 小时前
AI 应用实践篇——让大模型真正开始工作
linux·运维·服务器·人工智能·深度学习·语言模型·llama
2301_777998343 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++