• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-12-13 19:38 Aet 隐藏边栏 |   抢沙发  1 
文章评分 1 次,平均分 5.0

进程

本质

  1. 进程是资源分配的基本单位,是一个执行环境的容器
  2. Windows内核中,每个进程由一个EPROCESSExecutive Process)结构体表示

EPROCESS关键结构

进程地址空间

  1. 概述
    1. 每个进程拥有独立的虚拟地址空间(32位系统4GB64位系统理论上256TB
  2. 用户空间布局(64位)
    1. 0x00000000'00000000 - 0x00007FFF'FFFFFFFF:用户空间(低128TB
    2. 可执行文件映像、DLL模块、堆、栈、TEB等都在这里
  3. 内核空间布局:
    1. 0xFFFF8000'00000000 - 0xFFFFFFFF'FFFFFFFF:内核空间(高128TB
    2. 所有进程共享同一内核空间映射

虚拟地址描述符(VAD

  1. VAD树是一个AVL平衡树,记录进程的每个内存区域:

  1. windbg

进程环境块(PEB

  1. PEB位于用户空间,包含进程的运行时信息:

  1. windbg

句柄表(Handle Table

  1. 进程通过句柄访问内核对象(文件、事件、互斥体等):

  1. windbg

进程创建流程

线程

本质

  1. 线程是CPU调度的基本单位,是进程内的执行流
  2. 每个线程由ETHREADExecutive Thread)结构表示

ETHREAD关键结构

KTHREAD关键结构

  1. KTHREADETHREAD的一部分,包含调度相关信息:

线程环境块(TEB

  1. 每个线程有自己的TEB,位于用户空间:

  1. 访问TEB

线程栈

  1. 概述
    1. 每个线程有两个栈
  2. 用户态栈
    1. 默认大小1MB(可通过链接器设置)
    2. 从高地址向低地址增长
    3. 栈顶由TEB记录
    4. 栈溢出保护页(Guard Page
  3. 内核态栈
    1. 大小12KBx86)或24KBx64
    2. 系统调用或中断时使用
    3. 保存在KTHREAD
  4. windbg

线程状态转换

线程调度机制与原理

Windows调度器架构

  1. Windows使用基于优先级的抢占式多任务调度

优先级系统

调度队列

  1. 每个逻辑处理器维护一组就绪队列

调度算法

  1. 优先级提升

  1. 时间片

  1. CPU亲和性(Affinity

  1. NUMA感知

多核调度优化

  1. 核心停放(Core Parking

  1. SMT/超线程调度

调度器数据结构

  1. KPRCBProcessor Control Block

  1. windbg

线程上下文切换

上下文概念

  1. 线程上下文包括CPU寄存器状态和必要的执行环境信息

完整上下文(CONTEXT结构)

上下文完整切换过程

  1. 中断或系统调用触发
    1. 时间片耗尽(时钟中断)
    2. 线程主动放弃CPUSleepWaitForSingleObject
    3. 高优先级线程就绪(抢占)
  2. 保存当前线程上下文
    1. 用户态→内核态切换时:
      CPU自动保存SS, RSP, RFLAGS, CS, RIP到内核栈
      中断处理程序保存其他寄存器到陷阱帧(KTRAP_FRAME
    2. 调度器接管
      保存内核态寄存器到KTHREAD
      保存浮点状态(如果使用了)
      更新线程统计信息(运行时间等)
  3. 选择下一个线程
    1. 扫描就绪队列,选择最高优先级就绪线程
    2. 更新KPRCBCurrentThread
    3. 如果跨进程切换,还需要切换地址空间
  4. 加载新线程上下文
    1. 切换地址空间(如果需要):
      加载新的CR3寄存器(页表基址)
      刷新TLBTranslation Lookaside Buffer
    2. 恢复线程上下文:
      KTHREAD恢复内核态寄存器
      切换到新线程的内核栈
      恢复浮点状态
    3. 返回用户态:
      从陷阱帧恢复用户态寄存器
      IRET指令返回用户态(恢复CS, RIP, RFLAGS, SS, RSP
  5. 新线程继续执行

陷阱帧(KTRAP_FRAME

  1. 保存用户态到内核态切换时的寄存器

  1. windbg

上下文切换成本

  1. 直接成本

  1. 间接成本

  1. 减少上下文切换的策略

线程同步机制

概述

  1. 线程同步解决多线程访问共享资源时的竞争条件和数据一致性问题

临界区(Critical Section

  1. 特点

  1. 内部结构

  1. 工作原理

  1. windbg

互斥体(Mutex

  1. 特点

  1. 内部实现

  1. 等待机制

信号量(Semaphore

  1. 特点

  1. 工作原理

事件(Event

  1. 特点

  1. 状态转换

读写锁(SRW Lock - Slim Reader/Writer Lock

  1. 特点

  1. 工作模式

  1. 内部实现

条件变量(Condition Variable

  1. 特点

  1. 使用模式

自旋锁(Spinlock

  1. 特点

  1. 实现原理

进程间同步

命名互斥体(Named Mutex

  1. 确保只有一个进程访问资源,没有传递任何数据

命名事件(Event

  1. B等待A完成,只是协调执行顺序,没有数据内容

命名信号量(Semaphore

  1. 控制并发访问数量,不传递数据

命名管道(Named Pipe

  1. 虽然主要用于通信,但也能实现同步

邮槽(Mailslot

  1. 单向广播通信机制,可用于简单同步

WM_COPYDATA消息(窗口程序)

  1. 进程间发送消息,实现同步通知

全局原子(Global Atom

  1. 共享字符串的轻量级机制

作业对象(Job Object

  1. 控制和同步一组进程
    1. 注意是一组进程,并非进程间

进程间通信

管道

  1. 父进程向子进程发送了"Hello"这个数据

命名管道(Named Pipe

  1. 客户端向服务器传递数据

共享内存

  1. 进程A向进程B传递了"Shared Data"

消息队列

  1. 发送消息和数据

套接字(Socket

  1. 网络数据传输

RPCRemote Procedure Call

  1. 传递参数和返回值

COMComponent Object Model

  1. 方法调用传递数据

其他

死锁

  1. 场景

  1. windbg

原子操作

  1. InterlockedXxx系列:

内存屏障

  1. 内存序保证

Dump分析中的应用

查看进程信息

分析线程状态

同步问题诊断

关键分析技巧

  1. 死锁分析:
    1. 找出Waiting状态的线程
    2. 查看等待的对象(WaitBlockList
    3. 找到对象的拥有者
    4. 构建等待图,识别环
  2. 性能问题:
    1. 使用!runaway查看CPU时间
    2. 检查是否过度上下文切换
    3. 分析锁竞争(!cs -s查看争用计数)
    4. 检查优先级反转
  3. 内存访问违例:
    1. 查看陷阱帧确定异常地址
    2. 检查VAD确认地址是否有效
    3. 分析调用栈推断原因

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享