Windows
进程线程模型
进程
概述
Windows
中进程是程序执行的实例,包含代码、数据、资源(如内存、文件句柄)以及独立的内存空间- 每个进程拥有唯一的进程环境块(
PEB
),用于维护进程状态和资源信息
进程内核对象(PCB
)
- 由内核管理的不可见数据结构,记录进程优先级、状态(创建/就绪/运行/阻塞)、安全属性等元信息
虚拟地址空间
- 默认
4GB
(用户区0-2GB
,系统区2-4GB
),支持动态内存分配和模块加载(如DLL
)
物理内存
- 物理内存(
Physical Memory
)是计算机硬件中通过内存条(RAM
)提供的实际存储空间,直接由CPU
访问- 物理内存以存储芯片形式存在,插在主板的内存槽上,常见容量为
4GB
、8GB
及以上 CPU
地址总线决定最大物理内存支持
例如,32
位CPU
最大支持4GB
物理内存,而64
位CPU
可支持TB
级内存、
- 物理内存以存储芯片形式存在,插在主板的内存槽上,常见容量为
- 作用性能
- 临时存储:程序运行时,操作系统将数据和代码加载到物理内存中,供
CPU
快速读取 - 性能瓶颈:物理内存不足时,系统会频繁使用虚拟内存(硬盘交换),导致性能下降
- 临时存储:程序运行时,操作系统将数据和代码加载到物理内存中,供
虚拟内存
- 虚拟内存(
Virtual Memory
)是操作系统通过硬盘空间扩展内存容量的一种技术,其核心是分页文件(如Windows
的PageFile.sys
)- 操作系统将物理内存中暂时不用的数据(页面)交换到硬盘,腾出空间供其他程序使用;需要时再将数据从硬盘加载回内存
- 地址空间虚拟化:应用程序看到的是一块连续的逻辑内存地址,实际数据可能分散在物理内存和硬盘中
- 优势与局限性
- 扩展内存容量:突破物理内存限制,支持运行更大程序或多任务并行
- 性能折损:硬盘读写速度远低于物理内存(约
30
倍差距),频繁交换会导致系统变慢
地址空间虚拟化
- 定义
- 指操作系统为每个进程创建一个连续的、独立于物理内存的逻辑地址空间,使得进程在运行时认为自己独占内存资源
- 隔离性:防止进程间非法访问内存(如修改其他进程的数据)
- 抽象化:隐藏物理内存分布细节,简化程序开发(开发者无需关心实际物理地址)
- 扩展性:允许进程使用超过物理内存容量的虚拟地址空间(通过分页与交换技术)
- 实现机制如下:
- 第一:分段与分页
- 分段机制:将虚拟地址空间划分为逻辑段(代码段、堆、栈等),每段通过基址和界限寄存器映射到物理内存
例如,Linux
将进程空间分为用户区(0-3GB
)和内核区(3-4GB
),用户区包含代码段、堆栈等 - 分页机制:将虚拟地址空间划分为固定大小的页(如
4KB
),物理内存划分为相同大小的页帧
操作系统通过页表(Page Table
)维护虚拟页号(VPN
)到物理页帧号(PFN
)的映射
例如,虚拟地址0x12345678
分为VPN
(前20
位)和页内偏移(后12
位),通过页表转换为物理地址
- 分段机制:将虚拟地址空间划分为逻辑段(代码段、堆、栈等),每段通过基址和界限寄存器映射到物理内存
- 第二:内存管理单元
MMU
是CPU
中的硬件组件,负责实时转换虚拟地址为物理地址- 当进程访问虚拟地址时,
MMU
自动查询页表完成映射 TLB
快表:MMU
内置高速缓存(TLB
),存储常用页表项,减少内存访问延迟。
若TLB
未命中,才需访问内存中的页表
- 第三:动态地址重定位与保护
- 操作系统通过基址/界限寄存器动态调整进程的物理内存位置,并限制访问范围(防止越界)
- 页表中设置保护位(如只读、不可执行),确保进程无法非法操作关键内存区域(如内核空间)
PE头
- 概述
Windows
可执行文件(如EXE
、DLL
、SYS
等)的核心数据结构,负责描述文件的组织形式、内存映射规则及运行时关键信息- 具体结构如下:
DOS
头(IMAGE_DOS_HEADER
)- 作用:兼容
16
位DOS
系统,提供基础的DOS
程序加载支持 e_magic
:固定为0x5A4D
(ASCII
为"MZ
"),标识DOS
可执行文件e_lfanew
:32
位偏移值,指向PE
头的起始位置(即NT
头)
- 作用:兼容
DOS
存根(DOS Stub
)- 内容:一段简单的
DOS
程序,通常输出提示信息(如“This program cannot be run in DOS mode.
”) - 意义:在
DOS
环境下运行时提示用户系统不兼容,而在Windows
中该部分被忽略
- 内容:一段简单的
NT
头(IMAGE_NT_HEADERS
)Signature
:固定为0x00004550
(ASCII
为"PE\0\0
"),标识PE
文件File Header
(IMAGE_FILE_HEADER
):
Machine
:目标CPU
架构(如0x014C
表示x86
,0x8664
表示x64
)
NumberOfSections
:节(Section
)的数量
TimeDateStamp
:文件编译时间戳Optional Header
(IMAGE_OPTIONAL_HEADER
):
AddressOfEntryPoint
:程序入口点(RVA
形式)
ImageBase
:默认加载基地址(如EXE
通常为0x00400000
,DLL
为0x10000000
)
SectionAlignment
和FileAlignment
:内存与文件对齐粒度(如内存对齐4KB
,文件对齐512
字节)
DataDirectory
:16
个数据目录表,记录导入表、导出表、资源表等关键结构的RVA
和大小
- 节表(
Section Table
)- 功能:定义各节(如
.text
、.data
、.rsrc
)的属性与位置
节属性:读写(0x80000000
)、可执行(0x20000000
)等
文件与内存映射:节在文件中按FileAlignment
对齐,加载时按SectionAlignment
对齐 - 典型节类型:
.text
:存放可执行代码
.data
:初始化全局变量
.rsrc
:存储图标、对话框等资源
- 功能:定义各节(如
理解与疑问
- 一个
exe
可以启动多个进程吗?- 可以
EXE
文件是静态的:EXE
是存储在磁盘上的可执行文件,包含程序代码和资源- 进程是动态的运行时实例:当双击
EXE
文件或通过代码(如CreateProcess
)启动程序时,操作系统会为EXE
创建一个独立的进程,分配内存、资源(如文件句柄)和唯一的进程ID
(PID
) - 多实例运行:同一
EXE
文件可以被多次执行,每次都会生成一个独立的进程
- 编译好的
EXE
文件,内部包含了具体的数据,代码,可能还有ICON
资源,某种程度EXE
是不是可以理解成为一个压缩包,双击这个压缩包,是不是就是操作系统读取这个压缩包里面的内容,并按照自己的规则去处理里面的数据?EXE
文件确实包含代码、数据和资源(如ICON
、字符串等),这些内容以二进制形式组织在文件中- 某些安装程序(如
NSIS
制作的安装包)会将多个文件压缩后嵌入EXE
中,此时EXE
实际上是一个自解压包。运行时,操作系统需解压这些内容到临时目录,再执行安装逻辑。 EXE
文件头(如PE
头)定义了代码段、数据段、资源表等信息,类似于压缩包的目录结构
PE
头:记录入口点、段偏移、依赖库(导入表)
资源表:存储图标、位图等非代码资源EXE
:核心是可执行代码,需由操作系统加载器解析后运行,包含CPU
指令和程序逻辑
压缩包:仅用于存储和压缩文件,需第三方工具解压后才能使用内容
EXE
的执行流程- 内存加载:操作系统将EXE映射到虚拟内存,调整重定位指针(如段地址偏移)
- 动态链接:通过导入表加载依赖的
DLL
,并解析函数地址 - 入口点执行:从
main
或WinMain
开始执行代码,而非单纯释放文件
线程
概述
- 作为调度的基本单位,线程共享进程资源(如内存),但拥有独立的栈、寄存器状态和线程环境块(
TEB
)
线程内核对象(TCB
)
- 存储调度信息(优先级、执行时间片)、线程上下文(寄存器值、指令指针)
用户态与内核态堆栈
- 分别用于函数调用和系统调用时的上下文保存
进程与线程关系
角色分离
- 进程负责资源分配(如内存保护),线程负责执行调度
- 一个进程至少包含一个主线程,可派生多线程实现并发
共享与独立
- 线程共享进程的全局变量和文件句柄,但拥有独立栈和寄存器状态,切换开销远小于进程
调度机制
优先级调度
- 基于动态优先级(
0-31
级),实时线程(>15
级)优先于普通线程
时间片轮转
- 默认时间片约
20ms
,防止单线程独占CPU
,确保响应性
状态转换
- 包括运行态、就绪态、阻塞态
- 线程可通过
SuspendThread
挂起或通过I/O
操作进入等待状态
与Unix的差异
进程层次
Unix
采用树状结构(init
为根),Windows
进程平等,仅通过句柄控制父子关系
线程模型
Windows
原生支持内核级线程(KLT
),而Unix
早期依赖用户级线程(ULT
)
Windows IPC通信方式与实现
共享内存
概述
- 通过
CreateFileMapping
创建内存映射文件,MapViewOfFile
映射到进程地址空间
特点
- 高效(直接内存读写),需配合同步机制(如互斥锁)
匿名管道
概述
- 通过
CreatePipe
创建
特点
- 单向通信,适用于父子进程
命名管道
概述
- 使用
CreateNamedPipe
和ConnectNamedPipe
特点
- 支持跨进程双向通信
消息传递:消息队列
概述
- 通过
PostMessage
或自定义消息(WM_USER+
),常用于GUI
进程间通信
特点
消息传递:邮件槽
概述
特点
- 基于广播的通信,支持一对多消息传输,适用于局域网
其他机制
剪贴板
- 概述
- 特点
- 跨进程数据交换,支持格式协商(
CF_TEXT/CF_BITMAP
)
- 跨进程数据交换,支持格式协商(
RPC
(远程过程调用)
- 概述
- 特点
- 跨网络通信,通过
IDL
定义接口,自动生成桩代码
- 跨网络通信,通过
COM/DCOM
- 概述
- 特点
- 基于组件的跨语言通信,支持接口继承和分布式对象
Windows
文件系统
主要文件系统类型
FAT32
- 特点
- 兼容性强(支持
Windows/Linux/macOS
),单文件限制4GB
,最大分区2TB
- 兼容性强(支持
- 结构
DBR
引导扇区 + 双FAT
表 + 根目录区 + 数据区
NTFS
- 特点
- 支持
ACL
权限、日志记录、磁盘配额,最大文件16EB
,支持加密(EFS
)和压缩
- 支持
- 元文件
- 包含
$MFT
(主文件表)、$LogFile
(事务日志)等16
个系统文件
- 包含
exFAT
- 特点
- 专为闪存设计,支持大文件(
16EB
)和跨平台,无日志功能,适合U
盘/SD
卡
- 专为闪存设计,支持大文件(
ReFS
- 特点
- 抗数据损坏(校验和自动修复),支持存储池和虚拟化,适用于服务器/云存储
文件系统选择场景
系统盘
- 必须使用NTFS(支持启动和系统保护)
移动设备
exFAT
(大文件兼容)或FAT32
(老旧设备)
数据中心
ReFS
(高可靠性和自动修复)
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Windows 核心编程 _ 进程四06/25
- ♥ X86_64汇编学习记述三08/08
- ♥ Windows 核心编程 _ 进程二06/19
- ♥ Windows 核心编程 _ 内核对象:线程同步二07/30
- ♥ 各平台调试方法总结记述一09/25
- ♥ Windows 核心编程 _ 线程调度07/07