Windows 95的系统结构
系统保护环
Windows 95充分利用386处理器的能力,支援两个特权级。它用0和3两个特权级管理微处理器,也可称为两个环。环0中的部件是操作系统的底层,如包括对低级内存储器管理的支持,环0里的软件在整个系统中功能最强,包括了几乎所有微处理器的指令,并能存取关键的数据结构,如页表等。因此环0里的软件最可靠。
Windows 95允许用户安装新的虚拟设备驱动程序(VXD),这些VXD可以支持后加的硬件或提供系统范围内的软件服务。VXD都在环0里运作,因此,如果VXD有一点差错,就会使整个系统崩溃。而如果要开发一种软件,使其能和失败的VXD分离,那将是非常困难的。
在Intel处理器中,环的过度(特权级的改变)会增加程序的运作时间,以Intel 486为例,如果没有环的过度,一个子程序调用另一个段中的代码需要20个时钟周期,有环的过度则需要69个时钟周期。这是因为当处理器的特权级变化时,处理器控制会发生变化,寄存器要重装。因此,较少的环过度意味着性能的提高,这也是Windows 95把其圆形系统的多数代码放在环3的主要原因。
32位:Windows应用程序优先装入的空间为4MB—1.5GB,标准开发工具也缺省地用这个空间,这主要和Windows NT相匹配。当然,用户也可以选择较低的地址空间,这时,用户需要做起额外的工作。系统为每个32位应用标记的低16KB空间不可获得,这主要是为了捕获程式的错误。许多程式常犯的错误是使用空指针,在Windows 95中,空地址将产生内存储器错误,这对开发者及时发现指针错误是有益的。
虚拟机管理器
虚拟机管理器VMM是Windows 95系统的核心,VMM的效率对整个系统的性能有着重要影响。系统中许多复杂的部件都在这里。虚拟机管理器的代码包含以下几项特性:在每个过程的私有地址空间里,32位的Windows应用程序都是抢先调度的;每个32位的应用程序有一个私有的消息队列;VXD能够动态装载和定位,减少系统的操作集;许多系统资源都是按32位内存储器模式开发的,大大提高了系统能力。
Windows 95有两种基本的VM:一是系统VM,KERNEL,USER,GDI部件和Windows的应用程序都在这里;M是MS-DOS VM,运作一个MS-DOS应用程序,这个程序既能运作在虚拟8086模式,也能运作在保护模式。
支持MS-DOS应用程序
Windows支持MS-DOS应用程序,这就意味着当用户工作基于DOS的应用时,不必离开Windows 95。Windows 95软件也提供最新的MS-DOS 6.X版的代码和数据。Windows 95支持单一的MS-DOS应用模式。这种模式对MS-DOS应用提供绝对的兼容性。虽然开发人员做了很大的努力,使更多的MS-DOS程序能在MS-DOS VM下运作,但这种单一的MS-DOS应用模式为那些不能在Windows下运作的MS-DOS程序提供真正的兼容性,这就是说,此模式对以前的DOS版本向下兼容。 Windows 95因MS-DOS之关系,与Windows 3.1的最大区别是:基于Windows的应用完全不需要MS-DOS代码支持。Windows已有许多的版本(如Windows 3.1,Windows for Workgroups 3.1,Windows 3.11等),每种都支持越来越多的MS-DOS INT软件服务。而且,基于Windows的应用程序在进出虚拟86模式时,对MS-DOS代码的需要也在减少。
虚拟机调度方式
Windows 95中的过程调度和虚拟机管理关系十分密切。在Windows 95中,线程是系统调度程序要处理的主要对象,也是调度的基本单元,假如用户熟悉Windows NT,就会习惯处理线程。线程的特征:
1:在过程里是一个可执行路径;
2:能够被任何32位的Windows程序或运作在Windows 95里的VXD创建;
3:有自己私有的堆叠存储器和执行价前后关系;
4:固定的过程分享存储器;
5:一个过程可以创建许多并发的线程。
调试程序
Windows 95的VMM实际上有两个调试程序,即主调度程序和时间片调度程序。前者负责并保证最高优先级的线程一直在执行;后者负责动态调整线程的优先级,以便提供合理的多任务。
首先,主调度程序先检查系统中的每一个线程,然后选择出优先级最高的线程来执行。为了与Windows NT兼容,优先级从0到31,共32级,数字越大优先级越高。同时,为了与以前的Windows版本兼容,设备驱动程序的优先级能设置成比这32级还高。比最高优先级低的线程,主调度程序不予考虑。这里,最高优先级未必是31,假如只有两个线程,优先级一个是20,一个是16,那么最高优先级就是20;如果此时又来一个优先级是21的线程,那么21就成为最高优先级。
除了纯粹的定量求优先级的值外,时间调度程序根据当前VM的状态来决定时间片的分配。假如一个VM有当前的执行焦点(典型)情况是它的视窗是显示的活动视窗,那么,它就是前台VM。当重新计算当前优先级时,调度程序就使前台的优先级提高,而其他VM作为后台考虑,继续没有升高的优先级。
系统虚拟机内的调度
所有基于Windows应用程序的线程都运作在系统VM下,它是支持多任务的唯一VM。系统VM中,一个支持16位应用的子系统,多个是支持32位的Windows应用的。在系统VM下,通常包括多个有效一的,具有相同优先级的线程,为了处理这种情况,调度程序采用Round→Robin调度策略,以确保每个线程公平分配时间片。一旦系统VM中的线程用完了给它的时间片,调度程序就把它放到了这种优先级相同的线程尾部。假如选择的线程失败地用完了分给它的时间片,那么,调度程序就把处理器交给下一个优先级相同的线程,并允许失败的线程利用时间片的剩余部分。
调度程序控制
调度程序控制有两种不同的影响,一种是它本身的一套内部算法,试图为每个线程提供一种平滑的多任务环境。“平滑”的目标是给线程提供一个合理的处理器时间,既要使它能很好地完成工作,又不能太长,以免其他线程被锁住的时间太长。另一个对调度程序的影响是VXD能够直接调用的一套系统服务。为了达到这一目的,调度程序内部采用了三种线程优先级的动态升高,定时的损耗优先级的继承。
线程的应用
Windows的设计者面临的问题之一是如何更好地处理失败的运作程序。要开发完全没有错误的软件是不可能的,因此,Windows必须能够处理应用程序中的错误。其处理过程包括两步:一是恰当地处理失败的程序,即允许用户关闭应用而不掉失数据;二是做好后续的事,除了打开档案外,应用程序都会利用和处理系统提供的资源,如内存储器段、笔、刷等。假如系统不能释放这些资源占用的内存储器,那么可以获得的资源就会减少。
大多数应用程序共有的错误都是寻址时引起的错误。这类错误是由于应用程序试图用无效的指针指向某些对象引起的。在Windows 3.1下就产生GP错误,用户会看到一个对话框,它提供了产生错误的程序模块的细节以及关闭错误程序的选项。
支持多消息队列
Windows程序都是事件驱动的,这种特性要求系统能提供一种由应用程序传递消息的方法。消息可由设备驱动程序、应用程序和系统发出。系统把所有硬件的初始化消息放在一个被称为原始输入队列(RawInput Queue)的数据结构中。
Windows 95支持多消息队列,这种设计的改进来自Windows NT。因为有效的消息流对好的响应时间和平滑多任务是极其重要的,而这种支持多消息队列的设计技术是关键。它能够保证系统在一个应用程序失败时不至于死锁。这种多消息队列技术称做 “异步输入”(Input Desynchronization)。在Windows 95下,经原始输入队列添加消息十分简单。系统中还有一个运作的线程,它有规律地把这消息移出队列转到各个私有应用消息队列。这种队列有两种:所有16位应用程序的单一队列和所有32位应用程序中的线程的私有队列。
API层
Win32 API是Microsoft公司的战略性系统接口,它第一次出现在Windows NT中,并把其子集Win32 API引入到Windows 3.1中。正是由于Win32 API的强大功能及远大前途,Windows 95也包含了Win32。Microsoft公司希望每个应用程序都是32位的,而目前许多应用程序都是16位的。因此,Windows 95的特性必须支持16位应用程序。对于Windows 95,这就意味着要有新的编译器、汇编器和连接程序来开发32位应用程序。系统自身至少必须提供32位版本的包含KERNEL、USER和GDI的Windows子系统来支持新的Win32 API。这些代码必须小、速度快、易于测试,还要有好的文档。
16/32位代码混合
代码混合技术在以前的Windows版本、OS/2和Windows NT中都已使用过,Windows 95中也用了这种技术,并解决了以下问题:
1:32位代码使用32位线性寻址,而16位代码使用16位段选择器加16位偏移量来寻址。要使代码混合使用,必须在两种寻址方式之间有一种转换。解决这个问题的方法,包含一种称为“贴瓦”i-link护的技术,即系统分配一个新的16位段选择子,它描述的存储器能覆盖此时存储器包含的参数。
2:在C语言中,基于Win32的应用中整型是32位,而在16位的应用中是16位的。当调用16位代码时,32位的整数参数必须转换成16位,返回时扩展成32位。如果参数在寄存器中,这种转换就容易些。但许多Windows函数把参数放在堆叠中。
3:返回32位值(如指针)的16位代码要用DX:AX这对寄存器,而32位代码希望返回值放入EAX寄存器中。
4:32位代码用386的SS:ESP寄存器对为堆叠寻址,而16位代码用SS:SP寄存器对。这就必须进行反复的寄存器交换,可能还要进行参数拷贝。
2024-10-28 广告