个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《Windows Sysinternals实战指南》2.2 进程、线程和作业Process Explorer 眼中的三层结构1、前言不要只把进程当成任务管理器里的一行2、为什么一定要分清进程、线程和作业3、进程资源与权限的边界盒子3.1 进程为什么叫资源边界3.2 在 Process Explorer 里怎么看进程4、线程真正占用 CPU 的执行单元4.1 线程和进程的关系4.2 在 Process Explorer 中查看线程4.3 为什么 Stack 调用栈很关键5、实战案例如何定位一个程序占满一个 CPU 核心5.1 第一步用 Process Explorer 找到高 CPU 进程5.2 第二步进入 Threads 选项卡5.3 第三步查看线程调用栈5.4 第四步形成判断6、作业 Job统一管理一组进程的逻辑绳子6.1 Job 能解决什么问题6.2 Job 的典型能力6.3 哪些场景容易看到 Job 的影子7、三者关系总结排障时要学会切换视角7.1 三层结构对照表7.2 排障时怎么选视角7.3 Sysinternals 的价值8、案例一软件关闭了但后台进程还在跑8.1 排查思路8.2 工单描述示例9、案例二批处理脚本拉起多个子进程如何一键全关9.1 普通做法的问题9.2 Job 思维的价值9.3 对桌面支持的启发10、常见误区很多人其实只看到了表面10.1 误区一看到进程名就下结论10.2 误区二CPU 高就认为整个程序有问题10.3 误区三只看父子进程不看进程组10.4 误区四把 Process Explorer 只当高级任务管理器11、我的实战建议桌面支持怎么用这三层结构11.1 高 CPU 问题11.2 软件残留问题11.3 多进程软件问题11.4 工单记录模板12、总结从任务管理器的一行走向系统结构的三层视角12.1 本文关键知识点速记1、前言不要只把进程当成任务管理器里的一行如果你只把“进程”理解成任务管理器里的一行那么这一节很容易刷新你对 Windows 运行结构的认识。在 Sysinternals 的视角里进程、线程和作业不是三个孤立概念而是 Windows 用来组织、执行和管理程序运行状态的三层结构。可以先记住一句总纲进程是资源边界线程是执行单位作业是进程集合的管理手柄。换成更直观的话进程像一个资源盒子里面装着内存、句柄、安全令牌、DLL 和线程线程是真正在 CPU 上跑代码的执行单元作业也就是 Job Object则像一根逻辑绳子可以把一组进程绑在一起统一限制、统计和终止。Sysinternals 工具真正厉害的地方不只是让你“看到进程”而是让你可以在进程、线程、作业这三层之间切换视角。这样一来很多原本模糊的现象就能被拆成具体对象。比如用户说“电脑很卡某个软件像是死了。”从排障角度不能只停留在“软件卡了”这个表面现象上而要继续追问是哪个进程占用了 CPU 或内存是进程里的哪个线程在持续消耗 CPU这一组进程是不是被某个 Job 对象统一管理它的父进程是谁加载了哪些 DLL持有哪些句柄以哪个用户身份运行这才是 Windows Internals 和 Sysinternals 工具真正能拉开差距的地方。2、为什么一定要分清进程、线程和作业很多 Windows 故障看起来很简单比如程序卡死、CPU 100%、内存占用很高、软件关不掉、后台残留进程或者某个程序一启动就拖慢系统。但 Windows 内部看到的不是一句“软件卡了”而是一组更具体的对象。用户看到的现象Windows 内部真正关注的对象程序卡死进程状态、线程等待、窗口消息响应CPU 很高哪个线程在持续占用 CPU内存爆了进程私有内存、工作集、提交量文件删不掉哪个进程持有文件句柄一堆子进程关不掉父子进程链、Job 管理、服务宿主关系浏览器资源占用高多进程架构、标签页进程、渲染进程、插件进程如果只看任务管理器里的一行进程名很容易把问题看得太粗。更准确的排障方式应该是先定位进程再进入线程层看 CPU 真正消耗者最后在多进程场景下看是否存在统一管理关系。用户反馈程序卡顿 / CPU 高 / 软件无响应先定位进程查看进程资源边界进入线程层查看 CPU 真正消耗者查看调用栈和模块判断是否存在 Job 或进程组统一管理形成可验证结论也就是说看整体用进程看细节用线程看一组进程的统一管理就看作业。这就是本节最核心的理解框架。3、进程资源与权限的边界盒子进程可以理解为一个正在运行的程序实例。书本里通常会说进程是系统进行资源分配和调度的重要对象之一。但如果换成更容易理解的说法进程就是一个资源边界清晰的盒子。这个盒子里通常包含独立的虚拟地址空间、句柄表、安全令牌、环境变量、加载的 DLL、一个或多个线程以及打开的文件、注册表、管道、事件、互斥量等对象。3.1 进程为什么叫资源边界因为一个进程通常拥有自己的资源范围。不同进程之间默认有隔离边界不能随便访问对方的内存和资源。排障时我们看进程其实是在看这个程序实例拥有了什么资源、用了什么权限、加载了什么模块以及正在执行哪些线程。资源对象在进程中的意义虚拟地址空间这个进程自己的内存视图句柄表打开了哪些文件、注册表键、事件、互斥量安全令牌这个进程以谁的身份运行已加载 DLL程序运行依赖了哪些模块线程列表进程内部有哪些执行流从 Sysinternals 视角看进程不是一个名字而是一个带有资源、权限、模块和执行上下文的对象集合。3.2 在 Process Explorer 里怎么看进程Process Explorer 可以看作“任务管理器 Pro 版”但它真正强的地方不是界面好看而是它能把进程背后的结构展开。首先要看进程树。进程树可以告诉我们谁启动了谁、父进程是谁、子进程有哪些、是否存在异常父子关系。例如 explorer.exe 下启动了 chrome.exe、notepad.exe 或 powershell.exe这是常见场景。但如果一个办公软件下面拉起了陌生 EXE就要多留意。explorer.exe ├─ chrome.exe ├─ notepad.exe └─ powershell.exe其次要看资源列。建议重点关注 CPU、Private Bytes、Working Set、Handles、Threads、Company Name 和 Verified Signer。列名作用CPU当前 CPU 占用Private Bytes私有内存占用Working Set当前物理内存工作集Handles句柄数量Threads线程数量Company Name文件厂商信息Verified Signer数字签名状态线程数异常高、句柄数异常高、私有内存持续增长本身就是值得继续排查的信号。最后要看进程属性窗口。双击某个进程后可以重点查看 Image、Performance、Threads、TCP/IP、Security 和 DLLs。这里能看到路径、命令行、启动用户、资源曲线、线程明细、网络连接、安全令牌和加载模块。不要只看进程名。真正关键的是路径、命令行、父进程、签名和资源变化趋势。4、线程真正占用 CPU 的执行单元很多人说“某个进程 CPU 很高”这句话其实还不够精确。因为操作系统真正调度 CPU 的对象是线程也就是Thread。一个进程可以只有一个线程也可以有很多线程。这些线程共享同一个进程的地址空间、句柄表和加载模块但每个线程都有自己的执行路径、栈和调度状态。4.1 线程和进程的关系可以这样理解进程提供资源边界和运行环境线程在这个环境里真正执行代码CPU 实际调度的是线程而不是笼统调度整个进程。概念作用进程提供资源边界和运行环境线程在这个环境里真正执行代码CPU 调度实际调度线程而不是笼统调度整个进程所以当你看到一个进程 CPU 很高时背后真正的问题可能是进程中的某一个线程在死循环也可能是某个线程正在执行计算密集型任务还可能是某个线程卡在第三方 DLL、频繁调用系统 API或者长期等待某个锁。高 CPU 排查必须进入线程层否则只能看到“谁很忙”看不到“谁在里面忙”。4.2 在 Process Explorer 中查看线程操作并不复杂。先打开 Process Explorer找到 CPU 占用高的进程双击该进程切换到Threads选项卡然后按 CPU 列排序。此时你就能看到到底是哪一个线程在持续消耗 CPU。重点关注几个字段TID、CPU、Start Address、State 和 Stack。字段含义TID线程 IDCPU当前线程 CPU 占用Start Address线程起始地址State线程状态Stack调用栈能看到当前执行路径4.3 为什么 Stack 调用栈很关键调用栈可以告诉我们当前线程正在执行哪些函数调用经过了哪些 DLL是否进入了第三方模块是否卡在系统 API是否存在异常等待或循环。比如一个进程 CPU 高进入 Threads 后发现某个线程一直占用 CPU再看 Stack 发现它主要停留在某个第三方插件 DLL 中。这时结论就不能再写成“这个软件 CPU 高”。更准确的写法应该是该软件进程中的某个线程持续占用 CPU调用栈显示主要停留在第三方插件模块需进一步验证该插件是否导致异常。这就是从“感觉卡”走向“证据链排障”的关键一步。5、实战案例如何定位一个程序占满一个 CPU 核心典型场景很常见用户反馈电脑很卡打开任务管理器看到某个程序 CPU 占用很高但不知道为什么。这类问题最怕一句话下结论“软件异常。”这个结论太粗既不能指导修复也不方便后续复盘。5.1 第一步用 Process Explorer 找到高 CPU 进程打开 Process Explorer 后先按 CPU 排序确认哪个进程持续占用 CPU。注意这里要区分瞬时波动和持续占用偶尔跳高不一定是问题持续占用才更值得分析。同时要确认进程路径是否正常、数字签名是否可信、父进程是否合理。因为同名进程不一定等于同一个东西路径和签名比名字更可靠。5.2 第二步进入 Threads 选项卡双击进程后进入 Threads按 CPU 排序观察是否存在某个线程持续占用较高 CPU。例如看到类似情况TID 8120 CPU 87.35% TID 5780 CPU 3.21% TID 6024 CPU 2.11%这说明问题很可能集中在 TID 8120 这个线程上而不是整个进程里的所有线程都异常。5.3 第三步查看线程调用栈选中高 CPU 线程查看 Stack。重点判断它主要停留在程序自身模块、第三方 DLL、系统 DLL还是某个重复出现的函数调用中。如果调用栈长期集中在某个第三方模块后续可以进一步尝试禁用插件、升级组件、回退版本或者联系软件厂商验证。5.4 第四步形成判断排查结论建议这样写通过 Process Explorer 观察该程序进程 CPU 占用持续偏高。 进入 Threads 选项卡后发现 TID 8120 线程长期占用主要 CPU。 进一步查看 Stack发现调用主要集中在 xxx.dll 模块。 初步判断 CPU 异常并非整个程序所有线程共同导致而是由单个高占用线程触发。不要直接写“软件异常”。要尽量写清楚哪个进程、哪个线程、哪个模块、什么证据。6、作业 Job统一管理一组进程的逻辑绳子作业对象也就是Job Object是很多人平时不太关注但在现代 Windows 系统中非常重要的概念。如果说进程是单个资源账户线程是账户里的具体执行动作那么 Job 更像一个“家庭账户”或“项目组账户”。它可以把一组相关进程绑定在一起统一管理、限制和统计。6.1 Job 能解决什么问题Job 常用于浏览器多进程管理、沙盒环境、容器环境、服务宿主程序、一组子进程的统一回收、进程组资源统计以及对一组进程设置 CPU 或内存限制。通俗理解Job 就是把一组进程拴在同一根逻辑绳子上。只要这些进程在同一个 Job 里就可以对它们统一设置规则。6.2 Job 的典型能力能力作用进程集合管理把多个进程纳入同一组CPU 限制限制整个进程组 CPU 使用内存限制控制进程组内存上限资源统计统计一组进程整体资源消耗批量终止一次性结束 Job 内所有进程沙盒边界限制某组进程的能力范围在多进程程序越来越常见的今天只看单个进程已经不够了还要看这些进程是否属于同一个业务整体。6.3 哪些场景容易看到 Job 的影子常见场景包括浏览器一个主进程带多个标签页进程某个服务拉起多个 worker 子进程容器运行环境沙盒软件自动化任务拉起一串工具进程安装器启动多个辅助进程等。当你看到一组进程“生死相依”一起启动、一起退出、一起占用资源时背后就可能存在 Job 或类似进程组管理机制。Job 的价值是把一堆零散进程重新看成一个整体业务单元。7、三者关系总结排障时要学会切换视角进程、线程和作业三者之间的关系可以用一句话串起来Job 管一组进程进程装资源和线程线程真正执行代码。7.1 三层结构对照表概念核心作用分析粒度常用 Sysinternals 视角进程 Process资源与权限边界程序级Process Explorer、PsList、Procmon线程 ThreadCPU 调度与执行单位函数 / 调用栈级Process Explorer Threads 选项卡作业 Job一组进程的统一管理进程集合级Process Explorer Job 信息、系统行为观察7.2 排障时怎么选视角可以按下面逻辑判断。现象优先查看哪个软件占用内存高进程哪个模块导致 CPU 高线程一组子进程无法统一关闭Job / 父子进程关系文件删不掉进程句柄启动后拉起很多进程进程树 / Job某个服务拉起多个 workerJob / 服务宿主浏览器资源占用高多进程结构 / Job 管理只停留在进程层很多高 CPU、卡死和多进程问题都只能看到表面。7.3 Sysinternals 的价值Sysinternals 工具不是简单替代任务管理器而是帮助我们把问题拆到合适的粒度。系统现象进程层哪个程序线程层哪个执行单元调用栈层哪个模块 / 函数作业层哪组进程形成证据链真正成熟的排障不是工具开得多而是知道什么时候该切到哪一层。8、案例一软件关闭了但后台进程还在跑这是桌面支持中很常见的问题。用户说“我已经关掉软件了但它好像还在后台运行电脑还是卡。”这种问题不能只看窗口是否关闭而要看进程和线程状态。窗口关掉只能说明用户界面退出了后台进程、服务进程、同步进程、更新进程可能仍然存在。8.1 排查思路可以先打开 Process Explorer搜索软件相关进程名查看进程树确认是否还有子进程残留。接着双击残留进程查看 Threads、Handles、TCP/IP 等信息判断它是否仍在消耗 CPU、持有文件句柄或保持网络连接。如果确定是异常残留可以先结束相关进程再观察系统响应是否恢复。更稳妥的做法是记录进程路径、父子关系、资源占用和复现条件后续再判断是否需要升级软件、禁用插件或调整启动项。8.2 工单描述示例用户反馈软件关闭后系统仍卡顿。 使用 Process Explorer 检查发现该软件主窗口已退出但后台仍残留 helper.exe、worker.exe 等子进程。 进一步查看进程资源发现 worker.exe 持续占用 CPU并保持多个文件句柄未释放。 已结束残留进程后系统响应恢复正常。 后续建议检查该软件退出逻辑或更新版本。这样的描述比“软件没关干净”更专业因为它明确了进程对象、资源表现和处理动作。9、案例二批处理脚本拉起多个子进程如何一键全关另一个典型场景是一个批处理脚本启动了多个工具或子进程诊断结束后希望一次性全部关闭。如果只是一个个杀进程很容易漏掉。9.1 普通做法的问题例如脚本启动了这些进程tool-a.exe tool-b.exe tool-c.exe worker.exe logger.exe如果没有统一管理后续可能出现主脚本结束了子进程还在日志进程没退出某个 worker 持续占用 CPU临时工具残留无法确认哪些进程属于同一次任务。9.2 Job 思维的价值如果用 Job 的思维来看这组进程应该被看作一个整体。诊断任务 Job ├─ tool-a.exe ├─ tool-b.exe ├─ tool-c.exe ├─ worker.exe └─ logger.exe这样就可以统一限制资源、统计消耗、结束任务、清理残留。9.3 对桌面支持的启发即使你暂时不直接写 Job API也应该建立这种意识当一组进程属于同一个业务任务时排障时不要只看单个进程要把它们当作一个整体来分析。这对安装程序、浏览器多进程、自动化脚本、打包工具、服务宿主、容器或沙盒环境都非常有用。单个进程告诉你一个点进程组告诉你一件事。10、常见误区很多人其实只看到了表面进程、线程、作业这几个概念并不难难的是排障时经常被表象带偏。10.1 误区一看到进程名就下结论比如看到 svchost.exe就说系统异常这是不准确的。正确做法是继续看它承载哪个服务、路径是否正常、签名是否正常、父进程是否合理、资源占用是否异常、是否有异常网络连接。10.2 误区二CPU 高就认为整个程序有问题CPU 是线程消耗的进程只是承载线程的容器。如果不进入 Threads 选项卡就无法知道到底是哪个线程在跑。高 CPU 问题不要只停在进程层要进入线程层看真正的执行单元。10.3 误区三只看父子进程不看进程组父子进程关系很重要但不等于全部。在现代系统里一些进程可能通过 Job、服务框架、沙盒机制或容器机制统一管理。父进程告诉你“谁启动了谁”Job 更像告诉你“谁和谁被当成一组管理”。10.4 误区四把 Process Explorer 只当高级任务管理器如果只用 Process Explorer 看 CPU 和内存那它确实只是高级任务管理器。但它真正强的地方在于进程树、线程、句柄、DLL、签名、安全令牌、调用栈、父子关系和进程属性。Process Explorer 的价值不是替代任务管理器而是提供系统结构的放大镜。11、我的实战建议桌面支持怎么用这三层结构对于企业桌面支持来说这一节可以转化为一套很实用的排障口诀先看进程定对象再看线程找执行再看作业看整体。11.1 高 CPU 问题建议路径如下Process Explorer → CPU 排序 → 进程属性 → Threads → Stack核心目标是找到具体进程、具体高 CPU 线程判断是否进入第三方模块确认是否能复现并最终形成证据链。11.2 软件残留问题建议路径如下进程树 → 子进程 → 句柄 → 网络连接 → 必要时结束进程重点看主进程是否退出、子进程是否残留、是否仍持有文件、是否仍有网络连接、是否由自启动或服务重新拉起。11.3 多进程软件问题建议路径如下父子进程关系 → 进程组 → Job 视角 → 资源总量这类思路适合浏览器、Teams、企业微信、OneDrive、安全软件、安装器、自动化脚本等多进程软件。桌面支持不是只会关进程而是要知道该关哪个、为什么关、关完如何验证。11.4 工单记录模板遇到这类问题可以按下面模板写。问题现象 用户反馈 xxx 软件卡顿 / CPU 占用高 / 退出后仍有残留。 排查动作 使用 Process Explorer 查看进程树、资源占用和线程信息。 关键证据 发现 xxx.exe 持续占用 CPU其中 TID xxxx 线程占用最高调用栈集中在 xxx.dll。 或发现主进程退出后仍残留多个子进程且持续持有文件句柄。 处理动作 结束异常进程 / 更新软件 / 禁用异常插件 / 重启相关服务 / 记录日志进一步分析。 验证结果 处理后 CPU 恢复正常残留进程消失用户操作恢复。这样的工单可以复盘也可以沉淀成 SOP。12、总结从任务管理器的一行走向系统结构的三层视角这一节的核心可以压缩成三句话。第一进程是资源边界它承载内存、句柄、权限、DLL 和线程是分析问题的入口坐标。第二线程是执行单位CPU 真正调度的是线程高 CPU、卡顿、死循环等问题往往要进入线程层才能看清。第三作业是进程集合管理手柄它把一组进程作为整体管理适合理解浏览器、容器、沙盒、服务宿主等多进程场景。如果用一句话总结进程看整体线程看细节作业看一组进程的统一管理。当你再次打开 Process Explorer 时不要只把它当成高级任务管理器。你应该带着三层问题去看这个进程是谁启动的它占用了哪些资源它里面哪个线程真正忙调用栈显示它在执行什么模块它是不是属于某个统一管理的一组进程当你能在“作业 → 进程 → 线程”之间切换视角很多以前模糊的系统现象就会变成可以观察、可以解释、可以验证的具体对象。12.1 本文关键知识点速记知识点说明进程资源边界承载内存、句柄、权限、模块和线程线程真正执行代码也是 CPU 调度的基本对象作业 Job用于统一管理一组进程Process Explorer不只是高级任务管理器而是系统结构放大镜高 CPU 排查要进入 Threads 选项卡查看具体线程Stack 调用栈可以帮助判断线程正在执行哪个模块多进程软件要结合父子进程关系和 Job 思维理解工单表达要体现进程、线程、模块、证据和验证结果最值得记住的一句话排障不是看到一个进程名就下结论而是把现象拆到正确的系统对象上。真正专业的桌面支持不是“会结束任务”而是知道哪个任务该结束、为什么结束、结束后如何验证。返回顶部