总有人在抱怨Windows的关机是如何的缓慢实际上Windows本身的关机速度已经很快的了问题主要出在用户安装的程序上面由于一些设计不好的应用程序或驱动程序的问题造成了关机上的延迟针对这个问题网络上出现了类似于下面的技巧 打开任务管理器按住Ctrl键的同时再单击任务管理器窗口中的菜单关机→关闭命令时系统会快速地被关闭同样在按住Ctrl键时选择其他命令(例如重新启动)时也会达到快速执行该命令的目的 同时也出现了像SuperFast Shutdown一样的快速关机软件 在讨论上述技巧原理之前先说说Windows是如何关机的Windows关机步骤涉及到Windows多个组件和多个过程简单的说Windows的关机步骤不是大多数人认为的那么简单基本的过程是这样的 用户发起关机指令以后发起关机指令的程序会通知Windows子系统CSRSSEXECSRSSEXE收到通知以后会和WinlogonEXE做一个数据交换接着由WinlogonEXE通知CSRSSEXE开始关闭系统的流程 CSRSSEXE收到WinlogonEXE的通知以后会依次查询拥有顶层窗口的用户进程让这些用户进程退出如果某一个用户进程在一个默认的超时时间毫秒(可以通过修改注册表键值HKEY_CURRENT_USER\Cont rol Panel\Desktop\ HungAppTimeout设定超时时间)内没有退出的话Windows会显示一个结束任务对话框用于询问用户是否结束这个任务默认情况下将显示这个对话框并一直保持而不会自动关闭对于控制台程序来说基本情况类似只不过Windows使用HK EY_CURRENT_USER\Control Panel\Desktop\ WaitToKillAppTimeout值来设置超时时间 接着是轮到终止系统进程了系统进程包括SMSSEXEWinlogonEXELsassEXE等Windows在终止系统进程的时候并不像终止用户进程那样如果无法在规定时间内终止则提示用户而是跳过这个进程去执行下一个系统 进程的终止操作使用的超时时间和第步使用的时间相同 上述个步骤是整个Windows关机过程中最耗费时间的一段大多数关机缓慢的原因都是因为这个步骤引起的完成前个步骤以后进入了关机操作的第个阶段也是最后一个阶段 WinlogonEXE调用一个原生API函数NtShutdownSystem()来命令系统执行后面的扫尾工作在这个阶段里面Windows执行子系统会完成最后的关机操作例如设备驱动在这个阶段里面完成一些驱动设定的特殊操作 也是在这个阶段配置管理系统将被修改过的注册表数据会写道磁盘里面等除了电源管理以后的全部子系统完成退出以后电源管理完成最后的操作如重启关机等 了解了Windows的关机流程以后下面分析一下前面说的快速关机操作是怎么完成的先分析一下SuperFast Shutdown的原理SuperFast Shutdown是使用Visual Basic编写的体积很小就KB经过分析以后得出一个令人惊讶的结论SuperFast Shutdown首先使用RtlAdjustPrivilege()提升自己的权限然后直接调用NtShutdownSystem() 函数来完成关机过程由于跳过了最为耗费时间的前个步骤而直接进入第个步骤所以造成了能够很快关机的假象 再看看任务管理器的快速关机是如何实现的分析结果也是类似于SuperFast Shutdown的原理也是通过省略一些步骤来加快关机的速度 那么为什么在快速关机以后会出现设置丢失的情况呢?原因在于前个步骤里面有一个让进程正常退出的可能大多数软件在编写的时候会把一些设置保存在自己私有的内存空间里面当软件关闭的时候才把这些设置回写到特定的地方如注册表或某个配置文件里面 而关机操作的第步并没有提供一种途径能够让这些设置记录下来因为这个阶段Windows已经认为前面所有必须经过的流程已经完成剩下的就是Windows核心组件的退出的问题了在这种情况下使用快速关机导致设置丢失也不足为怪了 因此为了你系统的健康关机还是按照正常顺序来数据的安全性往往比节省的那几十秒钟重要的多 |