总有人在抱怨Windows的关机是如何的缓慢,实际上Windows本身的关机速度已经很快的了。问题主要出在用户安装的程序上面,由于一些设计不好的应用程序或驱动程序的问题,造成了关机上的延迟。针对这个问题,网络上出现了类似于下面的技巧:

  打开任务管理器,按住“Ctrl”键的同时,再单击任务管理器窗口中的菜单“关机→关闭”命令时,系统会快速地被关闭,同样,在按住“Ctrl”键时,选择其他命令(例如重新启动)时,也会达到快速执行该命令的目的。

  同时,也出现了像SuperFast Shutdown一样的快速关机软件。

  在讨论上述技巧原理之前,先说说Windows是如何关机的:Windows关机步骤涉及到Windows多个组件和多个过程,简单的说,Windows的关机步骤不是大多数人认为的那么简单。基本的过程是这样的:

  1. 用户发起关机指令以后,发起关机指令的程序会通知Windows子系统CSRSS.EXE,CSRSS.EXE收到通知以后会和Winlogon.EXE做一个数据交换,接着由Winlogon.EXE通知CSRSS.EXE开始关闭系统的流程 。

  2. CSRSS.EXE收到Winlogon.EXE的通知以后,会依次查询拥有顶层窗口的用户进程,让这些用户进程退出。如果某一个用户进程在一个默认的超时时间5000毫秒(可以通过修改注册表键值HKEY_CURRENT_USER\Cont rol Panel\Desktop\ HungAppTimeout设定超时时间)内没有退出的话,Windows会显示一个结束任务对话框用于询问用户是否结束这个任务。默认情况下将显示这个对话框并一直保持而不会自动关闭。对于控制台程序来说,基本情况类似,只不过Windows使用HK EY_CURRENT_USER\Control Panel\Desktop\ WaitToKillAppTimeout值来设置超时时间。

  3. 接着是轮到终止系统进程了。系统进程包括SMSS.EXE、Winlogon.EXE、Lsass.EXE等。Windows在终止系统进程的时候并不像终止用户进程那样如果无法在规定时间内终止则提示用户,而是跳过这个进程,去执行下一个系统 进程的终止操作。使用的超时时间和第2步使用的时间相同。

  上述3个步骤是整个Windows关机过程中最耗费时间的一段,大多数关机缓慢的原因都是因为这3个步骤引起的。完成前3个步骤以后,进入了关机操作的第4个阶段,也是最后一个阶段。

  4. Winlogon.EXE调用一个原生API函数NtShutdownSystem()来命令系统执行后面的扫尾工作。在这个阶段里面,Windows执行子系统会完成最后的关机操作,例如:设备驱动在这个阶段里面完成一些驱动设定的特殊操作; 也是在这个阶段,配置管理系统将被修改过的注册表数据会写道磁盘里面。等除了电源管理以后的全部子系统完成退出以后,电源管理完成最后的操作:如重启、关机等。

  了解了Windows的关机流程以后,下面分析一下前面说的快速关机操作是怎么完成的。先分析一下SuperFast Shutdown的原理,SuperFast Shutdown是使用Visual Basic编写的,体积很小,就15KB,经过分析以后得出一个令人惊讶的结论:SuperFast Shutdown首先使用RtlAdjustPrivilege()提升自己的权限,然后直接调用NtShutdownSystem() 函数来完成关机过程。由于跳过了最为耗费时间的前3个步骤而直接进入第4个步骤,所以造成了能够很快关机的假象。

  再看看任务管理器的快速关机是如何实现的:分析结果也是类似于SuperFast Shutdown的原理,也是通过省略一些步骤来加快关机的速度。

  那么,为什么在快速关机以后会出现设置丢失的情况呢?原因在于前3个步骤里面有一个让进程正常退出的可能。大多数软件在编写的时候会把一些设置保存在自己私有的内存空间里面,当软件关闭的时候才把这些设置回写到特定的地方,如注册表或某个配置文件里面 。而关机操作的第4步并没有提供一种途径能够让这些设置记录下来,因为这个阶段Windows已经认为前面所有必须经过的流程已经完成,剩下的就是Windows核心组件的退出的问题了。在这种情况下,使用快速关机导致设置丢失也不足为怪了。

  因此,为了你系统的健康,关机还是按照正常顺序来,数据的安全性往往比节省的那几十秒钟重要的多。

Windows系统关机及快速关机原理相关推荐

  1. XP系统自带快速关机命令的使用:

    XP系统自带快速关机命令的使用: 新建文本文档--顶格输入"shutdown -s -t 0 -f"--文件--另存为--关机.bat 说明: 批处理文件.扩展名为bat. -s: ...

  2. 家用计算机如何关机,win7如何快速关机_win7快速关机的方法

    现在阶段随着系统的不断更新,用户们的需求也是越来越多了,我们在追求开机速度的同时,也在追求着快速关机的功能,不然等到别人都走了,而自己的电脑还没有完全关闭的状态,很是烦人.那么win7系统怎么实现快速 ...

  3. Window系统上自制快速关机脚本

    想必大家都在用Windows系统,有时大家有急事,想要快速关闭电脑,觉得用鼠标去进行点点才能关机很麻烦 那么,今天我在这里教大家如何在Windows电脑上制作一个关机脚本,只要我们双击这个脚本文件就可 ...

  4. Windows 系统API 函数快速查找

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  5. 计算机关闭和注销的区别,你可知道windows系统中注销、关机、休眠之间的区别吗...

    我们在日常的使用计算机中,如果你有足够细心的话,也许你会好奇当你想关闭计算机的时候,注销.关机.睡眠这3者之间的区别是什么呢?我们在操作电脑的时候,会通过关机.注销.休眠等各种方式来让电脑停止工作.但 ...

  6. 查看Windows系统的开机、关机时间、开机时长等信息

    目录 方式一:通过CMD命令行查看 方式二:通过事件查看器查看 方式一:通过CMD命令行查看 在cmd运行界面,在输入systeminfo进行查看:

  7. windows快速关机

    常规关机: 依次点击[开始](或者按下[CTRL+ALT+DELETE]快捷键)[电源][关机] 快速关机: [Win+D]快捷键回到电脑桌面,[ALT+F4]回车即可 合盖关机 依次点击[开始][设 ...

  8. 【C语言】实现Windows系统关机操作程序

    前言 这篇文章讲述了,如何通过C语言实现Windows系统的关机程序,以及实现我们"关机程序"开机自启动问题.(小白阶段) 一.主要内容介绍 (1)shutdown -Window ...

  9. Windows Internals 7th: 如何快速查看当前 windows 系统版本号

    一.引言 最近非常欣喜的看到<Windows Internals>出了第 7 版的第 1 卷,于是迫不及待并且诚惶诚恐跑去拜读了. 果不其然受益匪浅,比如说 Chapter1 中提到的,查 ...

最新文章

  1. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期
  2. python3与相关软件的关系,箭头表示依赖
  3. zz STL 优先队列
  4. Spring在web开发中的应用
  5. Arcgis desktop 9.3的破解方法_经验版
  6. XmlViewResolver 和 ResourceBundleViewResolver
  7. PHP如何实现定时任务,PHP定时任务方法,最佳解决方案,PHP自动任务处理 自动备份
  8. 想知道账号被封的感觉么?
  9. 力扣-53 最大子序和
  10. ubuntu16.04 kinetic 版本ROS安装PR2
  11. 出租车计费-Java练习题
  12. 员工年终绩效考核表模板
  13. 计算机信息系统集成高级工程师,软考信息系统项目管理师(高级资格/高级工程师)简介...
  14. Johnnie Walker惊艳的广告
  15. js怎么显示服务器图片,原生JS上传图片接收服务器端图片并且显示图片(主要描述blob类型)...
  16. 电脑桌面下方的任务栏卡死解决方案:
  17. vol.178 美西自驾历险记 · 完结篇(下)
  18. java base64 转图片不现实_BASE64编码的图片在网页中的显示问题的解决
  19. 2013——自我反思
  20. 学术论文常用写作结构

热门文章

  1. 抖音小店无货源是不是在割韭菜?
  2. deployment介绍和使用
  3. Java实现N*N矩阵旋转(360度)
  4. 终于等到你,Elasticsearch7.X视频教程发布!
  5. 用 Python 写的文档批量翻译工具,效果竟然超越付费软件?
  6. Java+SSM在线商城系统电商购物系统(含源码+论文+答辩PPT等)
  7. web初学经验:对于IOS不兼容 text-algin:justify
  8. 【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...
  9. 荣耀v30鸿蒙5g荣耀有隔空操作吗,荣耀v30Pro支持隔空操作吗 了解手机主要特点
  10. CNI failed to retrieve network namespace path