【Windows学习笔记】2:Process、Thread、Fiber、UMS、Job

1 Windows API和System Call

Windows API指那些Windows暴露给调用方的documented的subroutine,一般都可以在MSDN上直接搜到,比如CreateProcessCreateFile等。

System Call或者叫Native System Service,指那些undocumented,从user-mode调用OS服务的接口,比如NtCreateUserProcess就是CreateUserProcess这个Windows API下游调的系统调用。

2 Process

一个Windows Process包含:

  • Private Virtual Address Space:给这个process用
  • Executable Program:定义了要执行的code和data,会被map到这个虚拟地址空间里来
  • Opened Handles:它们map到各种system resource里,比如semaphore、sync obj、files等
  • Process ID:Windows Process没有global name,只能显示program name,所以只能用PID区分
  • Threads:大多情况下,empty process没用作用,所以至少要有一个thread
  • Security Context:是一个包括user access、security group、privilege等的access token

上图中VAD是virutal address descriptor,虚拟地址描述符,是用来track这个process在使用的虚拟地址的数据结构。

注意parent process不一定是creator process,用tlist /t可以看进程树关系,如果parent process死了,不会去找grandparent作为自己的parent,而是直接把process显示成left-justified就行。

每个进程有自己的虚拟地址空间,进程内的所有线程共享这个虚拟地址空间,所以进程内的所有线程都对这个虚拟地址空间有完全的读写权限。但是进程不能访问别的进程的地址空间,除非另一个进程将它私有地址空间的一部分map成共享的(在Windows里叫file mapped object),或者一个进程有权打开另一个进程使用跨越进程的内存函数,比如ReadProecessMemoryWriteProcessMemory

这里下载Process Explorer,可以完整的看到Process Tree View,以及process使用的handle、DLL、thread activity、thrad stack(包括user-mode/kernel-mode)、CPU%、integrity level、memory详细信息(paged/non-paged等)。

如果要配置symbols要设置Debugging Tools的Dbghelper.dll以及Symbols Path:

很多其它Tool(比如VS、Debugging Tools)都需要这个Symbols Path,可以统一配置到环境变量_NT_SYMBOL_PATH里免得每次都重新配置。

3 Thread

一个Windows线程包含以下内容:

  • 表示处理器状态的一组CPU寄存器内容
  • User-mode和kernel-mode的两个stack
  • TLS:一个私有的存储区域,给subsystem、run-time lib和DLL使用
  • Thread ID:注意在Windows下Thread ID和Process ID是同一个namespace下生成的,所以不会重复,统称Client ID

此外,thread还可能有自己的security context和access token。

Volatile Registers、Stacks、Private Storage Area三者共同组成Thread的context,可以用GetThreadConext获取,称为CONTEXT block。

由于线程之间切换涉及kernel scheduler,所以很expensive,Windows引入了fiberuser-mode scheduling (UMS) 两种方式来减少这种cost。

如果32bit的application跑在64bit的Windows上,会同时包含32bit和64bit的CONTEXT block,也会有两个user-mode stack。

4 Fiber

也叫lightweight thread。Fiber让application自己schedule own threads,而不需要依赖Windows的priority-based scheduling。它的scheduling是在Kernel32.dll里从user-mode实现的,所以对于kernel是invisible的。

具体地,先调用ConvertThreadToFiber让一个thread跑fiber,然后可以通过CreateFiber来创建fiber。每一个fiber从被调SwitchToFiber开始执行,直到退出或者调用了下一个SwitchToFiber

因为fiber的这些特点,大多场景下使用fiber都不是个好主意:

  • scheduling对kernel不可见,未必能很好利用CPU
  • TLS变得无效,因为多个fiber可能跑在同一个thread上,虽然有fiber local storage (FLS),也不能完全解决sharing问题
  • 同一个thread下的fiber在不能在多处理器之间并行调度
  • 绑定fiber的IO基本性能都很差

5 User-mode Scheduling (UMS) Threads

只在64位Windows上能用,和fiber要解决的问题一样,但是有更少的缺陷。和fiber不同,UMS threads是对kernel可见的,每个UMS threads有自己的kernel thread state,所以允许多个UMS threads发出阻塞的系统调用,共享和竞争资源(对于fiber,那就只能卡住所有别的属于这个thread的fiber)。

同时,UMS threads可以在user-mode切换上下文(从一个UMS thread到另一个UMS thread而不涉及kernel scheduler)。当UMS threads执行需要进入kernel的操作(如system call时),就需要切换到专用的kernel-mode thread(directed context switch)。UMS thrads是不完全协作式的可抢占模型。

6 Job

作为Windows进程模型的扩展,Job可以用来管理和操作一组process,它还会记录和这个作业相关的所有流程,以及已经终止的流程的统计信息。

相关推荐
Thexhy32315 小时前
Linux学习,CentOS虚拟机网络存在问题,主网络接口 ens33没有分配到 IP 地址,按照这个流程,99% 的虚拟机无网络访问问题都能得到解决。请从第一
操作系统
CYRUS_STUDIO2 天前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
路由侠内网穿透2 天前
本地部署 GPS 跟踪系统 Traccar 并实现外部访问
运维·服务器·网络·windows·tcp/ip
研华嵌入式2 天前
如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
arm开发·windows·嵌入式硬件
带娃的IT创业者3 天前
Windows 平台上基于 MCP 构建“文心一言+彩云天气”服务实战
人工智能·windows·文心一言·mcp
csdn_aspnet3 天前
Windows Node.js 安装及环境配置详细教程
windows·node.js
摇滚侠3 天前
java语言中,list<String>转成字符串,逗号分割;List<Integer>转字符串,逗号分割
java·windows·list
Source.Liu3 天前
【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
windows·python·自动化
Source.Liu3 天前
【Pywinauto库】12.1 pywinauto.backend 后端内部实施模块
开发语言·windows·python·自动化
私人珍藏库3 天前
[Windows] FileOptimizer v17.1.0_一款文件批量压缩工具
windows·批量压缩