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

Windows进程线程模型

进程

概述

  1. Windows中进程是程序执行的实例,包含代码、数据、资源(如内存、文件句柄)以及独立的内存空间
  2. 每个进程拥有唯一的进程环境块(PEB),用于维护进程状态和资源信息

进程内核对象(PCB

  1. 由内核管理的不可见数据结构,记录进程优先级、状态(创建/就绪/运行/阻塞)、安全属性等元信息

虚拟地址空间

  1. 默认4GB(用户区0-2GB,系统区2-4GB),支持动态内存分配和模块加载(如DLL

物理内存

  1. 物理内存(Physical Memory)是计算机硬件中通过内存条(RAM)提供的实际存储空间,直接由CPU访问
    1. 物理内存以存储芯片形式存在,插在主板的内存槽上,常见容量为4GB8GB及以上
    2. CPU地址总线决定最大物理内存支持
      例如,32CPU最大支持4GB物理内存,而64CPU可支持TB级内存、
  2. 作用性能
    1. 临时存储:程序运行时,操作系统将数据和代码加载到物理内存中,供CPU快速读取
    2. 性能瓶颈:物理内存不足时,系统会频繁使用虚拟内存(硬盘交换),导致性能下降

虚拟内存

  1. 虚拟内存(Virtual Memory)是操作系统通过硬盘空间扩展内存容量的一种技术,其核心是分页文件(如WindowsPageFile.sys
    1. 操作系统将物理内存中暂时不用的数据(页面)交换到硬盘,腾出空间供其他程序使用;需要时再将数据从硬盘加载回内存
    2. 地址空间虚拟化:应用程序看到的是一块连续的逻辑内存地址,实际数据可能分散在物理内存和硬盘中
  2. 优势与局限性
    1. 扩展内存容量:突破物理内存限制,支持运行更大程序或多任务并行
    2. 性能折损:硬盘读写速度远低于物理内存(约30倍差距),频繁交换会导致系统变慢

地址空间虚拟化

  1. 定义
    1. 指操作系统为每个进程创建一个连续的、独立于物理内存的逻辑地址空间,使得进程在运行时认为自己独占内存资源
    2. 隔离性:防止进程间非法访问内存(如修改其他进程的数据)
    3. 抽象化:隐藏物理内存分布细节,简化程序开发(开发者无需关心实际物理地址)
    4. 扩展性:允许进程使用超过物理内存容量的虚拟地址空间(通过分页与交换技术)
  2. 实现机制如下:
  3. 第一:分段与分页
    1. 分段机制:将虚拟地址空间划分为逻辑段(代码段、堆、栈等),每段通过基址和界限寄存器映射到物理内存
      例如,Linux将进程空间分为用户区(0-3GB)和内核区(3-4GB),用户区包含代码段、堆栈等
    2. 分页机制:将虚拟地址空间划分为固定大小的页(如4KB),物理内存划分为相同大小的页帧
      操作系统通过页表(Page Table)维护虚拟页号(VPN)到物理页帧号(PFN)的映射
      例如,虚拟地址0x12345678分为VPN(前20位)和页内偏移(后12位),通过页表转换为物理地址
  4. 第二:内存管理单元
    1. MMUCPU中的硬件组件,负责实时转换虚拟地址为物理地址
    2. 当进程访问虚拟地址时,MMU自动查询页表完成映射
    3. TLB快表:MMU内置高速缓存(TLB),存储常用页表项,减少内存访问延迟。
      TLB未命中,才需访问内存中的页表
  5. 第三:动态地址重定位与保护
    1. 操作系统通过基址/界限寄存器动态调整进程的物理内存位置,并限制访问范围(防止越界)
    2. 页表中设置保护位(如只读、不可执行),确保进程无法非法操作关键内存区域(如内核空间)

PE头

  1. 概述
    1. Windows可执行文件(如EXEDLLSYS等)的核心数据结构,负责描述文件的组织形式、内存映射规则及运行时关键信息
    2. 具体结构如下:
  2. DOS头(IMAGE_DOS_HEADER
    1. 作用:兼容16DOS系统,提供基础的DOS程序加载支持
    2. e_magic:固定为0x5A4DASCII为"MZ"),标识DOS可执行文件
    3. e_lfanew32位偏移值,指向PE头的起始位置(即NT头)
  3. DOS存根(DOS Stub
    1. 内容:一段简单的DOS程序,通常输出提示信息(如“This program cannot be run in DOS mode.”)
    2. 意义:在DOS环境下运行时提示用户系统不兼容,而在Windows中该部分被忽略
  4. NT头(IMAGE_NT_HEADERS
    1. Signature:固定为0x00004550ASCII为"PE\0\0"),标识PE文件
    2. File HeaderIMAGE_FILE_HEADER):
      Machine:目标CPU架构(如0x014C表示x860x8664表示x64
      NumberOfSections:节(Section)的数量
      TimeDateStamp:文件编译时间戳
    3. Optional HeaderIMAGE_OPTIONAL_HEADER):
      AddressOfEntryPoint:程序入口点(RVA形式)
      ImageBase:默认加载基地址(如EXE通常为0x00400000DLL0x10000000
      SectionAlignmentFileAlignment:内存与文件对齐粒度(如内存对齐4KB,文件对齐512字节)
      DataDirectory16个数据目录表,记录导入表、导出表、资源表等关键结构的RVA和大小
  5. 节表(Section Table
    1. 功能:定义各节(如.text.data.rsrc)的属性与位置
      节属性:读写(0x80000000)、可执行(0x20000000)等
      文件与内存映射:节在文件中按FileAlignment对齐,加载时按SectionAlignment对齐
    2. 典型节类型:
      .text:存放可执行代码
      .data:初始化全局变量
      .rsrc:存储图标、对话框等资源

理解与疑问

  1. 一个exe可以启动多个进程吗?
    1. 可以
    2. EXE 文件是静态的:EXE 是存储在磁盘上的可执行文件,包含程序代码和资源
    3. 进程是动态的运行时实例:当双击 EXE 文件或通过代码(如 CreateProcess)启动程序时,操作系统会为 EXE 创建一个独立的进程,分配内存、资源(如文件句柄)和唯一的进程 IDPID
    4. 多实例运行:同一 EXE 文件可以被多次执行,每次都会生成一个独立的进程
  2. 编译好的EXE文件,内部包含了具体的数据,代码,可能还有ICON资源,某种程度EXE是不是可以理解成为一个压缩包,双击这个压缩包,是不是就是操作系统读取这个压缩包里面的内容,并按照自己的规则去处理里面的数据?
    1. EXE文件确实包含代码、数据和资源(如ICON、字符串等),这些内容以二进制形式组织在文件中
    2. 某些安装程序(如NSIS制作的安装包)会将多个文件压缩后嵌入EXE中,此时EXE实际上是一个自解压包。运行时,操作系统需解压这些内容到临时目录,再执行安装逻辑。
    3. EXE文件头(如PE头)定义了代码段、数据段、资源表等信息,类似于压缩包的目录结构
      PE头:记录入口点、段偏移、依赖库(导入表)
      资源表:存储图标、位图等非代码资源
    4. EXE:核心是可执行代码,需由操作系统加载器解析后运行,包含CPU指令和程序逻辑
      压缩包:仅用于存储和压缩文件,需第三方工具解压后才能使用内容
  3. EXE的执行流程
    1. 内存加载:操作系统将EXE映射到虚拟内存,调整重定位指针(如段地址偏移)
    2. 动态链接:通过导入表加载依赖的DLL,并解析函数地址
    3. 入口点执行:从mainWinMain开始执行代码,而非单纯释放文件

线程

概述

  1. 作为调度的基本单位,线程共享进程资源(如内存),但拥有独立的栈、寄存器状态和线程环境块(TEB

线程内核对象(TCB

  1. 存储调度信息(优先级、执行时间片)、线程上下文(寄存器值、指令指针)

用户态与内核态堆栈

  1. 分别用于函数调用和系统调用时的上下文保存

进程与线程关系

角色分离

  1. 进程负责资源分配(如内存保护),线程负责执行调度
  2. 一个进程至少包含一个主线程,可派生多线程实现并发

共享与独立

  1. 线程共享进程的全局变量和文件句柄,但拥有独立栈和寄存器状态,切换开销远小于进程

调度机制

优先级调度

  1. 基于动态优先级(0-31级),实时线程(>15级)优先于普通线程

时间片轮转

  1. 默认时间片约20ms,防止单线程独占CPU,确保响应性

状态转换

  1. 包括运行态、就绪态、阻塞态
  2. 线程可通过SuspendThread挂起或通过I/O操作进入等待状态

与Unix的差异

进程层次

  1. Unix采用树状结构(init为根),Windows进程平等,仅通过句柄控制父子关系

线程模型

  1. Windows原生支持内核级线程(KLT),而Unix早期依赖用户级线程(ULT

Windows IPC通信方式与实现

共享内存

概述

  1. 通过CreateFileMapping创建内存映射文件,MapViewOfFile映射到进程地址空间

特点

  1. 高效(直接内存读写),需配合同步机制(如互斥锁)

匿名管道

概述

  1. 通过CreatePipe创建

特点

  1. 单向通信,适用于父子进程

命名管道

概述

  1. 使用CreateNamedPipeConnectNamedPipe

特点

  1. 支持跨进程双向通信

消息传递:消息队列

概述

  1. 通过PostMessage或自定义消息(WM_USER+),常用于GUI进程间通信

特点

消息传递:邮件槽

概述

特点

  1. 基于广播的通信,支持一对多消息传输,适用于局域网

其他机制

剪贴板

  1. 概述
  2. 特点
    1. 跨进程数据交换,支持格式协商(CF_TEXT/CF_BITMAP

RPC(远程过程调用)

  1. 概述
  2. 特点
    1. 跨网络通信,通过IDL定义接口,自动生成桩代码

COM/DCOM

  1. 概述
  2. 特点
    1. 基于组件的跨语言通信,支持接口继承和分布式对象

Windows文件系统

主要文件系统类型

FAT32

  1. 特点
    1. 兼容性强(支持Windows/Linux/macOS),单文件限制4GB,最大分区2TB
  2. 结构
    1. DBR引导扇区 + 双FAT表 + 根目录区 + 数据区

NTFS

  1. 特点
    1. 支持ACL权限、日志记录、磁盘配额,最大文件16EB,支持加密(EFS)和压缩
  2. 元文件
    1. 包含$MFT(主文件表)、$LogFile(事务日志)等16个系统文件

exFAT

  1. 特点
    1. 专为闪存设计,支持大文件(16EB)和跨平台,无日志功能,适合U盘/SD

ReFS

  1. 特点
    1. 抗数据损坏(校验和自动修复),支持存储池和虚拟化,适用于服务器/云存储

文件系统选择场景

系统盘

  1. 必须使用NTFS(支持启动和系统保护)

移动设备

  1. exFAT(大文件兼容)或FAT32(老旧设备)

数据中心

  1. ReFS(高可靠性和自动修复)

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

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2025-03-30
Everything will be better.

发表评论

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