为何windows会“卡机”?

herorin 2013-04-25 10:32:46
加精
我举个例子,相信大家在复制数据时系统响应时间变慢,卡机、死机等现象都遇到过。

系统响应变慢及卡机、死机的原因我能想到的有两个:
1、windows消息队列异常。
2、某些线程占用了太多的时间片,导致其他线程运行的时间不够。

原因1可以很好地解释某些软件运行崩溃导致的卡机、死机,当某个软件崩溃时,用户输入可能会一直focus在该软件上,导致其他软件无法接受用户输入。

但是我举的例子——复制数据——时,系统响应变慢又是怎么回事?
难道——在windows眼里,会因为一个thread正在调用WriteFile之类的函数就给它比原来更高的优先级或分配更多的时间片——吗?
...全文
5763 148 打赏 收藏 转发到动态 举报
写回复
用AI写文章
148 条回复
切换为时间正序
请发表友善的回复…
发表回复
我喝多了 2014-08-13
  • 打赏
  • 举报
回复
硬盘的速度是很慢的, 磁盘大文件复制拷贝的时候, 系统一定会很慢
吹雪 2013-08-23
  • 打赏
  • 举报
回复
看看驱动编程就知道了,跟硬件打交道时IO一般运行在DIRQL上的,而线程调度器是运行在DISPATCH_LEVEL(低于DIRQL级别)上的,所以IO多的时候调度器可能活跃度降低:(
zmf910505 2013-08-13
  • 打赏
  • 举报
回复
herorin 2013-05-13
  • 打赏
  • 举报
回复
引用 154 楼 Aweiwei_ 的回复:
[quote=引用 124 楼 herorin 的回复:] [quote=引用 117 楼 Aweiwei_ 的回复:] [quote=引用 116 楼 Aweiwei_ 的回复:] 虚拟内存换页产生的颠簸?
因为你的各种操作和系统的运行需要读写内存,不可避免的有一些内存页面不在主存中 然后就不停的读写硬盘换页 可是你的硬盘在复制文件 但是你的各种操作和系统的运行又需要读写内存 不解释》。[/quote] 若你提到的是“虚拟内存”——操作系统一般不会在物理内存用完前使用磁盘。[/quote] 不能做这种假设.. 谁知道VirtualAlloc是怎么管理内存的--[/quote] 微软对VirtualAlloc给出了很详细的解释,它是使用文件映射的方式来实现的。
herorin 2013-05-13
  • 打赏
  • 举报
回复
引用 155 楼 for_wrk 的回复:
[quote=引用 64 楼 herorin 的回复:] [quote=引用 53 楼 for_wrk 的回复:] dma会占用控制总线 造成卡住 使用纤程来分配时间片(纯属建议,时间片的分配在应用层无法绕开系统)
#43楼我分配时间片的方法你觉得怎样? 实际上我走的是一个曲线救国的道路。一个程序有N个线程,操作系统就会考虑给N个线程分配时间片,我的方案是每个进程只有一个线程需要操作系统分配时间片,它来分配该进程内所有线程的时间片。 如果cpu是多核操作系统,那么就可以有多个用来分配时间片的线程。[/quote] 第一个呢,系统是按照线程为单位来分配时间片的,所以你把所有的线程挂起,本身得到的时间片就会大大减少; 第二,如果你一定要这么做,使用纤程比你的方法应该会简单点,并且还有系统支持; 还有时间片的分配的实现的很多细节都被隐藏起来,你可以看到的只是结果,所以对windows来说,如此就是有它的道理存在,毕竟他也是经过大量实验才得出的结果。另外我不清楚如何禁止系统提升io进程优先级,因为我所知道的提示优先级是由 IoCompleteRequest 决定的。关闭后台进程优先级的提升好像是有地方可以配置,所以请教。[/quote] windows有两个概念,分别是“进程优先级”和“线程相对优先级”,后者的自动调整可以被关闭,函数名我忘了(这函数很少见所以很难找,我在msdn上翻了很久才找到的)。 关于你的问题一:windows是以进程为单位来分配“总时间片”的,所以挂起除线程T外所有线程不会有你所说的“本身得到的时间片就会大大减少”。 关于你的问题二:纤程是一种兼容模式的选择,它并不是好主意,而且它也不支持“人工分配时间片”。 再次强调,我寄希望于linux来实现我所说的人工分配时间片。
for_wrk 2013-05-12
  • 打赏
  • 举报
回复
引用 64 楼 herorin 的回复:
[quote=引用 53 楼 for_wrk 的回复:] dma会占用控制总线 造成卡住 使用纤程来分配时间片(纯属建议,时间片的分配在应用层无法绕开系统)
#43楼我分配时间片的方法你觉得怎样? 实际上我走的是一个曲线救国的道路。一个程序有N个线程,操作系统就会考虑给N个线程分配时间片,我的方案是每个进程只有一个线程需要操作系统分配时间片,它来分配该进程内所有线程的时间片。 如果cpu是多核操作系统,那么就可以有多个用来分配时间片的线程。[/quote] 第一个呢,系统是按照线程为单位来分配时间片的,所以你把所有的线程挂起,本身得到的时间片就会大大减少; 第二,如果你一定要这么做,使用纤程比你的方法应该会简单点,并且还有系统支持; 还有时间片的分配的实现的很多细节都被隐藏起来,你可以看到的只是结果,所以对windows来说,如此就是有它的道理存在,毕竟他也是经过大量实验才得出的结果。另外我不清楚如何禁止系统提升io进程优先级,因为我所知道的提示优先级是由 IoCompleteRequest 决定的。关闭后台进程优先级的提升好像是有地方可以配置,所以请教。
Aweiwei_ 2013-05-12
  • 打赏
  • 举报
回复
引用 124 楼 herorin 的回复:
[quote=引用 117 楼 Aweiwei_ 的回复:] [quote=引用 116 楼 Aweiwei_ 的回复:] 虚拟内存换页产生的颠簸?
因为你的各种操作和系统的运行需要读写内存,不可避免的有一些内存页面不在主存中 然后就不停的读写硬盘换页 可是你的硬盘在复制文件 但是你的各种操作和系统的运行又需要读写内存 不解释》。[/quote] 若你提到的是“虚拟内存”——操作系统一般不会在物理内存用完前使用磁盘。[/quote] 不能做这种假设.. 谁知道VirtualAlloc是怎么管理内存的--
korall 2013-05-11
  • 打赏
  • 举报
回复
引用 146 楼 herorin 的回复:
我认为——对不同文件的I/O不会造成堵塞,只有对同文件的操作才有“临界变量”和“堵塞”的说法。 其次,我不认为在多核CPU的情况下,系统卡死会和优先级有太大关系。多核CPU因优先级卡死的可能性比单核小得多。操作系统不仅仅会提高I/O的优先权,同时还会提高UI的优先权,我可以假设UI的优先权永远能够得到保障。系统中有许多UI,且UI都是通过回调函数实现的,也就是说所有UI的优先权理论上都应该能够得到保障。如果是临界变量引起的UI卡死,那么第一点——临界变量只有在对同文件或者更广泛地说同扇区,且更多时候是多核CPU同时执行I/O代码的情况被考虑作为“卡死”的因素,这种情况未免太极端了;第二点——抛开linux的调度算法,单独讨论windows程序执行I/O代码的情况(注意,不是用户进行I/O操作,因为用户操作的优先级可能会比较高),操作系统更多时候会先考虑提升线程的相对优先级,而不是直接提升进程的优先级,在xp环境下运行大概1G复制文件的I/O代码,CPU使用率一定时间内是很稳定的,不会达到很高的数值,但是仍然会卡。考虑到计算CPU使用率的实际方法是计算进程对时间片的消耗,而硬盘I/O所使用的中断是不被计入时间片消耗的,而另一种情况——常规的大文件读写造成卡机,我认为实质上是大量硬盘文件映射到内存造成的,因为对文件操作的第一步必然是文件映射。 但我的结论并不是非常具有说服力,因为我不能证明硬盘I/O非常依赖中断,而且我对DMA所知甚少。
我说的并不是临界变量,并不是只有临界变量才能成为临界资源。IO冲断本身就是临界资源,或者说,IO冲断的期间如果禁止了系统对外部中断的反应,那么这些IO中断相互之间就不可能同时运行了:不管是同一文件还是不同,不管是否都为磁盘IO 还是 磁盘IO 和其他可屏蔽的IO 。而且你这里最好要明确区分IO优先级和线程调度优先级——至少我知道在NT系统上,所有的线程调度其优先级都会低于IO中断的,不管其线程优先级有多高,都不会影响系统对IO中断的响应。所以如果你想从系统的线程调度优先级上做修整来解决IO引起的系统假死的问题,我认为从出发点上就不对了。
korall 2013-05-11
  • 打赏
  • 举报
回复
引用 152 楼 herorin 的回复:
首先我必须阐明我的观点——我认为操作系统卡机的元凶之一正是磁盘引起的I/O中断(这一点没有得到证实,因为缺乏相关资料)。操作系统中断是以汇编int指令(中断指令)的方式实现的,时钟中断也是以int指令实现的,汇编int指令的特性导致在执行完I/O中断处理程序之前时钟中断不会被响应,也可能是卡机的原因之一。 其次,我并不是打算以改变优先级的方式解决假死的问题。CopyFileSlowly实质上是减少了每一次I/O中断的处理程序的运行时间,减少了sysenter后的运行时间,只要保证时钟中断处理程序的正常运转,操作系统就能及时切换进程,操作系统就不会卡死。并且从执行效果来看,I/O同样的数据量,CopyFileSlowly确实可以缓解卡机的现象。 其三,我前面提到的人工分配时间片的问题,旨在避免因高cpu使用率而导致的卡机。
你认为并不等于事实就是那样;你还没有了解好问题的起因,所以提出的解决方案都是不可用的。 呵呵你继续折腾吧,我度周末去了~
herorin 2013-05-11
  • 打赏
  • 举报
回复
引用 150 楼 wsfxzxb 的回复:
楼主忽略了一个事实:就是CPU不在100%的时候也会死机,不单是CPU时间片的问题。举个极端的例子来说,如果把鼠标从电脑上拔出来,你怎么移动鼠标系统都没反应,死得呱呱的。传输也是问题。
引用 151 楼 korall 的回复:
[quote=引用 146 楼 herorin 的回复:] 我认为——对不同文件的I/O不会造成堵塞,只有对同文件的操作才有“临界变量”和“堵塞”的说法。 其次,我不认为在多核CPU的情况下,系统卡死会和优先级有太大关系。多核CPU因优先级卡死的可能性比单核小得多。操作系统不仅仅会提高I/O的优先权,同时还会提高UI的优先权,我可以假设UI的优先权永远能够得到保障。系统中有许多UI,且UI都是通过回调函数实现的,也就是说所有UI的优先权理论上都应该能够得到保障。如果是临界变量引起的UI卡死,那么第一点——临界变量只有在对同文件或者更广泛地说同扇区,且更多时候是多核CPU同时执行I/O代码的情况被考虑作为“卡死”的因素,这种情况未免太极端了;第二点——抛开linux的调度算法,单独讨论windows程序执行I/O代码的情况(注意,不是用户进行I/O操作,因为用户操作的优先级可能会比较高),操作系统更多时候会先考虑提升线程的相对优先级,而不是直接提升进程的优先级,在xp环境下运行大概1G复制文件的I/O代码,CPU使用率一定时间内是很稳定的,不会达到很高的数值,但是仍然会卡。考虑到计算CPU使用率的实际方法是计算进程对时间片的消耗,而硬盘I/O所使用的中断是不被计入时间片消耗的,而另一种情况——常规的大文件读写造成卡机,我认为实质上是大量硬盘文件映射到内存造成的,因为对文件操作的第一步必然是文件映射。 但我的结论并不是非常具有说服力,因为我不能证明硬盘I/O非常依赖中断,而且我对DMA所知甚少。
我说的并不是临界变量,并不是只有临界变量才能成为临界资源。IO冲断本身就是临界资源,或者说,IO冲断的期间如果禁止了系统对外部中断的反应,那么这些IO中断相互之间就不可能同时运行了:不管是同一文件还是不同,不管是否都为磁盘IO 还是 磁盘IO 和其他可屏蔽的IO 。而且你这里最好要明确区分IO优先级和线程调度优先级——至少我知道在NT系统上,所有的线程调度其优先级都会低于IO中断的,不管其线程优先级有多高,都不会影响系统对IO中断的响应。所以如果你想从系统的线程调度优先级上做修整来解决IO引起的系统假死的问题,我认为从出发点上就不对了。[/quote] 首先我必须阐明我的观点——我认为操作系统卡机的元凶之一正是磁盘引起的I/O中断(这一点没有得到证实,因为缺乏相关资料)。操作系统中断是以汇编int指令(中断指令)的方式实现的,时钟中断也是以int指令实现的,汇编int指令的特性导致在执行完I/O中断处理程序之前时钟中断不会被响应,也可能是卡机的原因之一。 其次,我并不是打算以改变优先级的方式解决假死的问题。CopyFileSlowly实质上是减少了每一次I/O中断的处理程序的运行时间,减少了sysenter后的运行时间,只要保证时钟中断处理程序的正常运转,操作系统就能及时切换进程,操作系统就不会卡死。并且从执行效果来看,I/O同样的数据量,CopyFileSlowly确实可以缓解卡机的现象。 其三,我前面提到的人工分配时间片的问题,旨在避免因高cpu使用率而导致的卡机。
mgkelley 2013-05-10
  • 打赏
  • 举报
回复
正常呀!复制文件或解压文件时CPU使用率和内存使用空间都很大,你在忙着用电脑做其他的事不卡或死机才怪!
梦之领域 2013-05-10
  • 打赏
  • 举报
回复
楼主忽略了一个事实:就是CPU不在100%的时候也会死机,不单是CPU时间片的问题。举个极端的例子来说,如果把鼠标从电脑上拔出来,你怎么移动鼠标系统都没反应,死得呱呱的。传输也是问题。
hankcs 2013-05-10
  • 打赏
  • 举报
回复
撸主要节制啊
------------------------------------------------------AutoCSDN签名档------------------------------------------------------
码农场——码农播种代码、放牧思想的农场!
引用 45 楼 herorin 的回复:
[quote=引用 32 楼 qldsrx 的回复:] 我的理解是:操作系统即使闲置的时候,也有I/O操作,更何况还有虚拟内存需要访问磁盘才能完成操作,这个可以打开HDTune观察读写情况,你什么操作都不做,但磁盘并非空闲,一直有数据交换。那么如果饱和的磁盘读写导致了操作系统正常的访问磁盘被耽搁了,自然就会感觉到卡了。
引用 33 楼 qldsrx 的回复:
再举个例子说明下:我原先电脑开机挺正常的,但是自从购买了一块2T的西部数据绿盘换上去做操作系统盘,开机速度也还好,1分钟内能出来,但是开机后5分钟内别想动鼠标和键盘,机器非常卡,即使开个IE都要半天没响应,观察硬盘工作灯一直常亮,不停的读写磁盘,但是用HDTune监视磁盘流量却并不高。 解释:西部数据绿盘刚启动时,马达转速较慢,导致读写速度异常慢,要预热一定时间后,马达转速正常了才能达到标准的磁盘读写速度。 可见磁盘的读写速度本身影响了操作系统的卡机,和中断无关。(win7系统)
昨天手扭伤了,只能单手打字,这样肯定敲不了代码了,我手伤好以后写段测试代码试试。 虚拟内存实际上有两步,第一步是预定,第二步是实际上在硬盘上分配虚拟内存。所以仅仅分配虚拟内存而不实际使用应该是不会卡的。 你把系统的虚拟内存调到最小试试? windows开机启动后会做些什么我不清楚,手伤好后对比linux研究下——你说的确实是个思路。 我想尽量通过不改写内核或简单改写内核(重写API)的方式来做一批更优秀的函数,也就是我提到的所谓C++的后继版本(实际上是夸张了。之所以说是C++后继版本是因为现在C++的函数都是常用库提供的)。这个项目做了没多少,也不知道实际效率怎样。[/quote]
korall 2013-05-10
  • 打赏
  • 举报
回复
引用 6 楼 herorin 的回复:
[quote=引用 5 楼 oyljerry 的回复:] 系统处理不过来的时候,就会造成假死,因为UI以及其他进程得不到处理
你如何解释“系统处理不过来”? 无论cpu频率多高(假设不考虑发热带来的效率损失),cpu时钟每固定时间就会触发一次时钟中断,所以在没有硬件中断干涉的情况下,操作系统永远不会卡死。 还有一种可能就是进程优先级被改写,导致处理I/O操作的线程得到较高的优先级从而得到较多的时间片。 我比较倾向于系统假死是中断造成的。[/quote] 低优先级的线程也能阻碍高优先级的线程执行的:由于共享的临界资源的竞争导致的优先级反转这是常常发生的。IO就是一种这样的资源;UI 以及其他任何线程如果用到了IO,那么即使它的优先级再高,只要没有得到资源一样会被阻塞住。当磁盘IO很忙的时候,如果某个进程需要从该磁盘上的交换文件中载入数据,那么该进程就会被影响,而这也是常常发生的事。这里并不单单是时间片的优先调度策略的问题
herorin 2013-05-10
  • 打赏
  • 举报
回复
引用 144 楼 korall 的回复:
[quote=引用 65 楼 herorin 的回复:] [quote=引用 51 楼 dengsf 的回复:] 除虚拟内存机制外,卡机很多时不是内核的问题,桌面程序explorer.exe、服务、大部分程序都会频繁访问硬盘,访问的次数比想象中多很多。 先说explorer.exe,卡很多时是体现在桌面无响应。但它访问硬盘是很频繁的,最基本的显示文件的图标,会根据后缀查注册表跟哪个处理程序关联,显示指定的图标,这会涉及硬盘访问。此外它还会加载很多插件,这些插件可能显示文件更多信息、预览图像等等。。。 其次是系统服务,很多服务也会访问注册表的,用工具查看下,发现如lsass之类的写硬盘频率也挺高的。而很多windows api其实也是基于这些服务的,依赖这些api的程序,自然也受硬盘影响。 还有是程序本身问题了,有不少有自画界面的程序,自己不做图片缓存,每次重画都加载图片再渲染。 系统本身有io缓存的,并不是每次都读硬盘。但当硬盘读写大量新数据时,缓存会被新的替换,再访问旧的缓存就会重新读取,自然就造成卡了。 弄个占内存少,纯计算的程序,查看下就发现不受硬盘读写影响了。
我的问题的关键点在于“如何解决访问磁盘造成的系统卡机”。 目前我的想法是减少每次读写的数据量(但是读写总耗时会变长)。 CopyFile做的工作实际上是CreateFile和ReadFile、Writefile,那么我可以写一个CopyFileSlowly使其无论复制多大的文件都不会卡死系统。[/quote] CopyFileSlowly 很简单: copy 的时候每copy一小块之后就让出时间片就行了:Sleep 一小段时间。 但是系统不可能做出这样的策略,这样相当于堵死了用户想要最优先读写磁盘的机会,所以这只能是用户考虑的事情。CPU资源分配也一样,除非进程想与其它进程比较公平地分享CPU资源,否则系统还是会给该进程占用大量CPU资源的机会。系统能保证的应该只是在任何情况下都不要崩溃和丢失数据。至于UI响应,这种情况下,系统还是不会丢掉外部的冲断输入的:也就是你在系统假死的时候所敲的键不会说被忽略,这就够了[/quote] CopyFileSlowly是一个可选的函数,意思是提供一个新的API,名为CopyFileSlowly,它和原有的CopyFile都是在编程时可以选择的函数,CopyFile用来应对速度至上的情况,而CopyFileSlowly用来应对那些对速度并不是非常苛求的场合。
herorin 2013-05-10
  • 打赏
  • 举报
回复
引用 145 楼 korall 的回复:
[quote=引用 43 楼 herorin 的回复:] 我认为可以通过以下方式重新分配一个进程获得的所有时间片:创建一个用于分配时间片的线程T,关闭进程的自动改变优先级,除它之外的线程都设置为suspended。T每得到时间片就把上一个启动的线程suspend,然后进行一个效率最优化判断,再把时间片交给下一个线程(启动该线程,然后自己SwitchToThread)。原理是同进程线程同优先级,且同进程线程执行顺序是固定的。然后只要重写SuspendThread和ResumeThead以及SwitchToThread使其效率更高。——这样就能实现大致的人工分配时间片。 求教,是否有更好的方法?
这样做其实只是在本进程内进行调度,对其他进程没有控制权(除了进程的优先级可以影响系统全局调度之外),所以这里其实等价于单线程进程。线程调度要考虑的东西太多了,一个成熟的系统自然很多东东西都经过验证的[/quote] 你所说的“一个成熟的系统自然很多东东西都经过验证的”正是我所怀疑的。实际上一部分文章作者的观点是,操作系统对于“时间片调度”的态度是“有一个制度比没有更好”而不是“怎样的制度最优”。 其次,必须承认windows下很难做到在代码层对时间片的分配进行操作。 其三,我所说的是去实现“单个进程的时间片分配对编程者透明”,而不是靠所谓“优先级”来“建议式”地设置。
herorin 2013-05-10
  • 打赏
  • 举报
回复
引用 143 楼 korall 的回复:
[quote=引用 6 楼 herorin 的回复:] [quote=引用 5 楼 oyljerry 的回复:] 系统处理不过来的时候,就会造成假死,因为UI以及其他进程得不到处理
你如何解释“系统处理不过来”? 无论cpu频率多高(假设不考虑发热带来的效率损失),cpu时钟每固定时间就会触发一次时钟中断,所以在没有硬件中断干涉的情况下,操作系统永远不会卡死。 还有一种可能就是进程优先级被改写,导致处理I/O操作的线程得到较高的优先级从而得到较多的时间片。 我比较倾向于系统假死是中断造成的。[/quote] 低优先级的线程也能阻碍高优先级的线程执行的:由于共享的临界资源的竞争导致的优先级反转这是常常发生的。IO就是一种这样的资源;UI 以及其他任何线程如果用到了IO,那么即使它的优先级再高,只要没有得到资源一样会被阻塞住。当磁盘IO很忙的时候,如果某个进程需要从该磁盘上的交换文件中载入数据,那么该进程就会被影响,而这也是常常发生的事。这里并不单单是时间片的优先调度策略的问题[/quote] 我认为——对不同文件的I/O不会造成堵塞,只有对同文件的操作才有“临界变量”和“堵塞”的说法。 其次,我不认为在多核CPU的情况下,系统卡死会和优先级有太大关系。多核CPU因优先级卡死的可能性比单核小得多。操作系统不仅仅会提高I/O的优先权,同时还会提高UI的优先权,我可以假设UI的优先权永远能够得到保障。系统中有许多UI,且UI都是通过回调函数实现的,也就是说所有UI的优先权理论上都应该能够得到保障。如果是临界变量引起的UI卡死,那么第一点——临界变量只有在对同文件或者更广泛地说同扇区,且更多时候是多核CPU同时执行I/O代码的情况被考虑作为“卡死”的因素,这种情况未免太极端了;第二点——抛开linux的调度算法,单独讨论windows程序执行I/O代码的情况(注意,不是用户进行I/O操作,因为用户操作的优先级可能会比较高),操作系统更多时候会先考虑提升线程的相对优先级,而不是直接提升进程的优先级,在xp环境下运行大概1G复制文件的I/O代码,CPU使用率一定时间内是很稳定的,不会达到很高的数值,但是仍然会卡。考虑到计算CPU使用率的实际方法是计算进程对时间片的消耗,而硬盘I/O所使用的中断是不被计入时间片消耗的,而另一种情况——常规的大文件读写造成卡机,我认为实质上是大量硬盘文件映射到内存造成的,因为对文件操作的第一步必然是文件映射。 但我的结论并不是非常具有说服力,因为我不能证明硬盘I/O非常依赖中断,而且我对DMA所知甚少。
korall 2013-05-10
  • 打赏
  • 举报
回复
引用 43 楼 herorin 的回复:
我认为可以通过以下方式重新分配一个进程获得的所有时间片:创建一个用于分配时间片的线程T,关闭进程的自动改变优先级,除它之外的线程都设置为suspended。T每得到时间片就把上一个启动的线程suspend,然后进行一个效率最优化判断,再把时间片交给下一个线程(启动该线程,然后自己SwitchToThread)。原理是同进程线程同优先级,且同进程线程执行顺序是固定的。然后只要重写SuspendThread和ResumeThead以及SwitchToThread使其效率更高。——这样就能实现大致的人工分配时间片。 求教,是否有更好的方法?
这样做其实只是在本进程内进行调度,对其他进程没有控制权(除了进程的优先级可以影响系统全局调度之外),所以这里其实等价于单线程进程。线程调度要考虑的东西太多了,一个成熟的系统自然很多东东西都经过验证的
korall 2013-05-10
  • 打赏
  • 举报
回复
引用 65 楼 herorin 的回复:
[quote=引用 51 楼 dengsf 的回复:] 除虚拟内存机制外,卡机很多时不是内核的问题,桌面程序explorer.exe、服务、大部分程序都会频繁访问硬盘,访问的次数比想象中多很多。 先说explorer.exe,卡很多时是体现在桌面无响应。但它访问硬盘是很频繁的,最基本的显示文件的图标,会根据后缀查注册表跟哪个处理程序关联,显示指定的图标,这会涉及硬盘访问。此外它还会加载很多插件,这些插件可能显示文件更多信息、预览图像等等。。。 其次是系统服务,很多服务也会访问注册表的,用工具查看下,发现如lsass之类的写硬盘频率也挺高的。而很多windows api其实也是基于这些服务的,依赖这些api的程序,自然也受硬盘影响。 还有是程序本身问题了,有不少有自画界面的程序,自己不做图片缓存,每次重画都加载图片再渲染。 系统本身有io缓存的,并不是每次都读硬盘。但当硬盘读写大量新数据时,缓存会被新的替换,再访问旧的缓存就会重新读取,自然就造成卡了。 弄个占内存少,纯计算的程序,查看下就发现不受硬盘读写影响了。
我的问题的关键点在于“如何解决访问磁盘造成的系统卡机”。 目前我的想法是减少每次读写的数据量(但是读写总耗时会变长)。 CopyFile做的工作实际上是CreateFile和ReadFile、Writefile,那么我可以写一个CopyFileSlowly使其无论复制多大的文件都不会卡死系统。[/quote] CopyFileSlowly 很简单: copy 的时候每copy一小块之后就让出时间片就行了:Sleep 一小段时间。 但是系统不可能做出这样的策略,这样相当于堵死了用户想要最优先读写磁盘的机会,所以这只能是用户考虑的事情。CPU资源分配也一样,除非进程想与其它进程比较公平地分享CPU资源,否则系统还是会给该进程占用大量CPU资源的机会。系统能保证的应该只是在任何情况下都不要崩溃和丢失数据。至于UI响应,这种情况下,系统还是不会丢掉外部的冲断输入的:也就是你在系统假死的时候所敲的键不会说被忽略,这就够了
wp_wuming 2013-05-09
  • 打赏
  • 举报
回复
我的电脑经常卡死啊有时候玩着游戏就给弹出来了
加载更多回复(128)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧