Linux开发学习第六天——进程内存模型、状态

目录

一、进程控制块PCB

1.概述

1. PCB ↔ 进程内存模型

2. PCB ↔ 调度器

3. PCB ↔ 上下文切换

4. PCB ↔ fork

5. PCB ↔ 僵尸进程

2.PCB里包含了什么

3.PCB存在哪里

二、进程的内存布局

1.Kernel Space——内核空间

2.stack

3.内存映射段 (File Mapping & Anonymous Mapping)

4.heap

5.BSS段(.bss)

6.数据段(.data)

7.代码段(.text)

三、linux进程状态

1.抽象理论状态

2.内核中实际状态类型

2.1.内核里的 5 种基础状态

2.2ps /top 里的状态码(最常用)

3.调度队列

3.1就绪队列

3.2等待队列

3.3终止队列


一、进程控制块PCB

1.概述

Linux 进程控制块(PCB)= task_struct

Linux 里PCB 就是内核中的 struct task_struct,是内核描述一个进程 / 线程的唯一核心数据结构

简化结构:

struct task_struct {
    volatile long state;        /* 进程状态 */
    pid_t pid;                  /* PID */
    pid_t tgid;                 /* 线程组ID */

    struct sched_entity se;     /* 调度实体(CFS用) */
    int prio;                   /* 动态优先级 */
    int static_prio;            /* 静态优先级 */
    unsigned int rt_priority;   /* 实时优先级 */

    struct mm_struct *mm;       /* 虚拟内存空间 */
    struct files_struct *files; /* 打开文件表 */

    struct fs_struct *fs;       /* 目录信息 */

    struct signal_struct *signal; /* 信号 */
    struct sighand_struct *sighand;

    struct task_struct *parent; /* 父进程 */
    struct list_head children;  /* 子进程链表 */

    struct thread_struct thread; /* 硬件上下文 */

    u64 start_time;             /* 启动时间 */
    cputime_t utime, stime;     /* 用户/系统CPU时间 */
};

1. PCB ↔ 进程内存模型

  • task_struct->mm→ 指向整个虚拟地址空间(代码 / 数据 / 堆 / 栈 / 页表)

2. PCB ↔ 调度器

  • task_struct->se→ 调度实体,包含 vruntime,挂在 CFS 红黑树上

3. PCB ↔ 上下文切换

  • task_struct->thread→ 保存所有寄存器,切换时保存 / 恢复现场

4. PCB ↔ fork

  • fork() 本质:
    1. 新建一个 task_struct
    2. 复制或共享 mm_struct(写时复制)
    3. 分配 PID、加入运行队列

5. PCB ↔ 僵尸进程

  • 进程退出,但 task_struct 还在
  • 父进程未 wait() → 变成僵尸

2.PCB里包含了什么

它几乎包含了进程运行需要的所有信息

  1. 进程标识

    • PID、PPID、TGID(线程组 ID)
    • 状态、PID 命名空间
  2. 进程状态

    • TASK_RUNNING
    • TASK_INTERRUPTIBLE(可中断睡眠)
    • TASK_UNINTERRUPTIBLE(不可中断睡眠)
    • TASK_STOPPED / TASK_ZOMBIE
  3. 调度信息(核心)

    • 调度类、调度策略
    • vruntime(CFS 调度用)
    • 优先级、nice 值、实时优先级
    • 时间片、CPU 亲和性
  4. 虚拟内存信息

    • mm_struct *mm:指向整个虚拟地址空间描述符
    • 代码段、数据段、堆、栈、页表等都在这里
    • 线程共享 mm
  5. 文件系统信息

    • 当前工作目录
    • 文件根目录
    • 文件打开表 files_struct
  6. 文件描述符表

    • files_struct *files
    • 0 标准输入、1 标准输出、2 标准错误
  7. 信号相关

    • 阻塞信号掩码
    • 待处理信号
    • 信号处理函数
  8. 上下文切换信息

    • 内核栈指针
    • 硬件上下文(寄存器现场)
    • thread_struct 保存所有寄存器
  9. 时间统计

    • 进程创建时间
    • 用户态 / 内核态 CPU 时间
    • 时间片到期时间
  10. 亲缘与关系

    • 父进程、子进程、兄弟进程链表
    • 线程组、会话、进程组

3.PCB存在哪里

  • task_struct 本身存放在:内核动态内存(slab 分配)
  • 每个进程唯一对应一个 task_struct
  • 内核通过 PID ⇄ task_struct 映射找到进程

二、进程的内存布局

1.Kernel Space——内核空间

  • 32 位:从 0xC00000000xFFFFFFFF(约 1G)
  • 64 位:更高地址范围从0xFFFF800000000000 到 0xFFFFFFFFFFFFFFFF
  • 所有进程共享,只有内核态可访问

2.stack

  • 局部变量、函数调用栈帧、返回地址、寄存器上下文
  • 从高地址向低地址增长
  • 有大小限制(默认 8MB 左右)
  • argv 和 environ放在栈顶

3.内存映射段 (File Mapping & Anonymous Mapping)

  • 动态库 .so、文件映射、匿名大内存分配
  • 栈与堆之间的区域
  • mmap/munmap 操作

4.heap

  • malloc/new 分配的空间
  • 从低地址向高地址增长
  • brk/sbrkmmap 扩展

5.BSS段(.bss)

  • 未初始化 / 初始化为 0 的全局 / 静态变量
  • 不占 ELF 文件大小,加载时清零

6.数据段(.data)

  • 已初始化的全局变量、静态变量
  • 权限:可读可写

7.代码段(.text)

  • 存放编译好的二进制指令
  • 权限:只读 + 可执行
  • 对应 objdump -d 看到的代码

三、linux进程状态

1.抽象理论状态

初始态、就绪态、运行态、阻塞态、僵尸态

2.内核中实际状态类型

2.1.内核里的 5 种基础状态

内核 task_struct 里用 state 字段表示:

  1. TASK_RUNNING

    • 可运行状态
    • 要么正在 CPU 上运行,要么在运行队列里等待 CPU
    • 对应 ps:R
    • 在 CFS 红黑树上的进程
  2. TASK_INTERRUPTIBLE

    • 可中断睡眠
    • 等待某事件(信号、IO、锁)
    • 收到信号可以被唤醒
    • 对应 ps:S
    • 等待队列里睡觉(你前面学的 wait_queue)
  3. TASK_UNINTERRUPTIBLE

    • 不可中断睡眠
    • 一般在磁盘 IO、关键内核操作
    • 信号也唤不醒,只能等事件完成
    • 对应 ps:D(高危状态,多了会导致 load 飙高)
    • 常见于 read/writemutexdown 信号量等阻塞
  4. TASK_STOPPED

    • 暂停 / 被调试
    • Ctrl+Zdebug
    • 对应 ps:T
  5. TASK_ZOMBIE

    • 僵尸状态
    • 进程已退出,但父进程没 wait ()
    • 内核还保留其 task_struct
    • 对应 ps:Z

2.2ps /top 里的状态码(最常用)

  • R:Running/Runnable(运行 / 就绪)
  • S:Interruptible sleep(可中断睡眠)
  • D:Uninterruptible sleep(IO 深度睡眠,不可杀)
  • T:Stopped(暂停 / 被调试)
  • Z:Zombie(僵尸)
  • I:Idle(内核专用的空闲线程)

额外修饰:

  • s:session leader
  • l:多线程
  • +:前台进程
  • <:高优先级
  • N:低优先级

3.调度队列

3.1就绪队列

存放就绪态的进程。

3.2等待队列

存放阻塞态的进程。

3.3终止队列

存放处于终止态或僵尸态,等待被回收的进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值