在这里插入图片描述

💯枫亭湖区: 个人主页

🥰个人专栏: 《C++知识分享》   《Linux 入门到实践:零基础也能懂》

🌠 有善始者实繁,能克终者盖寡


分隔符

前言

Hello 各位码农们 好久不见了
近期一直忙于考研复习当中,实在抽不出时间去学习Linux相关知识
好不容易放假回归,那么本期我们简单讲讲——关于Linux系统编程中的进程概念


进程是所有Linux学习者永远绕不开的话题:

  • 进程是操作系统资源分配的基本单位
  • 进程是理解CPU调度、内存管理的基础

一、程序 vs 进程

维度 程序 进程
定义 静态的指令集合 运行中的程序
存在形式 磁盘上的二进制文件(如编译后的 ./test 内存中的实体,操作系统资源分配的基本单位
资源占用 不占用系统运行资源(仅占磁盘空间) 占用 CPU、内存、I/O 等系统资源
生命周期 永久存储,除非被删除 动态的,有创建、运行、销毁的过程

二、操作系统与进程的关系

操作系统(OS)是进程管家,职责是涵盖了进程的完整生命周期

  • 创建:将程序从磁盘加载到内存
  • 管理与调度:决定哪个进程优先使用 CPU,确保系统高效运行
  • 销毁:在进程结束时回收其占用的资源

三、Linux操作系统的核心逻辑

OS 的核心是 “管理”,管理进程的本质是 — 先描述进程,再组织进程

内部包含

决定了

核心问题

管理哲学

下一步

具体实现统一为

OS (操作系统)

存在多个进程

必然要对进程做管理

如何管理?

先描述
(PCB / 进程控制块)

再组织
(用某种数据结构管理)

链表
(或其它数据结构)


  • 我们根据几张图片来理解:
    在这里插入图片描述

在这里插入图片描述

  • 关于什么是 task_struct,什么是 PCB,我们后面会逐一讲解

在这里插入图片描述


在这里插入图片描述


总结:OS通过 描述(PCB)+组织(链表)+管理(调度),实现对多个进程的有效管理


补充知识点:PCB进程控制块 与 task_struct

1. PCB进程控制块

既然 OS 要管理进程,首先得 认识进程
既然 OS 要管理进程,当然也需要一个信息记录表

这个信息记录表就是PCB(Process Control Block,进程控制块)

进程信息会被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合

2. task_struct 核心内容

Linux 内核眼中,一个进程是一个实实在在的结构体(对象),而不是一段飘忽不定的代码,这个结构体就是是——task_struct

每个进程都会有且仅有一个 task_struct,它包含了进程的所有属性
OS通过操作task_struct来管理进程,而非直接操作进程本身


我们需要记住 task_struct 的几类核心信息:

  • 标识符(PID/PPID):进程的 身份证

    • PID是进程的唯一标识符,用来区分系统中的所有进程
    • PPID是父进程ID,记录该进程由哪个进程创建
  • 进程状态:记录当前进程的**地址空间(虚拟地址空间)**和 页表,关联进程占用的内存资源(代码和数据)

    • 虚拟地址空间 (mm_struct):在 task_struct 中,有一个非常关键的指针字段叫 mm,它指向一个 mm_struct 结构体。这个结构体完整地描述了一个进程的虚拟地址空间
      在这里插入图片描述
    • 页表:将虚拟地址映射到物理地址的桥梁就是页表
  • 程序计时器(PC):记录进程下一条要执行的指令地址

  • 内存指针:指向进程的地址空间,包括程序代码和进行相关数据的指针,还有其他进程共享的内存块的指针

  • 优先级:相对于其它进程的优先级

  • 上下文数据:进程执行时处理器的寄存器中的数据

  • I/O 状态信息:包括显示的 I/O 请求,分配给进程的 I/O 设备和被进程使用的文件列表

  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等

  • 其他资源:比如进程占用的 CPU 时间,打开的文件描述符等


四、Linux如何管理海量 task_struct?

1)OS 用链表管理 task_struct

系统中会同时运行成百上千个进程,也就会有成百上千个 task_structOS 不可能零散地管理这些结构体,必须用高效的数据结构将它们组织起来

  • OS 用链表或红黑树管理task_struct
    • 链表:适合进程数量较少的场景,通过 task_struct 中的 next/prev 指针,将所有进程的 task_struct 串联起来,遍历效率适中
    • 红黑树:适合进程数量较多的场景(比如服务器上的上千个进程),红黑树的查找、插入、删除效率是 O ( log ⁡ n ) O(\log n) O(logn),远高于链表,Linux 内核在进程较多时会自动切换为红黑树管理

核心目的OS 能快速找到需要调度的进程(比如找到优先级最高的进程),同时也能快速管理 fork 创建的进程(将子进程的 task_struct 加入链表 / 红黑树)


2)查看进程

途径一:通过 /proc 目录查看

/procLinux内核给用户态的虚拟文件系统,每个正在运行的进程都会在/proc下对应一个以其PID(进程ID)命名的文件夹
在这里插入图片描述

每个数字都代表当前系统正在运行的所有进程的PID


途径二:大多数进程信息同样可以使用topps这些用户级工具来获取
1)top 命令:动态实时监控

top 类似于 Windows 的任务管理器,它会实时刷新显示 CPU 和内存占用最高的进程
在这里插入图片描述

  • 操作:直接在终端输入 top 并回车
  • 关键信息解读
    • %CPU / %MEM:进程占用的资源比例
    • PID:进程 ID,用于标识唯一进程
    • COMMAND:进程的名字
  • 常用快捷键
    • M:按内存占用排序
    • P:按 CPU 占用排序(默认)
    • q:退出 top 界面

2)ps 命令:静态进程快照

ps 用于获取执行命令那一刻的进程信息

2.1)常用组合一:ps aux
  • a:显示所有终端下的进程
  • u:显示进程的所有者(用户)信息
  • x:显示没有控制终端的进程(后台进程)

2.2)常用组合二:ps -ef

查看进程的父子关系(UID, PID, PPID):

  • PID:进程的唯一标识号
  • UID:运行该进程的用户。这里全是 root(超级管理员)
  • PPID:父进程 ID 这在分析 fork() 产生的多进程程序时非常有用

在这里插入图片描述


2.3)结合 grep 过滤

如果你只想找特定的进程

# 假设你想查找名字里包含 "bash" 的进程
ps aux | grep bash


💻结尾— 核心连接协议

警告: 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠


【📡】 建立深度链接: 关注本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。

【⚡】 能量过载分发: 执行点赞操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。

【💾】 离线缓存核心: 将本页加入收藏。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。

【💬】 协议加密解密:评论区留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。

【🛰️】 信号频率投票: 通过投票发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。


在这里插入图片描述
在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐