走出资源冲突的泥沼

时间:2007-06-08
电脑系统的首要任务是有效地管理资源,以便快速地相应用户给定的任务。可是,一旦发生资源冲突,就失去对某些资源的管理能力,造成系统瘫痪。这种问题无法通过更换硬件来排除,因此显得十分棘手。本文带领读者从资源管理的源头来了解资源冲突的原因,掌握摆脱资源冲突的思路和方法。

       一、电脑是如何管理资源的?

  ●所谓资源

  电脑中的资源也称为资源库,它包括CPU、内存、外设和信息(包括程序和数据)4大类,所有的硬件和软件都可以称作资源。

  通常把IRQ、DMA、内存和I/O端口看作系统资源,每一种设备都要占有一定的系统资源才能使用,在设备管理器中可以看到设备占用资源的细节(如图1)。

硬件设备使用的资源

                          

                                图1 硬件设备使用的资源  

       ●资源信息的收集与资源分配过程

  资源管理贯穿于电脑运行的整个过程中,资源信息的收集与分配是资源管理的重要环节。当我们接通电脑的电源时,系统从BIOS芯片中读取POST程序并立即执行之,对电脑硬件进行检测。检测工作结束后,转入执行BIOS中的设置程序,将系统资源(包括I/O端口、中断号、DMA及内存等)分配给检测到的设备,生成一个资源配置表,并将配置数据写回BIOS后,屏幕上出现“Update ESCD......Succeed”信息,说明ESCD(Extended System Configuration Data,扩展系统配置数据)更新成功,随后启动自举装载程序引导操作系统,并把资源配置表传递给操作系统,由操作系统进行统一管理和使用。可以看出资源信息的收集工作先是由BIOS进行侦测,然后上报给操作系统的。

  在即插即用系统中,BIOS可以动态地完成系统资源信息的收集工作。当我们带电接入新设备时,因为新设备要占用系统资源,这时就可能会与以前的资源配置发生冲突,系统在工作时就会表现出不稳定或错误提示。为此,即插即用BIOS可以发现新设备,并通过总线枚举器向操作系统通报事件,枚举器发送的信息指明了设备ID以及对资源的需求信息,操作系统使用PnP管理器将枚举器传送来的这些信息记录到注册表中,I/O管理器从注册表中提取设备信息,并查找与之相匹配的设备驱动程序(如果找不到驱动程序,便弹出一个要求用户安装驱动程序的对话框),并在驱动程序与设备之间建立关联,将中断号等资源信息发送给设备,存储在设备的寄存器中,如图2。

即插即用系统信息流程

                                                           图2 即插即用系统信息流程  
       小知识:设备驱动程序

  并不是所有硬件安装到电脑里之后,就可以马上使用。举例来说,如果你自己买了内存,并将它安装到内存插槽之后,开机启动之后就可以使用内存,CPU也是安装后就可以使用。但是,如显示卡或打印机等功能卡或者外设,当你安装完成后,往往还必须安装它们的驱动程序,这些设备才能使用。



  设备驱动程序是一种将硬件与操作系统相互连接的软件
。虽然现在的操作系统自身都带有庞大的驱动程序库,以支持常见的硬件,这也是操作系统变得越来越臃肿的主要原因之一。但是大部分驱动程序的版本都还停留在操作系统版时的情形,后来设备性能改进所带来的新特性就不能发挥作用了,驱动程序中所存在的兼容性问题也得不到解决,所以应该安装的驱动程序。

  设备驱动程序是在电脑启动过程中通过System.ini文件中的[mic]、[drivers]、[drivers32]这三个字段来加载到系统的,驱动程序的打开、启用、禁用和关闭均由动态连接库文件(后缀通常为dll)控制的,而动态链接库文件又是由应用程序调用的。

  ●谁用了我的资源?

  本文开头说过,每个设备都要使用一定的系统资源才能工作。以外,程序运行过程中也需要占有计算机的各种资源才能运行下去,譬如,将程序和数据从外存储器加载到主内存,就占用了内存资源;在WORD中编辑图文,WORD程序本身要占用系统资源,如果再进行打印,就要使用中断和I/O端口等系统资源。系统中运行的程序越多,资源利用的也越多。

  从资源供应的角度来看,系统资源是有限的,当运行的程序很多时,会存在资源耗尽而

无法运行更多
程序的问题。而从资源使用的角度来看呢,为了提高资源利用率和系统处理能力,现代计算机系统都是多任务系统,即多道程序可以并发执行。一个程序从外存调入内存开始执行,操作系统就要为其创建一个进程,进程意味着程序对CPU、内存和其他资源的拥有。

  进程又称为任务,是操作系统进行资源分配的一个单位。进程分为系统进程和用户进程,凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;而用户进程就是用户运行的程序,譬如你使用Media Player播放歌曲,就启动了一个用户进程。可见,系统进程是必须长期启动的,而用户进程则是用户临时启动的,完成任务后程序和数据均从内存中移出。

  总体来看,一个操作系统可以同时运行多个进程,但在某一时刻,CPU中却只能有一个进程被执行。进程处于执行状态时,系统需要将CPU、DMA通道、内存和I/O端口等资源分配给它;一旦程序终止,系统会将收回这些资源。未被CPU执行的其他进程处于就绪状态,虽然没有占用CPU,却需要占有内存等资源。

       二、资源冲突的预防

  在多任务系统中,如果系统中有多个进程,就可能发生的某些常见而讨厌的情况是死锁、活锁、内存损坏和资源耗尽,这些问题统称为资源冲突。

  资源管理是操作系统主要的任务,包括进程管理(处理器管理)、存储器管理(内存管理)、设备管理和文件管理。操作系统对资源的管理主要有两个主要任务,一是高效地利用资源,二是避免资源之间发生冲突。前面关于进程中已经谈了资源的利用,下面再谈谈避免资源冲突的措施。

  ●中断控制:独占与共享并举

  我们知道,所有任务的处理过程都是在CPU中完成的,而个人电脑中通常只有一个CPU,正是因为CPU的性,在某段时间内只能处理一个任务,必须等待一个任务处理完毕,才能进行下一个任务的处理。虽然我们同时运行多个程序(譬如你可以一边打字一边听歌),但只能有一个程序在CPU中执行,绝不可能出现两个程序同时在CPU中执行的场面。因而,所有设备和程序只能通过中断方式实现与CPU的对话,中断控制就成了电脑系统里一个必不可少的环节,中断号也成为十分重要的资源。

  早期的电脑系统使用Intel 8259C来管理中断资源的中断控制器,不过8259对中断请求的处理只有独占一种方式。告别DOS进入Windows时代以后,多任务环境下进程数的增加使得中断资源捉襟见肘,出现了因资源耗尽而不能运行程序的问题。因此,PCI接口引入主板以后,在中断控制器中增加了中断共享功能,共享同一中断号的若干个设备可以分时使用同一个中断号。有了中断共享,用户在添加多个硬件时,就不必为中断资源是否够用而担心了。你可能会在设备管理器中看到几个设备共同使用一个IRQ的情况,但每一台设备都可以正常运转。图3是从笔者自己的电脑采集到的资源利用列表,从图中可以看出网卡和声卡的中断号都是IRQ18,但电脑的联网功能与音乐播放功能都是正常的。

  各种设备和程序在对资源使用上有轻重缓急的区别,这个问题通过中断优先权的不同级别来加以解决。系统中必备的设备(如键盘、鼠标、系统时钟等)是独占一个中断号的,其余的未被分配的中断号则可以根据程序的请求进行动态分配。实行动态中断分配的设备通常是那些插在主板扩展槽中的板卡(如网卡、声卡、SCSI卡等)以及与PCI桥相连接的板载设备,如集成声卡、USB设备等。


  独占的中断号通常是多年不变的(譬如,系
统时钟的中断号是0,键盘的中断号是1),保持了对传统的PC体系的继承,剩余的中断号则由操作系统进行动态分配,换句话说,共享中断的分配不再由电子电路来决定,而是由操作系统说了算——操作系统通过资源仲裁,将可用的资源随机地分配给有资源需求的设备,并将相关信息传递给设备,存储到设备的可编程寄存器(类似于某些芯片的暂存区)中。设备一旦获得了中断号,今后就可以使用这个中断号向中断控制器提出中断请求了。

  大家知道,USB设备虽然没有专用的中断请求信号线的,但它通过USB控制器一样可以获得中断号,并可在带电插入正在运行的系统后立即获得中断号。USB设备之所以能够实现即插即用,道理也就在这里。欲了解中断资源的分配情况,我们可以利用测试软件AIDA32进行查看(如图3)。

AIDA32显示系统资源使用情况

                          &nb

sp;  
                        图3 AIDA32显示系统资源使用情况   
       ●进程的加锁与解锁

  为了防止对同一个资源的并发访问而导致数据错误,系统要对硬件资源进行加锁保护,以保持进程之间的互斥。其基本方法是,正在执行的线程可将资源锁定,在完成任务后再解开(释放)这个锁,使其他进程可以接着使用它刚才占用过的资源。举例来说,如果两个进程将信息先后发送给一台打印机,只有前面的那个进程能够启用打印机,并在使用期间将打印机占用的资源置于锁定状态。打印任务完成释放资源,才能执行后面一个进程的打印任务。

       三、资源冲突为什么仍然还会发生?

  硬件资源冲突的典型表现是:当你添加新硬件时或添加新硬件后系统经常无缘无故地死机、黑屏;启动时,无故进入安全模式;设备工作异常或彻底罢工;DLL文件出错甚至蓝屏,等等。

  硬件冲突主要发生在添加新硬件的过程中,新添加的硬件占用了原有设备的IRQ中断、DMA通道、I/O地址等计算机资源,在新旧硬件之间发生了资源冲突。这将导致一或多个硬件设备无法正常工作,或系统工作不稳定的后果。

  虽然操作系统已经采取了一些措施来解决资源冲突问题,但是,如果软件和硬件中存在bug,或者软硬件兼容性不好,就仍然会发生资源冲突。主要原因有:(1)设备没有通过微软硬件兼容实验室的,这样的问题很难排除;(2)启动的进程太多造成资源枯竭;(3)驱动程序存在bug;(4)BIOS版本较老或BIOS与操作系统之间兼容性不好,等等。

  ●资源耗尽

  一个网友在论坛里发出这样的求助帖子:我是一个游戏工作室的,我的电脑配置为P4 2.8C的CPU,1GB的DDR400内存,SATA120GB×2硬盘。我的工作经常需要同时执行40个相同的软件,但是电脑会发出“当”的一声,程序无法打开。

  系统中的资源是有限的,而每个线程都要占有资源。如果进程数过多,或者某个共享资源的侯选进程数远远超过了可用的资源数,出现资源耗尽的尴尬局面就在所难免了。硬件资源毕竟有限,进程数目因此而受到限制,那位网友的问题只怕找不到答案了。

  其实,同时启动许多进程还会降低程序执行速度,删除不必要的进程,可以提高重要进程的优先级,提高计算机执行程序的速度。值得一提的是,病毒程序发作也会增加进程数,导致资源耗尽,后面将介绍查找和查杀病毒的具体方法。

  ●中断冲突

  如果系统中存在中断冲突,虽然各个硬件勉强可以在系统中共存,但是不能同时进行工作,比如能够上网的时候就不能听音乐等等。中断冲突还会导致找不到设备,或者在启用某些设备时死机。

  中断冲突的情况通常发生在那些共享中断的设备之间,而对于独占中断号的设备来说,是不大可能发生冲突的,因为独占中断号的设备其中断号是固定不变的,也无需用户进行设置。而共享中断的设备也可以通过CMOS设置人为指定一个中断号,不过有了这样的选择,就为发生中断冲突买下了祸根。

  譬如两个PCI插槽中分别插入了一块网卡和一块声卡,系统分配给这

两块接口卡的共享中断号为IRQ18,没有任何问题;但如果人为设置网卡和声卡的中断号都是IRQ18,就等于让两卡都要独占IRQ18。几个设备各自以独占方式使用同一个中断号,不出麻烦才怪呢。

  ●I/O地址冲突

  一般的计算机寻址只能从000到3FF的64K I/O地址空间。由于I/O地址允许CPU和外设分别通信,而且CPU也需要用I/O地址来确认外设,因此一个外设只能对应一个I/O地址。例如,串行口COM1的I/O地址范围为3F8—3FF,共占用了8个I/O地址,其中一个地址保存接收的数据,一个地址保存将要发送的数据,还有的地址用来判断一些状态信息,也有一些一直是空闲的,很多不需要那么多I/O地址的设备都被设置成了8个或16个地址。

  如果有两个或以上的外设被设置成相同的I/O地址,那么CPU发出的信息送到对应的I/O地址时,一方面有些外设并不能处理和响应这个信息,另一方面由于一个I/0地址对应了多个外设,从而导致CPU发出的信息被分成许多路,传输到每个外设的信息强度都不足以使外设做出反应,因此就使得所有使用了错误I/O地址的外设都不能被使用。

  发生地

址冲突的情况通常出现在安装的外设与其它外设间
发生了I/O地址冲突。

  ●进程的死锁与活锁

  当一个进程需要一个资源而另一个进程持有该资源的锁时,如果占有资源的进程性运行,就会发生死锁。死锁将造成系统阻塞,对所有的动作都没有反应,形同死机——假死机。如果你运行某一特定的程序或打开某设备的电源便会死机,往往就是死锁的缘故。

  小知识:真死机与假死机

  死机就是运行停滞,对用户的操作没有反应了。死机有真死机和假死机两种。分辨真假死机,只要按一下小键盘上的[Num Lock]键就知道了,如果[Num Lock]指示灯熄灭,说明是假死机;如果没有[Num Lock]指示灯常亮,说明真的死机了。

  引起真死机的原因非常多,软件、硬件、散热等因素都能造成死机。而假死机是程序执行时间过长,或者进入了死循环。对于真死机,只能按主机箱上的Reset键来重新启动了。而对待假死机,只要中断程序的执行便可返回正活动状态:如果运行的DOS操作系统,按下[Ctrl]+[Break]即可返回到操作界面,如果在Windows环境下,可以使用任务管理器终止“没有响应”的应用程序,即可让系统恢复正常运行。

  死锁的原因通常不容易找到,因为软件和硬件都会造成电脑死锁,譬如操作系统、用户程序存在bug,驱动程序和BIOS版本过于陈旧等,木马驻留内存,也是造成死锁的原因。

  与死锁相对应的另一种情况是活锁。如果一个进程忙于接受新任务以致它永远没有机会完成任何任务时,该进程就会发生“活锁”,这种情况一旦发生,该进程终将超出缓冲区并导致程序崩溃。就像一个秘书需要录入一封信,但她如果一直在忙于接电话,那么这封信永远就不会被录入。

  活锁的情形通常发生在程序员调试程序的过程中,这是因为程序员所编制的程序在进程、线程同步互斥的控制上不够严密所致,这种问题通常会在程序调试阶段就解决了,用户遇到的活锁问题通常是软硬件兼容性不好所导致的。

       四、避开资源冲突的一些措施

  资源冲突的原因很多,采取的规避措施也多种多样,下面是一些常用的措施。

  ●合理配置资源管理器

  我们知道,BIOS和操作系统都能管理系统资源。如果机器安装的是即插即用的操作系统,在CMOS设置中将“PNP OS Installed”设为“Yes”,这样将由操作系统在启动时为设备分配中断、DMA通道等系统资源。如果设为No,那么将由BIOS来分配资源。

  BIOS与操作系统之间通常都是密切配合的,但也有发生矛盾的时候。如果操作系统无法正确分配资源,此时可试试改由BIOS来分配。在BIOS中有PnP/PCI Configuration设置菜单,建议将“Resources Controlled By”设置为[Auto(ESCD)],由BIOS分配PCI插槽的资源(如图4);如果设为[Manual],需要指定每一个中断号的分配,对于个别不支持即插即用功能的板卡,才去手动配置IRQ,否则不要这么做。

在CMOS中配置中断资源

                               &nbs

p;                        图4 在CMOS中配置中断资源

  ●重新分配系统资源

  按照上述做法来分配资源,通常不会发生问题,但事情总会有例外。一台电脑中新装了一块Osprey-500DV视频捕捉卡,无法捕捉声音,在操作系统引导前的机器资源分配表里发现有多个设备使用了同一个中断而且这些设备都是多媒体设备,但查看设备管理器,发现所有的设备都是“该设备工作正常”。

  对于这样一个隐性中断冲突问题,原因估计是视频捕捉卡的这个插槽里曾经插入其他的板卡,系统已经给这个插槽分配了一个中断号,并且也有相应的驱动程序与之相对应。也就是说,虽然换了新设备,系统资源分配仍然还是已经拔去的PCI卡遗留下来的。将视频捕捉卡从系统中删除,并且调换一个PCI插槽,系统启动后重新安装视频捕捉卡驱动程序,音频捕捉功能恢复正常。

  

●关闭闲置资源

  资源耗尽是资源冲突的一个因素,而我们电脑中很多资源处

于闲置状态,常见的是COM口,虽然现在已经很少有人再用它,但它却仍然占用了一个中断号3。为了获得更多的中断资源,建议先把无用设备所占用的中断释放,方法是把这些设备屏蔽掉。

  譬如,我们可以把暂时没有使用的USB端口、COM口和并行口从BIOS里面把其Disabled,能够缓解中断资源紧张的状况。再譬如,Nero Burning刻录软件我们很少使用它,但是你一旦安装了它,每次启动系统都自动加载到内存中,占用宝贵的内存空间。

  我们在任务管理器中能看到很多类似的进程,其中的大部分进程我们可能已经记不清他们的用处,但它们还是会在启动电脑时不厌其烦地加载到内存。对于这些用不着的进程,我们可以在任务管理器中关闭它们,不过太麻烦了,一个简单有效的方法是运行msconfig命令,在启动项中关闭它们(如图5)。这样不仅可以节约资源,又能加快启动速度。

启动项选择

                                                                       图5 启动项选择

  ●解除地址冲突

  如果错误设置了I/O地址导致I/O地址冲突,则发生冲突的设备不可用。不过,可以通过下述方法予以解除:启用安全模式进入系统,然后打开“控制面板”、“系统”,查看标有黄色的“!”的设备;选中该设备,单击窗口下的“属性”,从“资源”列表查看系统给出的提示,单击“输入/输出范围”对其进行更改,直到显示“无冲突设备”时再确定退出即可。

  需要注意的是:对于那些传统的端口,系统已经进行了的定义,I/O地址是固定不变的。譬如COM1端口的地址为03F8~03FF,如果用户对其进行了更改,COM1口就不能用了。

  ●扩大虚拟内存

  有些电脑使用中在任务栏上弹出“虚拟内存不足”的警示框,虚拟内存通常位于C:盘上,如果C:盘剩余空间比较小,当打开的窗口比较多,或者运行一些很大的程序时(譬如在网上看电影)时就会出现虚拟内存不足的情况。

  遇到这种情况,可以分两个步骤进行处理:(1)进行使用分区大师PQmagic软件调整分区大小,扩大C:盘容量(如图6);(2)进入“控制面板”-“系统”-“”-“性能”-“”-“虚拟内存”设置项,适当扩大虚拟内存的值(如图7)。

扩大C盘空间

                                                              图6 扩大C盘空间



调整虚拟内存大小

                                       &

nbsp;        
           图7 调整虚拟内存大小  
       经过这样的调整和设置,就不会再出现虚拟内存不足的警示了。

  ●剿灭病毒进程

  一些良性的计算机病毒通常会寄生在某些文件中,只要一开机,就自动执行,占用系统资源。病毒程序往往都具有隐蔽性,我们在任务管理器中往往找不到病毒进程,但我们已经知道它们的发作通常是通过调用Svshost.exe进程来实现的。

  因为Svchost进程启动各种服务,所以病毒、木马也想尽办法来利用它,企图利用它的特性来迷惑用户,达到感染、入侵、破坏的目的(如冲击波变种病毒“w32.welchia.worm”)。但Windows系统存在多个Svchost进程是很正常的,在受感染的机器中到底哪个是病毒进程呢?正常的Svchost.exe文件保存在“c:\Windows\system32”目录下,如果发现该文件出现在其他目录下就要小心了。譬如“w32.welchia.worm”病毒存在于“c:\Windows\system32\Wins”目录中,查看Svchost进程的执行文件路径就能发现系统是否感染了病毒。但是Windows系统自带的任务管理器看不到正在执行的Svshost.exe文件的位置,只能使用第三方进程管理软件(如“Windows优化大师”中的Windows进程管理)查看(图8),一旦发现Svchost进程的执行路径不在正确的位置,便应立即停止并删除程序。当然,用版本的杀毒软件查杀病毒,也是比较简单有效的办法。

优化大师中Windows进程管理查看Svchost
图8 优化大师中Windows进程管理查看Svchost


  
上一篇:基于I2C总线技术的USB接口设计
下一篇:集群操作平台提升高性能计算水平

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料