伴侣间的信任感被破坏后,如何重建与修复?
2026/3/19 8:53:24
初学者易混淆进程与程序,二者从存在形式、生命周期、资源占用等维度存在本质差异,核心是 “静态文件” 与 “动态执行实例” 的区别:
| 维度 | 程序(Program) | 进程(Process) |
|---|---|---|
| 存在形式 | 静态,存储在硬盘中的代码、数据集合 | 动态,程序加载到内存后执行的实例 |
| 生命周期 | 永存,除非手动删除文件 | 暂时,有创建、调度、运行、消亡的完整周期 |
| 状态变化 | 无状态,始终是静态文件 | 有就绪、运行、阻塞、终止等状态切换 |
| 并发特性 | 无并发概念,仅作为文件存在 | 支持并发执行,多进程可抢占 CPU 资源 |
| 资源占用 | 不占用系统资源(CPU、内存、文件描述符等) | 占用 CPU、内存、IO 等系统资源 |
| 运行关联 | 一个程序可多次运行,生成多个独立进程 | 一个进程可加载并执行一个或多个程序 |
test.c(源代码文件) → 编译 → test.out(可执行程序/静态文件) → 运行 → process(进程,分配PID)./test.out后,系统为其分配内存、PID,才成为动态运行的进程。Linux 通过虚拟内存和内存管理单元(MMU)实现多进程安全运行:
fork()、exit())并经权限校验后才能调用内核功能,防止恶意破坏。根据运行方式和交互特性,Linux 进程分为三类,操作系统通过差异化调度策略适配其特性,实现系统并发:
vim、ssh、top,图形界面的浏览器、编辑器;nginx/apache(Web 服务)、rsyslogd(日志收集)、系统更新进程;进程分类的本质是优化系统并发能力 —— 操作系统在一段时间内同时运行多个任务的能力:
Linux 针对不同进程的调度优化目标:
Linux 中除 init 进程(PID=1,系统启动时创建)外,所有进程都有且仅有一个父进程,形成树形结构,核心创建方式是fork()系统调用。
fork()遵循 “一次调用,两次返回” 规则:
fork()返回子进程 PID(正整数),用于管理子进程;fork()返回 0,可通过getppid()获取父进程 PID;errno。早期fork()会复制父进程全部内存空间(代码段、数据段、堆、栈),若子进程立即执行exec加载新程序,内存复制完全浪费。Linux 2.6 内核后引入写时复制(COW),核心原理:
fork()执行后,父子进程共享所有内存页,且标记为 “只读”;fork()开销,提升进程创建效率,节省内存。#include <stdio.h> #include <unistd.h> #include <sys/types.h> int global_var = 10; // 全局变量,存储在数据段 int main() { pid_t pid; int local_var = 20; // 局部变量,存储在栈 pid = fork(); if (pid == -1) { perror("fork failed"); return 1; } else if (pid > 0) { // 父进程执行逻辑 global_var++; local_var++; printf("父进程 - PID: %d, 子进程PID: %d\n", getpid(), pid); printf("父进程 - global_var: %d, local_var: %d\n", global_var, local_var); sleep(2); // 等待子进程执行完毕 } else { // 子进程执行逻辑 printf("子进程 - PID: %d, 父进程PID: %d\n", getpid(), getppid()); printf("子进程 - global_var: %d, local_var: %d\n", global_var, local_var); // 修改变量,触发写时复制 global_var += 2; local_var += 2; printf("子进程修改后 - global_var: %d, local_var: %d\n", global_var, local_var); } return 0; }运行结果分析:
多进程争夺有限的 CPU 核心资源时,Linux 内核调度器通过合理策略分配 CPU 时间,平衡公平性与响应性。
当进程时间片耗尽,内核切换到其他进程运行的过程,核心步骤:
注意:上下文切换存在系统开销,过于频繁会降低整体性能。
| 调度算法 | 核心逻辑 | 适用场景 | 特点 |
|---|---|---|---|
| 时间片轮转 | 就绪进程轮流占用 CPU,时间片耗尽触发切换 | 交互式进程 | 保证公平获取 CPU 资源 |
| 短任务优先 | 优先调度运行时间更短的进程 | 批处理进程 | 降低整体任务平均等待时间 |
| 优先级调度 | 高优先级进程优先获取 CPU | 响应敏感的实时任务 | 按优先级分配资源 |
| 完全公平调度器(CFS) | 按 “权重” 分配 CPU 时间,权重越高时间片越长 | 内核默认(通用场景) | 兼顾公平性与响应性 |
| 实时调度(SCHED_FIFO/SCHED_RR) | 先进先出 / 实时进程时间片轮转 | 工业控制、自动驾驶等实时任务 | 优先级高于普通进程,可抢占 CPU |
| 命令 | 功能说明 | 常用示例 | |
|---|---|---|---|
ps aux | 显示所有进程详细信息(PID、状态、CPU 占用率等) | `ps aux | grep nginx`(过滤 nginx 进程) |
top | 实时监控进程资源占用,支持交互式调整优先级 | 按P按 CPU 排序,renice调整优先级 | |
kill | 向进程发送信号,终止 / 调整进程状态 | kill -9 1234(强制终止 PID=1234 的进程) | |
killall | 按进程名批量关闭进程 | killall -9 a.out(关闭所有 a.out 进程) |
进程是 Linux 实现并发的基本单位:
fork()是创建进程的核心调用,写时复制优化了内存复用;