当前位置: 首页 > news >正文

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终止队列

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

http://www.jsqmd.com/news/538756/

相关文章:

  • OpenClaw个人健康助手:GLM-4.7-Flash分析健康数据实践
  • 李宏毅生成式人工智能导论笔记-2024-全-
  • 如何用NVIDIA CUDA加速Gprmax 3.0电磁波模拟?保姆级配置指南
  • 从依赖到自主:手写一个 ICO 文件转换器
  • 零基础调试OpenClaw:nanobot镜像常见报错解决方案
  • 答辩 PPT 高效通关手册:Paperzz AI PPT 让本科生告别熬夜赶稿
  • PortProxyGUI:Windows端口转发的图形化管理工具
  • 别再手动标点了!用Python解析无人机JPG照片,自动获取图上任意点的GPS坐标
  • PDPS16.0单机版安装避坑指南:如何避免SPLMLicenseServer与NX/UG的许可证冲突
  • 英雄联盟工具集League Akari:5个简单步骤快速解决启动失败问题
  • MATLAB通信仿真避坑指南:手把手教你画16PAM/PSK/QAM/CQAM星座图与误码率曲线
  • BACnet vs Modbus TCP vs KNX:三大楼宇协议混用时的5个致命坑及规避方案
  • 现已正式发布: Elastic Cloud Hosted 上的托管 OTLP Endpoint
  • 3大突破:Windows微信自动化技术实现与零成本落地指南
  • OpenClaw私有化方案:Qwen3-VL:30B+飞书自动化助手
  • League-Toolkit:英雄联盟智能助手,突破游戏体验瓶颈
  • KMeans聚类中的距离计算:从欧氏距离到曼哈顿距离的全面解析
  • NaViL-9B多模态实战:从手机拍摄照片到自动生成产品详情页文案
  • 避坑指南:OpenWebUI离线安装中的常见问题及解决方案(含模型加载技巧)
  • 5步玩转OpenDroneMap:从图像到三维模型的全流程指南
  • Win11Debloat:Windows 11终极优化工具完整指南
  • 纽约大学深度学习笔记-全-
  • 新能源汽车线控底盘与智能驾驶ADAS的深度融合:转向系统需求及32页量产设计规范解析
  • 2026年服务落地能力强性价比高的企业微信服务商都有哪些值得推荐的?这家公司值得关注
  • ESP32嵌入式文件系统库sysfile:基于LittleFS的轻量级管理方案
  • 双有源桥DAB变换器:单移相升降压控制及Matlab仿真研究
  • 杭州导演艺考培训性价比咋样,哪家机构值得选择 - 工业推荐榜
  • IndexTTS 2.0实战:用AI为你的短视频快速生成专业级配音
  • 零代码部署:translategemma-4b-it多语言翻译模型快速上手
  • 2026年工会活动服务费用多少,全国性价比高的公司推荐 - mypinpai