具体实施方式
以下将结合附图对本发明的优选实施例进行说明。
图1以举例的方式说明了本发明所采用的硬件结构。虽然下面专门讲述的是一个TV系统,应能理解,本发明可以被应用于各种各样的使用操作系统的数据处理装置中,例如,本发明可以被有效地使用于声像系统、即所称的AV系统,办公室用具、计算机等装置,以及如下要说明的电视系统。
参照图1,做为本发明的数据处理装置的实施例的TV系统通过空中(天线)或通过电缆从台站接收信号。TV系统按所接收到的信号在CRT或液晶显示装置上显示图像,同时从扬声器向外输出声音信号。
此TV系统除一般的功能外还具有接收从外部输入的程序和数据的功能。特别是图1所示TV系统具有通过总线/IO桥1连接至总线2上的TV功能部件3、通过总线/存储器桥4连接到总线2上的处理器5、同样通过总线/存储器桥4连接到处理器5上的ROM(只读存储器)6和RAM(随机存储器)7、连到总线2上的操作面板8和也连到总线2上的外部存储设备9和通讯设备10。
TV功能部件3具有根据空中或电缆接收的信号产生图像和声音的功能,并且被通过总线/IO桥1连接至总线2上以和系统其它的设备进行通讯。
处理器5控制着构成TV系统的各种设备的操作。为达到这个目的,处理器5通过总线/存储器桥4连至总线2上。ROM6和RAM7也通过总线/存储器桥4连接至处理器5上。
ROM6中存储着用以使处理器5执行控制的操作系统、应用程序等。在本实施例中,操作系统使用了一个纳内核并且是面向对象的。这样,操作系统也是一个面向对象的纳内核操作系统。
RAM7被用做是一个处理器5的工作区。这样,处理器5当执行操作系统和应用程序时将RAM7用作一个工作区,这样便控制了各种构成TV系统的设备的操作。
操作面板8起到输入设备的作用,它接收用户输入的操作指令,如用于通道转接或音量控制的指令。特别是操作面板8具有一个如带有多个键钮和如鼠标器等指点设备的控制台的输入设备。通过操作面板8输入的信号通过总线2和总线/存储器桥4传送至处理器5。按照通过操作面板8输入的信号,处理器5执行各种计算以控制部件设备。
可以是硬盘设备的外部存储设备9,存储着通过通讯设备10从外部系统上下载下来的图像数据、控制数据和应用程序,这样,通讯设备10起到I/O部件的作用,承担着与外部系统信号转接的作用,例如它可以包含,MODEM或终端适配器。
TV系统不仅执行由TV功能部件3提供的一般的TV功能还具有各种其它的功能。例如,TV系统可以接收通过通讯设备10来自外部系统的程序和数据。这个功能使操作系统和设备驱动程序的版本的更新简单只要通过通讯设备10从外部网络接收新的软件模块即可。
TV系统在处理器5的控制下执行存储在ROM6中的操作系统,并且允许存储在ROM6或外部存储设备9中的应用程序运行在操作系统上,这样,控制了部件设备。这样ROM6起到计算机可读存储介质的作用。它存储着操作系统和驱动程序。然而操作系统可以被存储在RAM7中或外部存储设备9中。当需要重写操作系统和设备驱动程序时,最好采用RAM7或外部存储设备9中的存储。
以下将说明TV系统的软件环境。
该TV系统中使用的操作系统为一采用了纳内核的纳内核类型操作系统。如图2所示,其中使用了总核来作为负责上下文转接的纳内核。
此纳内核操作系统是面向对象的,这样,在做为纳内核的总内核上的运行整体是对象。对象由消息传递来实现交互。
此操作系统同时地提供多种程序运行环境,在下面说明中,由此操作系统提供的程序运行环境将被称为是元空间(meta-space)。如图2所示,此操作系统提供3种元空间,即,元空间mCOOP、元空间mDrive和元空间mCore。每个元空间由多个对象构成。在下面的说明中,每一构成元空间的元空间被称为“元对象”。
元空间mCOOP被用来实现面向对象的如实现控制操作面板8的图形用户界面的程序的应用程序的运行。表示mCOOP的首字符“m”是元空间的指示符,COOP是“当前面向对象编程”的缩写。
元空间mDrive用于负责控制硬件设备的设备驱动程序的运行。表示mDrive的首字符“m”是元空间的指示符“Drive”意为此元空间用于设备驱动程序的运行。
元空间mCore用于构成元空间mCOOP和mDrive的元对象的运行。这样元空间mCore对应于微内核。表示mCore的首字符“m”是元空间的指示符,“Core”指示此元空间构成了操作系统的一个“核”。
这样,操作系统的层次结构便如图2所示,元空间mCOOP和mDrive运行其上的元空间mCore运行在如CPU的硬件设备上,面向对象的应用程序和设备驱动程序分别运行在元空间mCOOP和元空间mDrive上。这些上下文之间的上下文转接由总核控制。
除元空间mCOOP和mDrive外操作系统还提供其它的能运行在元空间mCore上的元空间,如过程应用程序,例如使TV功能部件显示活动图像的应用程序。然而,由于本发明可被等同地应用于各种运行在元空间mCore上的元空间,元空间mCOOP和mDrive以外的元空间的解释在下面的说明中省略。这样下面将以举例方式详细说明元空间mCOOP和mDrive。
如图2所示,有构成元空间mCOOP的三种类型的元对象:即mCOOPScheduler对象、mCOOPMailer对象和mCOOpFaultHander对象。mCOOPScheduler对象即是所说的“调度程序”,它是一个元对象,它负责运行在元空间mCOOP上的应用程序的调度管理。mCOOPMaier对象是一个元对象,它执行运行在元空间mCOOP上的应用程序之间的信息传递。mCOOPFauleHander对象是一个用于例外处理的元对象。除以上专门提到的元对象外,元空间mCOOP还具有各种元对象成份。
参照图2,有三种构成元空间mDrive的元对象,即对象mDriveScheduler和对象mDriveMailer和对象mDriveFaultHandler。对象mDriveScheduler是所说的“调度程序”,他是一个元对象负责运行在元空间mDrive上的设备驱动程序的调度管理。对象mDriveMailer是一个元对象,它运行在元mDrive上上。对象mDriveFaultltandler是一个意外处理元对象。元空间mDrive除上述元对象外有各种元对象做为组成成份。
参照图2,有两种构成元空间mCore的元对象:即mCoreScheduler对象和mCoreMailer对象。mCoreScheduler对象即是所谓的调度程序,它是一个负责运行在元空间mCore上的对象的调度管理元对象。mCoreMailer对象是一个元对象,它执行运行在元空间mCore之上的对象之间的消息传递。元空间mCore除以上专门提到的两类元对象外还具有各种元对象成份。
虽然所说明的实施例中,每一元空间采用其自己的元对象做为调度程序,但这并不是必须的,还可以将调度元对象设置成一个被所有元空间共同使用的元对象。在这样的设置中,例如,一个调度元对象在被元空间mCOOP使用时做为一个属于该元空间mCOOP的元对象。相似地,该调度元对象在被元空间mDrive使用时做为一个属于该元空间的对象以及该调度元对象在被元空间mCore使用时做为一个属于该元空间的对象。
在元空间上运行的对象在下面的说明中将被称为“基对象”(base-object),用于使基对象获得元对象提供服务的元对象的调用被称之为“元调用”。这样,元调用等同于大内核类型操作系统的系统调用。基对象和元对象之间的上下文转接由对应于纳内核的总核来完成。
在下面的说明中,“调度程序”这一术语集中代表调度元对象,包括mCOOPScheduler对象、mDriveScheduler对象、和mCoreScheduler对象。
在进行实施例说明之前,需要说明一下纳内核型操作系统中所采用的一般调度管理方法。参照附图3和4将进行说明,附图3和4说明了对象A和对象B之间发送信息的操作,对象A是一个运行在元空间mCOOP之上的应用程序,对象B也是一个运行在同一个mCOOP之上的应用程序。图3在说明操作系统层次结构的同时还说明了从对象A到对象B发送消息的过程。图3中省略了元空间mDrive的示出。图4是一个时间图表,说明了执行从对象A至对象B的消息邮递的对象A和对象B之间的对象交互。
其过程如下:
(1)对mCOOPMaier元调用
首先,由对象A调用在元空间mCOOP上的mCOOPMaier对象以发出元调用。这样,为使对象A到对象B传递消息,负责对象间消息传递的mCOOPMaier对象被调用。
更详细地,为调用负责处理从对象A发出的元调用的mCOOPMaier对象,由箭头A1指示了一个对元空间mCore上的对象mCoreScheduler的调用,在元空间mCore上运行着指定的mCOOPMaier对象。这样,在元空间mCore上的对象便处于mCoreScheduler对象的调度控制之下。在这种状态下,在元空间mCOOP上的指定的对象mCOOPMaier被调用,如箭头2指示。
(2)向mCOOPScheduler发送信息。
之后,为了启动对象B,对象mCOOPMaier向元空间mCOOP上的对象mCOOPScheduler发送消息。更详细地,对象B的启动要求运行在元空间mCOOP之上的对象的调度管理。上述提到的用于启动对象B的消息因此被发送给执行元空间mCOOP上对象的调度管理的对象mCOOPScheduler。
为详细解释,从对象mCOOPMaier到对象mCOOPScheduler的消息发送开始于由箭头A3指示的对做为元对象的负责运行在元空间mCore上的对象间消息传递的mCoreMailer对象的调用。相应地,如箭头A4所指示,由于消息目的地对象mCOOPScheduler运行在元空间mCore上,做为元对象的负责运行在元空间mCore之上的对象的调度管理的mCoreScheduler对象被调用。这样,在元空间mCore上的对象便处于由mCoreScheduler对象执行的调度控制之下。在这个调度控制之下,mCOOPScheduler调度程度对象被启动,如箭头A5指示并且,上述用于启动对象B的消息被发往mCOOPScheduler对象。
(3)回答mCOOPMaier
接收到消息后,mCOOPScheduler对象立刻按所接收消息改变对象B的状态,并且对此消息发一回答消息至mCOOPMaier对象。
为详细解释,此回答操作执行如下。为从mCOOPScheduler对象发送回答至mCOOPMaier对象,由箭头A6指示了一个调用,调用负责运行在元空间mCore之上的对象间的消息传递的mCoreMailer对象。之后,为使回答目的地对象mCOOPMaier工作在元空间mCore之上,由箭头A7指示发出一个调用,调用做为元对象的负责运行在元空间mCore之上的对象的调度管理的mCoreScheduler对象。在由mCoreScheduler对象执行的对运行在元空间mCore之上的对象的调度管理之下,由箭头A8所指示,mCOOPMaier对象被启动,并且由mCOOPScheduler对象发出的回答被发往启动的mCOOPMaier对象。
(4)恢复基对象
当由mCOOPMaier对象执行的处理完毕时,对对象A和B的处理开始。
首先如箭头A9所示该处理进行mCOOPScheduler对象的调用。在mCoreScheduler对象执行例如重调度的处理之后,如箭头A10所示,做为基对象的对象B被调用,就此启动了处理。但应当注意,若优先级设定为对象A的处理优先于对象B的处理,处理先从对象A开始,即箭头A10调用对象A。
在一般调度管理机构下的从对象A到对象B的消息发送过程已被说明。
可以看出,一般的调度管理机构要求执行相当大量的对象转接,即大量的上下文转接。在所说明的系统中,这些上下文转接由做为纳内核的总内核控制和执行。这些大量的上下文转接不良地影响了系统的整体性能。这样改善使用需要大量上下文转接的一般的调度管理机构的操作系统的整体性能便很困难。
如下将说明本发明所采用的调度管理机构。
通常,对象的交互具有相互依赖性。这样,便存在这样一些情况,即不论调度是否执行,对象之间执行的转换的序列不变。在这样的情况下,按照本发明,调度操作由有意地阻止调度程序的调用而省去。靠有效地利用对象执行转换序列调度程序的调用频度被减小。这样便减小了相应的上下支转接的数量,改善了系统的整体性能。
下面将参考附图5和6以实施例说明按照本发明的调度管理过程。为了便于比较本发明的调度管理过程和一般的调度管理过程,如下的说明是根据下面这样一种情况,如同在说明一般的过程中,消息从对象A发往对象B,对象A是一个运行在元空间mCOOP上的应用程序,对象B是运行在元空间之上的另一个应用程序。图5中,相似于图3,说明了从对象A到对象B发送消息的过程以及操作系统的层次结构,图6中,与图4相似,说明了在对象A至对象B发送消息的过程中对象交互的时间图表。
该过程如下
(1)对mCOOPMaier元调用
首先由对象A发出元调用以调用运行在元空间mCOOP之上的mCOOPMaier对象。这样,为使消息从对象A发至对象B,在元空间mCOOP之上的负责对象间消息传递的mCOOPMaier对象被调用。
此时mCOOPMaier对象如箭头B1所示由从对象A的元调用直接被调用。对象A必须等待由mCOOPMaier对象所做处理完成。这样,在从对象A到mCOOPMaier对象的运行转换中存在一个序列,因而不用象在一般调度管理过程中那样为了调度管理调用mCoreScheduler对象,直接地调用了mCOOPMaier对象。
(2)发送消息到mCOOP调程序。
之后,为了启动对象B,对象mCOOPMaier向运行在元空间mCOOP之上的mCOOPScheduler对象发送消息。详细地说,对象B的启动要求运行在元空间mCOOP之上的对象的调度管理。因此上述的用于启动对象B必需的消息被发送至做为元对象的负责在元空间mCOOP上的对象调度管理的mCOOPScheduler对象。
为详细解释,从mCOOPMaier对象至mCOOPScheduler对象的消息发送开始于由箭头B2所指示的对做为元对象的负责运行在元空间mCore之上的对象之间消息传递的mCoreMailer对象的调用。之后,如箭头B3所指示,mCOOPScheduler对象被直接调用,并且上述用于启动对象B必需的消息被发送至mCOOPScheduler对象。
应当理解,mCOOPMailer对象必须等待mCOOPScheduler对象所做处理的完成,这样在从mCOOPMailer到mCOOPScheduler的运行转换中存在序列。因此,调用B3直接调用mCOOPScheduler对象,而不用象一般的调度管理过程中那样为了调度管理调用mCoreScheduler对象。这样,与本发明一致,在同一元空间上的对象间的消息传递当存在运行转换序列时执行跳过调用调度程序的步骤,这种消息传递的方式在下面的说明中被称为“FastSend”。
(3)回答mCOOPMaier
接到消息后,mCOOPScheduler对象按所收消息改变对象B的状态,并以FastSend的方式发送回答此消息的消息至mCOOPMaier对象。
为详细说明,这种回答操作如下执行。为使mCOOPScheduler对象发送回答至mCOOPMaier对象,由箭头B4指示发出一个调用,调用负责运行在元空间mCore上的对象间消息传递的mCoreMailer对象。之后,由箭头B5指示,mCOOPMaier对象被直接调用,并且从mCOOPScheduler对象的回答发往mCOOPMaier对象。在从mCOOPScheduler对象到mCOOPMaier对象的运行转换中存在序列。因此,调用B5被发出以使回答直接发至mCOOPMaier对象,而不用象一般的调度管理过程那样为调度管理调用mCoreScheduler对象。
(4)恢复基对象。
当由mCOOPMaier对象执行的处理完成后,开始对象A和B的处理。
由箭头B6所指示此处理开始于对mCoreScheduler对象的调用。当mCoreScheduler对象执行了如重调度之类的处理后,做为一个基对象的对象B被调用如箭头B7指示,这样处理被启动。但应注意,如果所设优先级为在对象A中的处理优先于在对象B中处理时,处理首先从对象A开始,即箭头B7调用对象A。
从上面说明中应能理解,本发明通过使用实现直接元调用的FastSend功能和机构省略了调用调度程序的步骤。这样,本发明减少了所要执行的上下文转接数量,比使用一般的调度管理机构的系统具有系统整体性能上的改进。
虽然在前面的说明中,消息传递处理被举例详细地说明成具有跳过调用调度程序的优点的处理,此优点也可以实现于其它的处理之中。例如,调用调度程序的省略也可以在一中断处理中实现。在这种情况下,中断等待时间可以因消除了用于调用调度程序的时间而被缩短。这样,调用调度程序的省略可适用于需要快速执行的处理,例如执行响应于中断的处理。
但仅省略调用调度程序的步骤会造成对象实际状态和调度程序所掌握状态的不一致。这样带来了系统操作出错的风险。因此,为与本发明一致,采用了一种机构以确保对象实际状态和调度程序所掌握状态的一致。这个机构在本说明中将被称为是“延迟队列机构”。
在进行延迟队列机构的说明之前,图7给出了一个参考,示出了对象的线程状态。
每一个线程被分配给一个对象,由调度程序执行的调度管理以线程为基础来被执行。在此假定线程可以有取三种状态之一,“睡眠”,“等待”和“运行”。睡眠状态意为由于相关的对象无活动而此线程不处于激活状态。等待状态意为由于相关对象正等待某一事件而此线程不处于激活状态。运行状态意为对象正被执行。这样,运行状态指明线程是激活的或线程是在调度程序控制下的队列里并且正等待CPU处理时间的分配。调度程序在接到另一对象的请求时改变对象的线程状态并且更新在线程中的队列。
延迟的队列机构将在下面说明。
延迟队列机构的使用要求为每一线程分配一结构。当从一线程向另一线程(分别称为“源线程”和“目标线程”)的上下文转接产生运行转换时,上下文转接的历史被存于结构中。上下文转接的历史为每一线程存放了运行转换的性质以及做为运行变换结果激活每一线程的线程。这样,上下文转接的历史包括标明了恰在运行变换之前即源线程运行的线程的信息以及标明了触发目标线程例如元调用或FastSend的原因。
当调度程序被调用时,延迟队列机构找回记录在结构中的历史以保持对象实际状态和调度程序的所掌握状态匹配。更详细地,当调度程序被调用时,延迟队列机构被启动并参照记录在结构中的信息跟踪回上次调用调度程序所执行的上下文转接历史。延迟队列机构按记录历史与实际对象状态一致地改变由调度程序识别的对象状态,同时更新线程中的队列,以此达到对象实际状态和调度程序所掌握对象状态的匹配。
这样,放置于延迟队列机构的操作下的线程便是那些省略了调用调度程序步骤而已被触发的线程。更详细地,这些线程包括一系列线程,从恰在调度程序的当前调用之前运行的线程(此线程被称为“当前线程”)到调度程序为响应上一次调用而触发的线程(此线程为“激活现程”)。这样,由调度程序触发的响应于上一次调用的“激活线程”即是由调度程序识别的当前运行的线程。
延迟队列机构执行和线程状态有关的由调度程序识别的信息的更新,这个更新按下面的表1所示规则进行。
表1
|
源线程状态 |
目标线程状态 |
上下文转接之前 |
上下文转接之后 |
上下文转接之前 |
上下文转接之后 |
元调用 |
运行 |
等待 |
睡眠 |
运行 |
FastSend |
运行 |
运行 |
睡眠 |
运行 |
这样,其做为由元调用产生的上下文转接的结果启动了目标线程,源线程在上下文转接之后被设成等待状态并且目标线程在上下文转接上后被设成运行状态。相反,若目标线程做为由FastSend产生的上下文转接结果被启动,源线程在上下文转接之后被设成运行状态并且目标线程在上下文转接之后也被设成运行状态。源线程和目标线程的状态在本质上是睡眠状态不论上下文转接是由元调用还是由FastSend引起。
下面将参照图8的流程图详细说明延迟队列机构的算法。在这个流程图中的以及在图9的流程图中,以面向对象的编程语言C++的表达式来描述每一步骤所执行处理。
延迟队列机构以在调度程序中描述的“Scheduler∷Delayed Queuing()”的方法实现。换言之,当调度程序被调用时,最好用执行“Scheduler∷DelayedQueuing()”的方法来激活延迟队列机构。
在本方法“Scheduler∷Delayed Queuing()”的第一步中,恰在调度程序被调用之前已被激活的线程“CurrentThread”被分配给在延迟队列机构中使用的变量“pThread”。这样,当第一步结束时,变量“pThread”表示当调度程序被调用时已被激活的线程。
在第二步“pThread”被用来与“active Thread”进行比较,“activeThread”是由调度程序为响应上一次对调度程序的调用而激活的线程,即被调度程序识别为当前激活的线程。若“pThread”与“active Thread”不同,即当“pThread”没有指示出上一次由调度程序激活的线程时,处理向前至步骤3。然而,若“pThread”与“active Thread”相同时,即当“pThread”指示出上一次由调度程序激活的线程时,处理跳至步骤10。
步骤3判定对由“pThread”指示的线程的调用是由元调用发出的还是由“FastSend”发出的。当步骤3判定为调用由元调用发出的则过程前进至步骤4,否则,过程前进至步骤7。这样,当在步骤3中判定调用由“FastSend”发出时,执行步骤7。
由“pThread”指示的线程被元调用调用的事实意为此理程为源线程,即从基对象到元对象产生上下文转接的源线程。因此,在步骤4中,在此线程上设置了一个队列更新标志。在图8中队列更新标志被表示为“HOOKflag”。由异步调度机构使用的此队列更新标志,后面将说明。在步骤4中设置了标志之后,过程前进至步骤5。
这样,由于由“pThread”指示的线程是由元调用所调用而执行步骤5。这样在步骤5中,恰在由“pThread”指示的线程之前已运行的线程的状态被设置成等待,这与表1所示一致。步骤5中完成处理之后,过程前进至步骤6。
在步骤6中,为了跟踪回上下文历史,“pThread”的内容被改变以使“pThread”指示恰在由“pThread”所指示的线程之前运行的线程。然后处理返回至步骤3以重复已述步骤。
在步骤7中,在由“pThread”所指示的线程中设置队列标志,如在步骤4中的情况。当步骤7的处理完成后,过程前进至步骤8。
这样,由于由“pThread”所指示线程被“FastSend”调用而步骤8被执行。因而在步骤8中,恰在由“pThread”所指示线程前运行的线程的状态被设置成“运行”,这与表1所示规则一致。步骤8的处理完成之后,过程前进至步骤9。
步骤9中,恰在由“pThread”所指示的线程前运行的线程,即其状态在步骤8中被设定为是“运行”的线程被加入到在调度程序管理之下的队列中。步骤9的处理结束后,过程前进至步骤6。
如前已述,步骤6中,为了跟踪回上下文历史,“pThread”的内容被改变,以使“pThread”指示恰在由“pThread”已经指示的线程之前运行的线程。然后处理返回至步骤2以重复已述步骤。
在步骤7中,如同步骤4的情况,在由“pThread”所指示的线程中设置队列标志。在步骤7的处理完成后,过程前进至步骤8。
这样,由于由“pThread”所指示线程被“FastSend”调用而步骤8被执行。因而在步骤8中,恰在由“pThread”所指示的线程前运行的线程的状态被设置成“运行”,这与表1所示规则一致。步骤8的处理完成后,过程前进至步骤9。
在步骤9中,恰在由“pThread”所指示的线程前运行的线程,即其状态在步骤8中设定为是“运行”的线程被加入到在调度程序管理之下的队列中,步骤9的处理结束后,过程前进至步骤6。
如前所述,在步骤6中,为了跟踪回上下文历史,“pThread”的内容被改变以使“pThread”指示恰在由“pThread”所指示线程前运行的线程。然后处理返回至步骤2以重复已述步骤。
如前所述,若在步骤2中进行的比较指示“pThread”指示的是上次由调度程序激活的同一线程,则过程直接跳至步骤10。在步骤10中,“CurrentThread”被分配给“active Thread”。“active Thread”是被调度程序识别为正激活的线程,“CurrentThread”是恰在调度程序被调用之前活动的线程。这样,当在步骤10中的处理完成之后,被调度程序识别为是正激活的线程便是恰好在调度程序被调用前激活的线程。
可以看出,在开始时,仅当“CurrentThread”和“active Thread”一样时,即当调用调度程序的线程与上一次由调度程序调用的线程一样时,才发生从步骤2跳至步骤10越过步骤3至9。
当在上下文转接历史中没有省略调用调度程序的上下支转接时,正调用调度程序的线程便与由调度程序上一次调用的线程是同一线程。相反,当上下文转接历史包括一个省略调度程序调用的上下文转接时,正调用调度程序的线程便与上一次由调度程序调用的线程不是一个线程。
这样,若没有省略调用调度程序的上下文转接,则在过程开始时,“ CurrentThread”和“active Thread”是相同的。在这种情况下,该过程在步骤1之后跳过步骤3至步骤9而从步骤2至步骤10。在步骤10中没有实际的处理被执行,因为“active Thread”与“CurrentThread”已经是相同的。相反,当存在不调用调度程序而被执行的上下文转接时,“CurrentThread”和“active Thread”便不相同。这样,执行下面的步骤3以跟踪回上下文转接历史中以定位不调用调度程序而执行的上下文转接。
因此完成在上次上下文转接时省略的线程和队列的改变和更新,这样,达到到对象实际状态和调度程序所掌握对象状态的一致。
本技术领域人员可以看出如上说明的延迟队列机构还可被用于因需要加急处理如中断而省略调度程序调用的情况中,虽然在如上说明的实施例中,延迟队列机构被用于调度程序的调用在消息传递的过程中被省略的情况。
当与调度程序一样的元空间的对象间的上下文转接序列不受由延迟队列机构执行的对象状态的改变的影响时,在由“Scheduler∷Delayed Queue”所执行的处理之前如图9流程所示“CurrentThread”可以由方法“Scheduler∷Check Invoke()”所设置。
方法“Scheduler∷Check Invoke()”开始于步骤21,将“SchedulerThread”指定给“PThreda”。“Scheduler Thread”的意思是调度程序的线程。这样,步骤21完成后,“pThread”指向调度程序的线程。
步骤22判定是否由“pThread”所指示线程的调用由“FastSend”产生。若是,即如果“FastSend”调用了此线程,过程前进至步骤23。
由“pThread”所指示线程由“FastSend”调用的事实是指此线程和恰在此线程前运行的线程是与调度程序同一元空间的元对象线程。这样,步骤23仅当由“pThread”所指示线程与恰在其前运行的线程是与调度程序相同的元空间的元对象的线程时被执行。因此这种情况下,使延迟队列机构工作的“CurrentThread”跟踪回恰在“CurrentThread”前运行的线程。因此在步骤23中,“pThread”被更新以指示恰在由“pThread”所指示线程前运行的线程。然后过程返回步骤22以重复步骤22和23。
相反,当在步骤22中判定由“pThread”所指示线程的调用不是由“FastSend”产生时,过程跳至步骤24。可看出做此跳步时恰在由“pThread”所指示线程前运行的线程不是与调度程序同一元空间上的元对象的线程。
在步骤24中,“pThread”被分配给“CurrentThread”,这样,由“pThread”所指示线程被设为由“CurrentThread”所指线程。因此,当步骤24的操作被完成时,恰在由“CurrentThread”所指示线程前运行的线程不是与调度程序一样的元空间的一个对象的线程。
当在步骤24中执行的“CurrentThread”的设定完成时,方法“Scheduler∷CheckInvoke()”的处理被完成且过程前进至上述方法“Scheduler∷delayed Qneuing()”的处理。
运样,在“CurrentThread”的设定之后执行方法“Scheduler∷DelayedQneuing()”的处理。这种处理序列靠跟踪回转接上下文历史而减少了调度程序状态更新的处理,这样,改善了处理的效率。
当由延迟队列机构改变队列时设置队列更新标志,按标志异步地调用调度程序执行再调度。更详细地说,当延迟队列机构被激活时,为触发需要再调度的上下文转接的源转接设置队列更新标志。当此上下文转接被激活时,调度程序被调用而执行再调度此机构被称为“异步调度程序调用机构”。
由异步调度程序调用机构所执行的处理的过程如下:
(1)当队列的更新由延迟队列机构实现时,队列更新标志被设置于触发从元对象到基对象的上下文转接的源线程。此标志的设置在如上参照图8说明的流程图中步骤4和步骤7中执行。
(2)当发生从元对象到基对象的上下文转接时,在激活目标线程即基对象线程前,检查是否在源线程上即元对象上设置了队列更新标志。当在源线程上这样的标志被证实了后,调度程序被调用而取代调用目标线程。调度程序在从元对象到基对象的上下文转接之前执行重调度。
队列更新标志的设置如下进行,取决于调度程序改变队列的条件。
(1)当延迟队列机构被对象“mCore”调度程序执行时,队列更新标志被设置在引起从构成元空间mCore的对象到运行在元空间mCore上的对象的上下文转接的线程上。当调度程序做为一个元空间mCore的元对象以执行延迟队列机构时,调度程序被所有元空间公用的情况下,也能进行这个设置。
(2)当延迟队列机构被由元空间mCore的元对象调用的mCOOPScheduler对象已经执行时,队列更新标志被设置在引起从构成元空间mCOOP的对象到运行在元空间mCOOP上的对象的上下文转接的线程上。当调度程序做为一个元空间mCOOP的元对象执行延迟队列机构时,调度程序被所有元空间公用的情况下,也能进行这个设置。通过使用图9所示方法“Scheduler∷Check Invoke()”改变启动延迟队列机构的线程而执行这个标志的设置。
下面将详细说明采用如上所述队列更新标志的异步调度程序调用机构。此说明将以举例方式说明从运行在元空间mCOOP上的对象A向运行在元空间mDrive上的对象C发送消息的情况。假定调度程序被所有元空间公用,即通过公用“Scheduler”对象在所有元空间上执行调度管理。
图10和11说明了从对象A到对象C传递消息的过程。具体地说,如图3和图5的情况,图10说明了此过程及操作系统的层次结构。图11是一个时间图表。如4和6情况,说明了从对象A到对象C消息的传递期间执行的对象的交互。
此过程如下:
(1)对mCOOPMailer的元调用。
对象A用元调用调用元空间mCOOP的mCOOPMailer对象。这样,负责由运行在元空间mCOOP之上的对象所执行消息传递的mCOOPMailer对象被调用,以使消息从对象A传至对象C。
在这种情况下,如箭头C1所示,mCOOPMailer对象由来自对象A的元调用调用。这样,因为在从对象A到mCOOPMaier对象的运行转换中存在序列,mCOOPMaier被直接调用而不必为了调度管理而调用调度程序对象。
(2)向mDriveMailer发送消息。
作为消息目的地对象的对象C,位于元空间mDrive上。这样,要求向对象C传递消息的消息被发往做为元对象负责由运行在元空间mDrive上的对象的消息传递的mDriveMailer对象上。
具体地说,为使消息从mCOOPMaier对象到mDriveMailer对象之间传递,如箭头C2所指示,执行对对象mCoreMailer的调用,该mCoreMailer是一个元对象负责运行在元空间mCore上的对象间的消息传递。相应地,如箭头C3所指示,直接调用对象mDriveMailer。应注意,对象mDriveMailer被直接调用,而不必为调度管理而调用调度程序,因为在从对象mCOOPMailer到对象mDriveMailer的运行转换中存在序列。换言之,FastSend实现了从对象mCOOP Mailer到对象mDrive Mailer的消息传递。
(3)向调度程序发送信息。
之后,对象mDrive Mailer向对象Scheduler发送消息,以激活对象C。对象C的激活要求调度管理。为达到此目的,用于激活对象C必需的。消息被发至做为元对象负责调度管理的对象Scheduler。
具体地说,为使消息从对象mDrive Mailer传递至对象Scheduler,如箭头C4所示,调用被执行以调用做为元对象负责运行在元空间mCore上的对象间消息传递的对象mCore Mailer。之后,由箭头C5指示,直接调用对象Scheduler,并且用于激活对象C的必需消息被发往对象Scheduler。应注意,对象Scheduler被直接调用而不必调度步骤,因为在从对象mCOOP Mailer到对象Scheduler的运行转换中存在序列。这样,从对象mDriveMailer到对象Scheduler的消息传递由Fast Send完成。
(4)更新调度队列。
之后,对象Scheduler按所收到消息改变对象C的状态,并且使延迟队列机构改变队列。
因要改变对象C的状态对象Scheduler被调用,并且起到元空间mDrive的元对象的作用。这样,对象Scheduler在激活为恢复运行在元空间mDrive上的对象的执行的上下文转接或为恢复运行在元空间mCOOP上的对象的执行的上下文转接的线程上设置队列更新标志,其中该mCOOP元空间与元空间mDrive具有同一层次结构。具体地说,对象Scheduler在对象mCOOPMailer的线程上设立一个队列更新标志。
这一操作可以如下具体实现,用方法“Scheduler∷CheckInvoke()”的算法来跟踪下列序列的对象执行转换,之后执行从对象mCore Mailer(2)开始的延迟队列机构:对象Scheduler、对象mCoreMailer(1)、对象mDriveMailer、对象mCoreMailer(2)、对象mCOOPmailer、对象A。
对象mCoreMailer(1)和对象mCore mailer(2)是同一对象。后缀(1)和(2)是用来说明此对象被调用的时间上的区别。
(5)之后,为响应由Fast Send从对象mDriveMailer发送给对象Scheduler的消息,对象Scheduler向对象mDriveMailer发送回答。具体地说,为使回答从对象Scheduler发送至对象mDrive,如箭头C6所示执行调用以调用做为元对象负责运行在元空间mCore之上的对象间消息传递的对象mCoreMailer。之后,如箭头C7所示直接调用对象mDriveMailer并且从对象Scheduler的回答被发往对象mDrive。回答被直接发往对象mDrivemailer而不用进行调度,因为在从对象Scheduler到对象mDriveMailer的运行转换中存在序列。对象mDriveMailer的执行这样被恢复。
(6)回答mCOOPMailer。
之后,为响应由Fast Send从对象mCOOPMailer发送的消息,对象mDriveMailer向对象mCOOP Mailer发送回答。
具体地说,为使回答从对象mDrive发至对象mCOOPMailer,如箭头C8所示执行调用以调用做为元对象负责运行在元空间mCore上的对象间消息传递的对象mCoreMailer,对象mCOOPMailer如箭头9所示直接被调用,并且从对象mDrive Mailer的回答被发送至对象mCOOP Mailer。此回答直接被发至对象mCOOPMailer而不用调度,因为在从对象mDrive Mailer到对象mCOOPMailer的运行转换中存在序列。对象mCOOPMailer的执行被恢复。
(7)恢复基对象
由对象mCOOP Mailer所执行的处理完毕后,为恢复对象A,上下文转接处理被执行以转接上下文到对象A。但是,应理解,队列更新标志被设置在做为此上下文转接的源线程的对象mCOOP Mailer的线程上。这样,实际上执行了异步调用机构的激活而不是到对象A的上下文转接。即不执行对象A的恢复而调用对象Scheduler,如箭头C10所指示。
(8)重调度
这样重调度被对象Scheduler执行。假定在此队列的调度被更新以使对象C在对象A的执行前被执行。这样重调度便被对象Scheduler执行以使对象C被接下来执行。因此对象C如箭头C11所示被调用并且执行。
可以看出调度程序即对象Scheduler的调用次数可以被明显地减少。这是因为在从对象A到对象B的发送消息的消息传递操作中使用了异步调度程序调用机构。具体地说,在所述实施例中,对运行在元空间mCOOP或mDrive上的对象调度被延迟,并且当发生上下文转接以恢复对象A的线程时,调度程序被以异步方式调用。可以理解,与执行回答Fast Send消息的上下文转接每次调用调度程序相比,调度程序的调用次数减少了2次。
在如上说明的实施例中,在调度程序的控制下的队列更新只对运行在元空间mCOOP和元空间mDrive上的对象实施。这样,更新一点不影响运行在元空间mCore上的对象。以延迟对运动在元空间mCOOP和mDrive上的对象的调度为代价的调度程序调用次数的减少不产生任何对整系统的不良影响。
从上述说明中可以理解,本发明最小化了调度程序的调用次数,同时保证了整个系统的正常操作,这样实现了使用纳内核时的整个系统性能的改善。
虽然通过优选形式描述了所描述的实施例,但应理解在不偏离所附权利要求所限定的范围内可以对本发明做各种修改和改变。