两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

通過虛擬線程執(zhí)行計(jì)算機(jī)多任務(wù)的方法及裝置的制作方法

文檔序號:6476775閱讀:171來源:國知局

專利名稱::通過虛擬線程執(zhí)行計(jì)算機(jī)多任務(wù)的方法及裝置的制作方法
技術(shù)領(lǐng)域
:本發(fā)明涉及一種用于在計(jì)算機(jī)上同時(shí)執(zhí)行多任務(wù)的方法及其相關(guān)的裝置。
背景技術(shù)
:大多數(shù)現(xiàn)代操作系統(tǒng)具有本地多任務(wù)或多線程能力,即,多線程能力內(nèi)置進(jìn)操作系統(tǒng)中,明顯的例外是先于OSX的Macintosh操作系統(tǒng)(MacOS)的版本,該版本沒有多少或沒有多線程能力。不幸的是,所提供的多線程能力,依靠操作系統(tǒng)和硬件平臺而不同。很多平臺對能夠同時(shí)存在的線程的總數(shù)目加以限制,并且一些平臺根本不能有多線程。為了正確地理解由軟件和它們的解決方案中線程引起的問題,需要了解對多線程的通用方法和由大多數(shù)本地平臺線程系統(tǒng)使用的特定方法。同時(shí)執(zhí)行多處理任務(wù),一個(gè)顯而易見的解決方案是在計(jì)算機(jī)系統(tǒng)中提供多套處理電路。但是,典型的臺式計(jì)算機(jī)僅僅有一個(gè)處理器,并且即使高端工作站也僅僅有一到四個(gè)處理。基本解決方案的軟件是時(shí)間片,即,將處理器的時(shí)間劃分成一系列小片,并且依此將每個(gè)小片專用于不同的任務(wù)或線程。典型地,依靠操作系統(tǒng)允許每個(gè)線程運(yùn)行3ms到30ms之間,在該線程被掛起時(shí),而另一個(gè)線程被允許運(yùn)行。操作系統(tǒng)通常使用處理器的定時(shí)器中斷來周期性地中斷當(dāng)前執(zhí)行的線程并且激活操作系統(tǒng)的線程調(diào)度程序,一段存儲當(dāng)前線程狀態(tài)或執(zhí)行上下文的軟件選擇新的線程去運(yùn)行,恢復(fù)新線程的已存儲的執(zhí)行上下文,隨后允許處理器恢復(fù)正常執(zhí)行,這個(gè)處理稱為上下文轉(zhuǎn)換。上下文轉(zhuǎn)換除了在時(shí)間片終止時(shí)發(fā)生之外,也會在線程進(jìn)入等待狀態(tài)時(shí)發(fā)生,線程處于等待狀態(tài)時(shí)不做任何操作,除非有特殊事件發(fā)生,當(dāng)線程進(jìn)入等待狀態(tài)時(shí),線程調(diào)度程序受到請求并發(fā)生上下文轉(zhuǎn)換,以便其它線程可能會使用剩余的時(shí)間片。當(dāng)線程試圖訪問已調(diào)頁(page)到磁盤上的存儲器時(shí),會發(fā)生導(dǎo)致線程進(jìn)入等待狀態(tài)的典型事件。操作系統(tǒng)會將線程懸掛直到存儲系統(tǒng)有機(jī)會在存儲器中調(diào)頁為止。其它導(dǎo)致線程進(jìn)入等待狀態(tài)的事件是線程對用戶輸入的檢查以及試圖對磁盤進(jìn)行讀取,對于后者,操作系統(tǒng)懸空一個(gè)線程直到磁盤讀取完畢,當(dāng)?shù)谝粋€(gè)線程等待從磁盤讀取數(shù)據(jù)時(shí)允許其它線程執(zhí)行處理任務(wù)。然而當(dāng)線程產(chǎn)生剩余時(shí)間片時(shí),另一個(gè)導(dǎo)致線程進(jìn)入等待狀態(tài)的事件會發(fā)生,例如,如果線程暫時(shí)沒有更多事可做時(shí)就可能發(fā)生。因?yàn)樯舷挛霓D(zhuǎn)換會頻繁發(fā)生,快速的上下文轉(zhuǎn)換操作很關(guān)鍵。很多操作系統(tǒng)對系統(tǒng)中存在的線程數(shù)量有限制,Windows95在系統(tǒng)不穩(wěn)定前最多有約150~200個(gè)線程,然而對于BeOS,每個(gè)處理器最多有4096個(gè)線程。對于線程數(shù)的這種限制是操作系統(tǒng)預(yù)分配的結(jié)果,由于性能上的原因,當(dāng)系統(tǒng)啟動時(shí),一個(gè)固定尺寸的存儲器塊用于線程表。標(biāo)準(zhǔn)的非解釋的(non-interpreted)編程語言將人可讀的源代碼編譯成機(jī)讀代碼或可以直接由處理器讀取的機(jī)器語言代碼。另一方面,解釋的語言(interpretedlanguage)將人可讀源代碼編譯成解釋程序可讀代碼(interpreter-readablecode)或字節(jié)碼。一個(gè)被稱為解釋器并使用機(jī)器語言編寫的軟件程序可以讀取字節(jié)碼并指導(dǎo)處理器執(zhí)行適當(dāng)?shù)牟僮?。解釋語言的一個(gè)重要優(yōu)點(diǎn)是能對字節(jié)碼進(jìn)行設(shè)計(jì)以便獨(dú)立于機(jī)器,它允許使用語言編寫程序且編譯成字節(jié)碼在任何操作系統(tǒng)以及寫有解釋程序的硬件平臺上運(yùn)行。當(dāng)開發(fā)一種必須在所有平臺上同等地運(yùn)行的解釋語言時(shí),依賴于平臺的本地多線程能夠是最多存在的問題,交差平臺翻譯程序語言的目標(biāo)是使得有可能在一個(gè)平臺上用語言開發(fā)程序,然后在任何另一個(gè)由這種語言支持的其它平臺上運(yùn)行此程序而不需要作任何變動,Java就是一個(gè)試圖創(chuàng)建這種語言的例子。不幸的是,如果這種應(yīng)用必須多線程,那么本地多線程功能的使用會立即限制應(yīng)用能夠運(yùn)行的平臺,應(yīng)用程序在大多數(shù)MacOP(此操作系統(tǒng)沒有線程能力)版本上運(yùn)行時(shí)會立即受阻,以及這取決于應(yīng)用程序要求同時(shí)有多少個(gè)執(zhí)行線程,應(yīng)用程序也可能會在Windows95(最多約150~200個(gè)線程)上或者在BeOS(每個(gè)處理器最多4096個(gè)線程)上或是在其它平臺上運(yùn)行時(shí)受阻。
發(fā)明內(nèi)容本發(fā)明打算解決以上所說的問題并為具有不同平臺和不同操作系統(tǒng)的計(jì)算機(jī)提供一個(gè)多任務(wù)的能力。根據(jù)本發(fā)明,獨(dú)立平臺意味著多線程是通過解釋器的方法來完成,這個(gè)軟件程序通過解釋指令而形成解釋后的編程語言。依照虛擬線程,解釋器通過創(chuàng)建、維護(hù)和處理來執(zhí)行多任務(wù),這種方法消除了對本地平臺線程能力的依賴,并為使用解釋后的編程語言的多線交差平臺提供了一個(gè)可靠辦法。在典型的解釋的編程語言中,程序中的每一個(gè)指令必須通過解釋器來讀取并傳給處理器,這意味著解釋程序典型地會比機(jī)器語言程序運(yùn)行得慢很多。就象在傳統(tǒng)的多線程或時(shí)間片中那樣,增加代碼到解釋器中來檢查每個(gè)機(jī)器代碼指令的定時(shí)器或計(jì)數(shù)器進(jìn)行,必要時(shí)執(zhí)行一個(gè)上下文轉(zhuǎn)換會對解釋后的程序性能產(chǎn)生很大的影響。因此,本發(fā)明所期望上下文轉(zhuǎn)換執(zhí)行僅在連續(xù)偽代碼之間和在偽代碼不執(zhí)行期間,從而在這里提到的使用多任務(wù)或多線程的計(jì)算機(jī)會反復(fù)執(zhí)行與機(jī)器語言指令等同的指令,而不對定時(shí)器或計(jì)數(shù)器進(jìn)行檢查。根據(jù)本發(fā)明,操作計(jì)算機(jī)的方法包含向計(jì)算機(jī)的存儲器中存儲多個(gè)的偽代碼指令,至少是一些含有多個(gè)機(jī)器碼指令的偽代碼指令,以及由于多個(gè)的任務(wù)或工作中的每一項(xiàng)都是由計(jì)算機(jī)來執(zhí)行,因此自動創(chuàng)建一個(gè)相應(yīng)的執(zhí)行上下文數(shù)據(jù)的虛擬線程,它包括(a)在執(zhí)行相應(yīng)任務(wù)或工作時(shí)所執(zhí)行的下一個(gè)偽代碼指令的存儲位置;(b)在執(zhí)行相應(yīng)任務(wù)或工作時(shí)所要求的任何局部變量的值。多個(gè)任務(wù)或工作中的每一個(gè)都執(zhí)行相應(yīng)的偽代碼指令中的一個(gè),這些偽代碼指令包含多個(gè)的機(jī)器語言指令。該方法還包括在各自虛擬線程的控制之下,對相應(yīng)一系列時(shí)間片或處理時(shí)隙中的每個(gè)任務(wù)或工作用進(jìn)行處理,或者在每一個(gè)不同虛擬線程之間進(jìn)行的上下文轉(zhuǎn)換中,這種上下文轉(zhuǎn)換必須在當(dāng)前執(zhí)行的偽代碼指令執(zhí)行完之后進(jìn)行。而不是采用模仿細(xì)紋(fine-grained)機(jī)器語言指令傳統(tǒng)的“虛機(jī)”方法(Java采用的方法),本發(fā)明的虛擬線程使用了一個(gè)帶有不精練指令的解釋語言,也就是說每個(gè)指令要完成更大的任務(wù)。例如周機(jī)器語言(或模仿機(jī)器語言的解釋語言)畫一個(gè)盒子可能會由幾百或幾千個(gè)指令組成,每個(gè)指令對盒子中一個(gè)像素的顏色進(jìn)行設(shè)定。使用虛擬線程畫一個(gè)盒子時(shí)只需要用一個(gè)指令,解釋器會用機(jī)器語言對余下部分進(jìn)行處理,這意味著對潛在上下文轉(zhuǎn)換進(jìn)行檢查在盒子的整個(gè)繪制過程中僅需執(zhí)行一次,是通過每一個(gè)指令而不是每一個(gè)像素來進(jìn)行。結(jié)果,解釋器能處理多線程而對性能無很大的負(fù)面影響,。依照本發(fā)明的另一特點(diǎn),每個(gè)虛擬線程都是相應(yīng)虛擬線程連接列表的一部分,每個(gè)虛擬線程包括一個(gè)指向相應(yīng)連接列表中下一個(gè)虛擬線程的指針。對于不同虛擬線程之間的每一個(gè)上下文轉(zhuǎn)換,計(jì)算機(jī)方法還包括參照當(dāng)前執(zhí)行的虛擬線程的指針來確定下一個(gè)要執(zhí)行的虛擬線程。執(zhí)行本地平臺線程所遇到的一般問題是同時(shí)存在于系統(tǒng)中的線程總數(shù)(包括活動線程和閑置線程)方面的限制。例如,在Windows95/98中,如果在所有應(yīng)用程序中的線程總數(shù)超過約150-200,則系統(tǒng)會變得很穩(wěn)定。遇到這種情況的測試系統(tǒng)所表現(xiàn)出的行為包括自動重動、隨機(jī)鍵盤輸入、隨機(jī)性的移動鼠標(biāo)、內(nèi)存損壞以及隨機(jī)出現(xiàn)的應(yīng)用程序崩潰。虛擬線程所用的較不精練的指令集的后果之一是上下文轉(zhuǎn)換時(shí)間不緊,這意味著需要花額外的時(shí)間在連接列表上存儲線程,結(jié)果,虛擬線程允許有大量的僅受系統(tǒng)中可用內(nèi)存總數(shù)限制的線程。本發(fā)明期望虛擬線程(此虛擬線程通過計(jì)算機(jī)管理或調(diào)試任務(wù)或工作的執(zhí)行。)被儲存在多個(gè)連接列表中,包括一系列閑置虛擬線程列表、活動虛擬線程列表以及列隊(duì)虛擬線程列表。計(jì)算機(jī)方法還包含周期地從隊(duì)列虛擬線程的列表中移動至少一個(gè)虛擬線程到活動虛擬線程的列表中,從隊(duì)列虛擬線程的列表向活動虛擬線程的列表移動虛擬線程一般包括(a)設(shè)置一個(gè)互斥體對列隊(duì)虛擬線程的列表進(jìn)行鎖定;(b)然后在下列一些情況對指針進(jìn)行修改(i)移動的虛擬線程;(ii)最初至少一個(gè)虛擬線程(在活動虛擬線程列表中);(iii)至少一個(gè)虛擬線程保留在列隊(duì)虛擬線程列表中;(c)然后重新設(shè)定或釋放互斥體,以便能對列隊(duì)虛擬線程的列表進(jìn)行訪問。依照本發(fā)明的另一個(gè)特點(diǎn),每個(gè)虛擬線程包括一個(gè)互斥體,然而計(jì)算機(jī)方法還包含對選定一個(gè)虛擬線程的互斥體進(jìn)行設(shè)定,然后對選定虛擬線程中的數(shù)據(jù)進(jìn)行修改,接著重新設(shè)定或釋放互斥體,以便能對選定虛擬線程進(jìn)行訪問。設(shè)定選定虛擬線程的互斥體、修改數(shù)據(jù)以及重新設(shè)定或釋放互斥體以響應(yīng)虛擬線程中另一個(gè)的信息,對數(shù)據(jù)的修正典型地包括對選定虛擬線程的指針進(jìn)行修正。依照本發(fā)明的另一個(gè)特點(diǎn),每個(gè)虛擬線程都被分配了一個(gè)信息隊(duì)列,計(jì)算機(jī)方法還包括在依照虛擬線程中的另一個(gè)執(zhí)行任務(wù)或工作時(shí),在選定虛擬線程中的一個(gè)的信息隊(duì)列中進(jìn)行信息的輸入。這些線程可能與不同應(yīng)用程序中相應(yīng)的任務(wù)或工作對應(yīng),由此,在選定虛擬線程中的一個(gè)的信息隊(duì)列中進(jìn)行的數(shù)據(jù)信息輸入實(shí)現(xiàn)了不同程序間的進(jìn)行數(shù)據(jù)傳遞。在線程間信息傳遞的另一個(gè)應(yīng)用中,選定線程與其它線程都是不同計(jì)算機(jī)上的代理線程或界面線程,那樣,在信息隊(duì)列中進(jìn)行的信息輸入就包括傳送信息在計(jì)算機(jī)之間的信息鏈路上,此信息鏈路可能是個(gè)人計(jì)算機(jī)網(wǎng)絡(luò),例如被稱為“因特網(wǎng)”的全球計(jì)算機(jī)網(wǎng)絡(luò)。正如上所指,創(chuàng)建虛擬線程,處理相應(yīng)一系列時(shí)間片或處理時(shí)隙中的任務(wù)或工作,以及進(jìn)行都包括在譯碼程序下進(jìn)行的計(jì)算機(jī)操作的上下文轉(zhuǎn)換。本發(fā)明還期望在計(jì)算機(jī)上運(yùn)行多個(gè)解釋程序?qū)嵗總€(gè)實(shí)例對應(yīng)一個(gè)本地線程,每個(gè)本地線程創(chuàng)造相應(yīng)的執(zhí)行上下文數(shù)據(jù)的虛擬線程集,并在相應(yīng)虛擬線程的控制下對相應(yīng)一系列時(shí)間片或處理時(shí)隙中多個(gè)任務(wù)或工作進(jìn)行處理。每一個(gè)不同虛擬線程之間的上下文轉(zhuǎn)換僅在當(dāng)前執(zhí)行的偽代碼指令中的一個(gè)執(zhí)行完畢之后才進(jìn)行。多個(gè)本地線程的運(yùn)行更適宜將單個(gè)處理器上的線程限制在小的數(shù)量,例如一個(gè)或兩個(gè)線程。在處理器有內(nèi)在的多線程能力的地方,這種限制就釋放其它基于平臺的本地線程用來執(zhí)行其它的應(yīng)用程序。因?yàn)樘摂M線程允許創(chuàng)建無數(shù)的線程并且這些線程具有很低的開銷,一個(gè)使用虛擬線程的語言編寫的程序可以使用一種獨(dú)特的編程方法的優(yōu)勢。這種編程方法包括使用大量的線程,顯示屏上的每一個(gè)用戶界面設(shè)備使用一個(gè)線程,例如一個(gè)按鈕就有一個(gè)它自己的線程。一個(gè)滾動條有4個(gè)線程,其中每個(gè)按鈕各一個(gè),中央條一個(gè),還有一個(gè)主線程。線程不被限制在用戶界面設(shè)備上,例如一個(gè)服務(wù)程序能創(chuàng)建一個(gè)線程以便對每個(gè)客戶的要求進(jìn)行服務(wù)。典型的應(yīng)用程序可以有成百到幾千個(gè)的線程,這取決于應(yīng)用程序的特點(diǎn),對于在一個(gè)系統(tǒng)上運(yùn)行的多個(gè)應(yīng)用程序,會很快超過Windows95(150-200個(gè)線程)的本地線程能力,并且甚至是在擁有更大或無限線程能力的平臺上運(yùn)行,也會對性能產(chǎn)生負(fù)面的影響,另一方面,對虛擬線程進(jìn)行特別的設(shè)計(jì),以便對這些問題進(jìn)行處理,使得有可能用上萬個(gè)線程來運(yùn)行多重應(yīng)用程序而又不會有任何性能上的問題。因?yàn)橛脩艚缑娲a不需要跟蹤成百的用戶界面裝置,所以線程的廣泛應(yīng)用較大地簡化了復(fù)雜應(yīng)用程序的創(chuàng)建,即每個(gè)線程運(yùn)行一個(gè)簡單的程序,此程序保持由此線程負(fù)責(zé)的單個(gè)用戶界面裝置的蹤跡。這個(gè)導(dǎo)致較簡單的創(chuàng)建且較容易的調(diào)試和維護(hù)的小程序。根據(jù)本發(fā)明的另一個(gè)特點(diǎn),選定的一個(gè)虛擬線程處于閑置狀態(tài)的地方(例如在閑置線程的列表中)計(jì)算機(jī)方法還包括產(chǎn)生消息以響應(yīng)從計(jì)算機(jī)外部源的輸入,在選定虛擬線程的消息隊(duì)列中插入消息,以及將選定線程從閑置狀態(tài)變到活動狀態(tài),然后,時(shí)間片或處理時(shí)隙被分配給選定線程時(shí)訪問信息隊(duì)列以獲得信息。這個(gè)過程依照與相應(yīng)線程相關(guān)事件的發(fā)生將虛擬線程從非活動狀態(tài)或閑置狀態(tài)轉(zhuǎn)化為活動狀態(tài),例如此事件可以是由計(jì)算機(jī)外部源所產(chǎn)生的,或通過操作者啟動鍵盤按鍵,或通過一個(gè)來自遠(yuǎn)程計(jì)算機(jī)的信息。根據(jù)本發(fā)明,以解釋器為媒介的虛擬線程可以通過一個(gè)適當(dāng)?shù)募夹g(shù)對不同任務(wù)或工作區(qū)分優(yōu)先次序,在每個(gè)虛擬線程都包括一個(gè)線程優(yōu)先級別的地方,計(jì)算機(jī)方法還包括在多個(gè)虛擬線程中自動參照線程的優(yōu)先級來確定相對優(yōu)先級,并根據(jù)所確定的相對優(yōu)先級改變線程的次序。在一個(gè)區(qū)分優(yōu)先次序的技術(shù)中,將多個(gè)時(shí)間片或處理時(shí)隙給予一個(gè)優(yōu)先級比第二個(gè)線程的優(yōu)先級高整數(shù)倍的給定線程,此時(shí)間片或處理時(shí)隙的數(shù)量是給予第二個(gè)線程的時(shí)間片或處理時(shí)隙數(shù)量的整數(shù)倍。虛擬線程(伴隨其相應(yīng)的任務(wù))優(yōu)先次序的區(qū)分也為不同本地線程中的分配處理負(fù)載提供了一個(gè)機(jī)會,在那里會使用一個(gè)以上本地線程。一個(gè)線程可能被分配一個(gè)重新分配虛擬線程的任務(wù),從擁有平均優(yōu)先級以上任務(wù)的本地線程到擁有平均優(yōu)先級以下任務(wù)的本地線程。通常,線程的轉(zhuǎn)換限制到活動線程。正如在其它地方討論過的一樣,在相應(yīng)虛擬線程的控制之下,在相應(yīng)一系列時(shí)間片或處理時(shí)隙中所處理的任務(wù)包括成像于計(jì)算機(jī)顯示器上的控制對象,每個(gè)對象構(gòu)成分配了一個(gè)相應(yīng)虛擬線程的獨(dú)立任務(wù)或工作,根據(jù)本發(fā)明,通過一個(gè)解釋器分配給相應(yīng)的虛擬線程的處理的任務(wù)或工作還包括監(jiān)視計(jì)算機(jī)鍵盤按鍵的活動,每個(gè)按鍵構(gòu)成一個(gè)由相應(yīng)虛擬線程分配的獨(dú)立的任務(wù)或工作。最好,通過計(jì)算機(jī)連續(xù)執(zhí)行偽代碼指令來測量時(shí)間片或處理時(shí)隙,對于多個(gè)時(shí)間片或處理時(shí)隙中的每一個(gè)來說,計(jì)算機(jī)方法還包括在計(jì)算預(yù)定的連續(xù)執(zhí)行偽代碼指令數(shù)時(shí),終止相應(yīng)的時(shí)間片或處理時(shí)隙。根據(jù)本發(fā)明的一個(gè)特別的實(shí)施例,多任務(wù)計(jì)算機(jī)包含一個(gè)存儲器、一個(gè)顯示器、一個(gè)輸入外圍設(shè)備以及至少一個(gè)與存儲器、顯示器以及輸入外圍設(shè)備動態(tài)相連的處理器,該處理器有一個(gè)將人工輸入源碼轉(zhuǎn)換為字節(jié)碼或偽代碼指令的編譯器,而該編譯器與存儲器動態(tài)相連以便能將節(jié)碼或偽代碼指令儲存在那里,該處理器還有一個(gè)用來執(zhí)行節(jié)碼或偽代碼指令的解釋器。所述存儲器儲存第一閑置虛擬線程的連接列表,第二個(gè)活動虛擬線程的連接列表,以及第三個(gè)列隊(duì)或等待虛擬線程的連接列表。每個(gè)線程包括上下文或狀態(tài)數(shù)據(jù),一個(gè)互斥體以及指向相應(yīng)列表中下一個(gè)線程的指針。解釋器與輸入外圍設(shè)備動態(tài)相連以便識別由輸入外圍設(shè)備所產(chǎn)生的事件,也與存儲器動態(tài)相連(a)用于將至少一個(gè)閑置虛擬線程從第一個(gè)連接列表移到第三個(gè)連接列表;(b)用于將列隊(duì)或等待虛擬線程從第三個(gè)連接列表移到第二個(gè)連接列表;(c)用于依照預(yù)定的優(yōu)先級安排,在連續(xù)的時(shí)間片或處理時(shí)隙中,根據(jù)第二個(gè)連接列表中不同虛擬線程的上下文或狀態(tài)數(shù)據(jù)來執(zhí)行指令。解釋器動態(tài)地與顯示器部分連接是為了修正顯示器上的對象以響應(yīng)第二個(gè)連接列表中相應(yīng)活動虛擬線程所指定的指令。此外,存儲器還儲存本地線程的第四個(gè)連接列表,那樣的話,解釋器就是多個(gè)普通解釋器的實(shí)例的一個(gè),每個(gè)普通解釋器的實(shí)例對應(yīng)于一個(gè)本地線程。第二個(gè)連接列表也是多個(gè)連接的活動線程列表之一,每個(gè)本地線程通過指向相應(yīng)的一個(gè)活動線程連接列表的相應(yīng)的指針來連接,當(dāng)?shù)谌齻€(gè)連接列表是多個(gè)連接的列隊(duì)線程列表之一時(shí),每個(gè)本地線程通過指向相應(yīng)的列隊(duì)線程連接列表相應(yīng)的指針來連接。根據(jù)本發(fā)明的又一特點(diǎn),解釋器包括用來將虛擬線程從第一個(gè)本地線程(其負(fù)荷比平均負(fù)荷重)移到第二個(gè)本地線程(其負(fù)荷比平均負(fù)荷輕)的可編程的電路。閑置虛擬線程的列表或表格(table)最好包括多個(gè)分配給鍵盤各按鍵的線程,用來處理各按鍵的活動,此外,還包括多個(gè)分配給顯示圖象中各對象的線程,用來處理對各對象外觀的修改。在解釋器包括一個(gè)上下文轉(zhuǎn)換模塊以及一個(gè)指令計(jì)數(shù)器的地方,上下文轉(zhuǎn)換模塊與存儲器以及指令計(jì)數(shù)器動態(tài)相連,用來在根據(jù)當(dāng)前執(zhí)行活動線程執(zhí)行預(yù)定數(shù)量的字節(jié)碼或偽代碼指令時(shí),在第二個(gè)連接列表中執(zhí)行一個(gè)從當(dāng)前執(zhí)行活動線程到下一個(gè)活動線程的上下文轉(zhuǎn)換。每個(gè)虛擬線程包括各線程中要執(zhí)行的下一個(gè)指令的存儲位置,各線程的任何一個(gè)局部變量以及各線程執(zhí)行的優(yōu)先級。根據(jù)本發(fā)明的又一特點(diǎn),存儲器儲存多個(gè)分配給各線程的消息隊(duì)列以及至少一個(gè)具有執(zhí)行上下文的代理線程或界面線程,用來通過通信鏈路實(shí)現(xiàn)與遠(yuǎn)程計(jì)算機(jī)之間的通信,此通信鏈路就是諸如因特網(wǎng)的計(jì)算機(jī)網(wǎng)絡(luò),代理線程或界面線程包括一個(gè)通向網(wǎng)絡(luò)協(xié)議例行程序的存儲地址。根據(jù)本發(fā)明的又一實(shí)施例,多任務(wù)計(jì)算機(jī)包括儲存多線程或多任務(wù)的狀態(tài)數(shù)據(jù)或上下文數(shù)據(jù)的存儲器以及執(zhí)行一系列字節(jié)碼指令的解釋器,每一個(gè)字節(jié)碼指令由多種機(jī)器碼步驟組成,程序化的解釋器是為了定義通過計(jì)算機(jī)執(zhí)行每一個(gè)任務(wù)的相應(yīng)的虛擬線程;為了執(zhí)行相應(yīng)的當(dāng)前線程的字節(jié)碼指令,此當(dāng)前線程是從一系列連續(xù)的時(shí)間片中每一個(gè)時(shí)間片的虛擬線程中選定;還為了執(zhí)行從所述的一個(gè)虛擬線程到另一個(gè)虛擬線程的上下文轉(zhuǎn)換,此上下文轉(zhuǎn)換僅在執(zhí)行完字節(jié)碼指令中的一個(gè)之后才進(jìn)行。本發(fā)明所提供的各個(gè)優(yōu)點(diǎn)通過在這里的描述會變得很明了。圖1是一個(gè)根據(jù)本發(fā)明的并入虛擬線程能力的計(jì)算機(jī)系統(tǒng)的方框圖;圖2是圖1中所示處理器的選定元件方框圖;圖3是圖2中所示解釋器的選定元件方框圖;圖4是在存儲器中儲存的線程狀態(tài)數(shù)據(jù)的圖表,示出了數(shù)據(jù)的連接列表結(jié)構(gòu);圖5A和5B示出了選定操作的流程圖,這些操作由2中的解釋器來執(zhí)行;圖6示出了使用本發(fā)明虛擬線程的兩個(gè)計(jì)算機(jī)之間交流的方框圖;定義術(shù)語“多任務(wù)”用在這里是指在一臺計(jì)算機(jī)上同時(shí)執(zhí)行多重任務(wù)。術(shù)語“偽代碼”用在這里是指通過解釋器編譯后執(zhí)行的計(jì)算機(jī)指令,解釋器是一個(gè)用來將機(jī)器語言翻譯成偽代碼程序的程序,并在被翻譯時(shí)執(zhí)行指定的操作。“偽代碼”與特殊計(jì)算機(jī)的硬件無關(guān),它要求在程序使用之前被轉(zhuǎn)化為計(jì)算機(jī)能使用的代碼。許多偽代碼指令必須執(zhí)行多個(gè)機(jī)器語言指令,有時(shí)候偽代碼就是指“字節(jié)碼”。術(shù)語“任務(wù)”或“工作”用在這里是表示由計(jì)算機(jī)執(zhí)行的任何功能。任務(wù)或工作可能按規(guī)模從諸如改變處理器注冊器的內(nèi)容的簡單操作到要求執(zhí)行許多偽代碼指令的大的復(fù)雜操的變化。任務(wù)或工作的例子包括(a)監(jiān)視用戶輸入外圍設(shè)備,如鍵盤及其每一個(gè)按鍵;(b)在監(jiān)視器或顯示器上產(chǎn)生對象并對其進(jìn)行修改,如菜單、按鈕、窗口、滾動條、圖標(biāo)以及背景樣式;(c)在網(wǎng)絡(luò)上或其它通信鏈路上與遠(yuǎn)程計(jì)算機(jī)通信;(d)應(yīng)用程序,如文字處理器、電子表格、多媒體播放機(jī)以及計(jì)算器等等;(e)應(yīng)用程序的各種組件或功能,如編輯、打印、拼寫檢查以及其它文字處理器的功能。術(shù)語“時(shí)間片”或“處理時(shí)隙”用在這里表示處理器時(shí)間段。在傳統(tǒng)的多任務(wù)計(jì)算機(jī)中,所有的時(shí)間片在持續(xù)時(shí)間上是相同的,這可以通過一個(gè)時(shí)間基數(shù)(timebase)或定時(shí)器中斷信號來測量。根據(jù)即將公開的本發(fā)明,時(shí)間片或處理時(shí)隙既可以通過傳統(tǒng)的多任務(wù)計(jì)算機(jī)的計(jì)時(shí)器也可以用指令計(jì)數(shù)來測量,在后者中時(shí)間片或處理時(shí)隙的持續(xù)時(shí)間不必是相等的。單詞“線程”用在這里是指通過計(jì)算機(jī)完成或?qū)崿F(xiàn)一個(gè)任務(wù)或工作的執(zhí)行上下文,此執(zhí)行上下文在一系列時(shí)間片或處理時(shí)隙中被使用或跟蹤。術(shù)語“虛擬線程”在這里是指一個(gè)由解釋器創(chuàng)建、儲存、修改、處理并跟蹤的線程。術(shù)語“本地線程”在這里是用來指定線程內(nèi)置于特殊計(jì)算機(jī)的操作系統(tǒng)中,在計(jì)算機(jī)操作系統(tǒng)有多重本地線程能力的地方,可以使用多個(gè)的本地線程,每一個(gè)這樣的本地線程運(yùn)行相應(yīng)的解釋器實(shí)例。術(shù)語“互斥體”在這里是指可以鎖定的對象,它可以在某個(gè)時(shí)候被一個(gè)線程設(shè)置或鎖定,以免其它線程對程序、虛擬線程、存儲區(qū)或其它計(jì)算機(jī)系統(tǒng)中的其它元件進(jìn)行訪問。本地線程實(shí)現(xiàn)使用互斥體以同步方式對數(shù)據(jù)訪問,該數(shù)據(jù)在兩個(gè)線程間共享。使用互斥體很重要,因?yàn)榛コ怏w的使用可以避免在多線程間同時(shí)企圖修改同樣數(shù)據(jù)的多線程之間的沖突?;コ怏w用來描述共享數(shù)據(jù),線程必須在試圖訪問數(shù)據(jù)之前鎖定互斥體?!斑B接列表”是一個(gè)在軟件工業(yè)中常用的結(jié)構(gòu),其列表中的每個(gè)入口都包含列表中下一個(gè)入口的存儲位置。這個(gè)連接允許向列表中插入或從列表中刪除入口,而列表中其它入口不動。一個(gè)項(xiàng)目的刪除只是項(xiàng)目前驅(qū)站(predecessor)發(fā)生了改變,以便前驅(qū)站指向下一個(gè)項(xiàng)目后繼站(successor)的地址,從而釋放了由項(xiàng)目所占用的內(nèi)存。術(shù)語“上下文轉(zhuǎn)換”在這里是用來指定一個(gè)過程,其中當(dāng)前執(zhí)行線程被中斷,線程的狀態(tài)或執(zhí)行上下文被存儲,然后選定一個(gè)新的線程來運(yùn)行,已存儲的新線程的執(zhí)行上下文很快在接下來的計(jì)算機(jī)操作中得到修復(fù)和跟蹤。具體實(shí)施例方式如圖1中的圖解,計(jì)算機(jī)系統(tǒng)包括一個(gè)處理器12、一個(gè)鍵盤14、顯示器16以及一個(gè)存儲器18,處理器12通過一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)(如因特網(wǎng)22)與遠(yuǎn)程計(jì)算機(jī)20相連。如圖2中所示,處理器12包括一個(gè)解釋器24,解釋器24用普通數(shù)字計(jì)算機(jī)電路的典型功能,該普通數(shù)字計(jì)算機(jī)電路通過編程來修正,以便執(zhí)行多重計(jì)算機(jī)功能,包括解釋鍵盤的活動和控制顯示器16,以及特別是控制顯示器上對象的外觀以響應(yīng)用戶通過鍵盤14輸入命令,或者響應(yīng)所接收到的來自因特網(wǎng)22上的計(jì)算機(jī)20的信息。處理器12還包括一個(gè)編譯器26(它可以是解釋器24的一部分),該編譯器26用來將人工源代碼轉(zhuǎn)換成存儲在存儲器18里面的字節(jié)碼或偽代碼。如圖3中所示,解釋器24包括一個(gè)代碼執(zhí)行單元28,該代碼執(zhí)行單元28與存儲器18動態(tài)連接在一起以便讀取字節(jié)碼,并且根據(jù)字節(jié)碼執(zhí)行一些操作,解釋器24還包括一個(gè)指令計(jì)數(shù)器30,指令計(jì)數(shù)器30與代碼執(zhí)行單元28相連以便跟蹤在當(dāng)前時(shí)間片或處理時(shí)隙中處理的字節(jié)碼指令數(shù)。計(jì)數(shù)器30與上下文轉(zhuǎn)換模塊32動態(tài)相連,依次模塊32與代碼執(zhí)行單元28相連,用于根據(jù)由代碼執(zhí)行單元28所預(yù)定的字節(jié)碼指令數(shù)量的計(jì)數(shù),在解釋器24的執(zhí)行上下文中引起變化。,執(zhí)行轉(zhuǎn)換(executionswitch)會更早出現(xiàn),即,在特定環(huán)境下(例如進(jìn)入等待狀態(tài)),也就是在計(jì)數(shù)完成之前出現(xiàn)。在以下一些討論中,假設(shè)解釋器24只是在處理編譯過的字節(jié)碼,事實(shí)上,編譯器26(可能是解釋器的組件或者是獨(dú)立的程序)必須將人可讀源代碼譯成字節(jié)碼,編譯器是軟件工業(yè)中的標(biāo)準(zhǔn)(C+、C++、Basic、Pascal、Java以及許多其它語言都必須在它們能夠運(yùn)行前對它們進(jìn)行編譯)。編寫編譯程序的技巧是許多編程者要掌握的常識,因此,即將公開的發(fā)明沒有對編譯器26做進(jìn)一步的討論。解釋器24通過虛擬線程的創(chuàng)建和連接以及根據(jù)相應(yīng)的虛擬線程或在相應(yīng)虛擬線程的控制之下實(shí)現(xiàn)相應(yīng)時(shí)間片或處理時(shí)隙中的多任務(wù)。在下文中假設(shè)解釋器24是一個(gè)棧式解釋器(stack-basedinterpreter),實(shí)際上,虛擬線程會與任何一種類型的解釋器一起工作,無論它是棧式解釋器還是其它類型的解釋器??紤]下面的字節(jié)碼,它在計(jì)算機(jī)顯示屏16上坐標(biāo)為x=10,y=10的點(diǎn)和坐標(biāo)為x=20,y=20的點(diǎn)之間畫一個(gè)盒子。指令參數(shù)PUSHINTEGER10PUSHINTEGER10PUSHINTEGER20PUSHINTEGER20DRAWBOX在棧式語言中,頭4個(gè)指令向堆棧壓入10、10、20、20這四個(gè)值,盒子繪制指令從堆棧中移動上面的四個(gè)值,并用這四個(gè)值作為坐標(biāo)來繪制盒子。這個(gè)字節(jié)碼指令在下面要進(jìn)行的有關(guān)解釋器24和虛擬線程的討論中將當(dāng)成編程的示例。虛擬線程虛擬線程基本上是一個(gè)執(zhí)行上下文。執(zhí)行上下文包括(a)在線程中要執(zhí)行的下一個(gè)指令的存儲位置;(b)線程的任何局部變量值;(c)線程的調(diào)用堆棧;(d)線程的優(yōu)先級別以及其它特征;(e)編程語言必須以每個(gè)線程為基礎(chǔ)進(jìn)行存儲的任何其它數(shù)據(jù),例如錯誤狀態(tài)數(shù)據(jù)。字節(jié)碼不是線程的一部分,幾個(gè)線程能同時(shí)運(yùn)行相同的字節(jié)碼。線程只是維護(hù)一個(gè)指向存儲器中即將執(zhí)行的下一個(gè)字節(jié)碼指令的指針。線程可以處于四種狀態(tài)中的一種(1)閑置狀態(tài)閑置虛擬線程是紙暫時(shí)無事可做的線程,例如一個(gè)正在等待用戶輸入的線程(如一個(gè)按鍵)就是一個(gè)閑置的,就象一個(gè)等待定時(shí)器終止的線程。閑置線程被存儲在一個(gè)獨(dú)立于活動線程的列表中而不占據(jù)任何處理器時(shí)間。(2)列隊(duì)狀態(tài)虛擬線程準(zhǔn)備激活,并且已經(jīng)被分配了一個(gè)正在運(yùn)行解釋程序的本地線程,但此本地線程正忙于執(zhí)行一個(gè)指令而不能將虛擬線程移到它的活動列表中,直到執(zhí)行完這個(gè)指令。(3)活動狀態(tài)虛擬線程在本地線程的活動列表中,并且是一個(gè)從本地線程接收時(shí)間片的虛擬線程。(4)當(dāng)前狀態(tài)當(dāng)前虛擬線程常常也是一個(gè)活動虛擬線程,當(dāng)前虛擬線程是一個(gè)當(dāng)前執(zhí)行的虛擬線程,即,本地線程給了它一個(gè)時(shí)間片,它就在這個(gè)時(shí)間片中。連接線程列表如圖4所示,解釋器24將線程狀態(tài)以及上下文數(shù)據(jù)作為一套連接列表存儲在存儲器18中,其中有兩個(gè)主要的連接列表一個(gè)閑置線程表格34和一個(gè)本地線程表格36。指向這些列表34和列表36中每個(gè)列表的第一個(gè)入口的指針38和40被存儲在解釋器24中的全局變量里。閑置線程表格34存儲系統(tǒng)中所有閑置虛擬線程42的列表,這些閑置虛擬線程42保留在閑置線程表格34中直到引起線程重新激活的相應(yīng)事件發(fā)生。在閑置線程表格34中的每個(gè)入口或閑置虛擬線程42都包含有線程狀態(tài)和上下文數(shù)據(jù)44,互斥體46用來控制對線程狀態(tài)以及上下文數(shù)據(jù)的訪問,指針48包含列表中下一個(gè)入口的存儲位置。本地線程表格36包含每個(gè)本地線程50的入口,本地線程50正在運(yùn)行解釋器24的實(shí)例,并能接受執(zhí)行的虛擬線程。在一些平臺上,例如,無本地線程能力的MacOS的一些版本,本地線程表格36中僅有一個(gè)入口。在本地線程表格36的每個(gè)入口50中都包含一個(gè)互斥體52、指向活動虛擬線程58的連接列表56的指針54、還有指向列隊(duì)或等待虛擬線程64的連接列表62的指針60,以及另一個(gè)指向本地線程列表36中下一個(gè)入口的指針66。虛擬線程58和64的連接列表56和62使用的格式與閑置虛擬線程42的連接列表34相同,單獨(dú)的活動線程58以及單獨(dú)的列隊(duì)線程64具有與閑置線程42相同的結(jié)構(gòu)。每個(gè)本地線程50周期將線程從列隊(duì)虛擬線程64的連接列表62中移到相應(yīng)活動虛擬線程58的連接列表56中。當(dāng)本地線程通過執(zhí)行單元28執(zhí)行指令時(shí),本地線程50不使用其列隊(duì)線程64,所以相應(yīng)的連接列表62可以被鎖定,并且線程可以放到隊(duì)列中而不必鎖定本地線程的活動列表56,從而改善了多處理器系統(tǒng)的性能?;コ怏w52用來對列隊(duì)虛擬線程64的相應(yīng)連接列表62進(jìn)行同步訪問,本地線程50(或是自己的或是另一個(gè)本地線程)必須在能夠獲得相應(yīng)隊(duì)列62之前鎖定相應(yīng)的互斥體52。圖4中其余的線程結(jié)構(gòu)不要求有互斥體,因?yàn)槲ㄒ痪哂性L問功能的線程就是各自的本地線程。解釋器24將大部分時(shí)間花在一個(gè)循環(huán)上(就象任何解釋器一樣),例如圖5A和圖5B所示,在這個(gè)循環(huán)內(nèi),解釋器24執(zhí)行多個(gè)的操作來支持虛擬線程。OS維護(hù)任務(wù)解釋器24必須定期執(zhí)行的任務(wù)之一是操作系統(tǒng)維護(hù)70,關(guān)于此任務(wù)的細(xì)節(jié)根據(jù)平臺而變化。典型地,只有一個(gè)本地線程50需要執(zhí)行維護(hù)任務(wù)70,而其它本地線程只執(zhí)行字節(jié)碼指令。在有些平臺上,一個(gè)完全獨(dú)立的本地線程被用來進(jìn)行維護(hù)任務(wù),本地線程表格36中的所有本地線程都用來執(zhí)行字節(jié)碼,另一方面無本地線程能力的平臺(也就是說,輔助的多任務(wù)系統(tǒng),如OSX之前的MacOS各版本)必須周期執(zhí)行維護(hù)任務(wù),以便讓系統(tǒng)時(shí)間上的其它任務(wù)運(yùn)行。作為操作系統(tǒng)維護(hù)70的一部分,典型的任務(wù)執(zhí)行包括操作系統(tǒng)事件循環(huán)的反復(fù)(如Macos平臺上的callingGetNextEvent(),或Windows平臺PeekMessage()/GetMessage()/TranslateMessage()/DispatchMessage())。事件處理執(zhí)行維護(hù)任務(wù)70之后,解釋器24特別是其中的指令執(zhí)行單元28會進(jìn)行一個(gè)查詢72弄清在本地線程50的活動線程列表56中是否有虛擬線程,在活動線程列表56中至少有一個(gè)活動線程58處,解釋器24對事件進(jìn)行活動檢查74(activecheck),在列表56中沒有活動線程58處,解釋器24在76等待事件,從而將處理器時(shí)間釋放給系統(tǒng)上的其它應(yīng)用程序。當(dāng)一個(gè)事件出現(xiàn)時(shí),事件被編碼成消息放到適當(dāng)虛擬線程的消息隊(duì)列中,每個(gè)虛擬線程都可能有自己的消息隊(duì)列,如果相應(yīng)的虛擬線程是一個(gè)閑置線程42,它一定會被重新激活,這還包括找到一個(gè)本地線程50,而閑置線程則作為一個(gè)列隊(duì)或等待線程64被分配給此本地線程50。如圖5A所示,如果事件檢查步驟74導(dǎo)致一個(gè)偵察事件發(fā)生,就象由解釋器24在決斷連結(jié)78所確定的那樣,解釋器24在步驟80識別接收線程,然后在步驟82鎖定接收線程的信息隊(duì)列,這個(gè)鎖定也是由解釋器24在步驟76接收到一個(gè)事件通知后進(jìn)行的,隨后,解釋器24在步驟84調(diào)查是否接收線程為閑置線程,如果接收線程是閑置線程42(正如在調(diào)查步驟84中由解釋器24所確定的),則全局閑置線程列表34在步驟86被鎖定(互斥體未顯示出來)。然后接收線程在步驟88從閑置線程42的連接列表中被移走,這種移動一般會改變閑置線程列表34中緊挨接收線程之前的虛擬線程的指針48,以至于指針識別閑置線程列表34中緊挨接收線程之后的虛擬線程。在步驟88中將接收線程從閑置線程連接列表34中被移走之后,解釋器在步驟90鎖定列表34,在接下來的步驟92中,解釋器24掃瞄或穿過本地線程50的連接列表36以便找到具有最輕負(fù)載的本地線程。本地線程負(fù)載可以被計(jì)算出來當(dāng)作分配給本地線程的虛擬線程的數(shù)量,盡管一般來說最好是通過計(jì)算分配給物理線程的所有本地線程(即,在物理線程的活動列表和隊(duì)列中的所有本地線程)的優(yōu)先級之和來精確計(jì)算本地線程負(fù)載。選定的具有最輕負(fù)載的本地線程50的列隊(duì)互斥體52在步驟94被解釋器24鎖定。剛剛從閑置線程列表34中被移走的接收虛擬線程接著又在步驟96被加到選定的本地線程50的列隊(duì)線程列表62中,然后相應(yīng)的互斥體52在步驟98被解鎖。在接收線程以及列隊(duì)線程列表56中緊挨接收線程之前的線程中插入接收線程時(shí),增加接收虛擬線程到列隊(duì)線程列表56會對兩個(gè)指針進(jìn)行修正。如果接收線程不是非活動的或閑置的線程42(正如在調(diào)查步驟84中由解釋器24所確定的),則啟動一個(gè)例行程序100用來將列隊(duì)線程64從連接列表62轉(zhuǎn)移到相關(guān)的活動線程列表56中去。在將一個(gè)接收線程從閑置線程列表34轉(zhuǎn)移到最閑的本地線程50的列隊(duì)線程列表56中之后,例行程序100也由解釋器24來執(zhí)行。在例行程序100的第一步驟102中,解釋器24鎖定本地線程的列隊(duì)互斥體52,然后,解釋器24在檢查步驟104檢查是否列隊(duì)線程列表62至少包含一個(gè)虛擬線程64,如果是,則隊(duì)列中的第一個(gè)線程將在步驟106從此隊(duì)列中被移走并在步驟108被增加到相應(yīng)的活動線程列表56中。此外,虛擬線程從一個(gè)列表向另一個(gè)列表的這種轉(zhuǎn)移僅僅只是三個(gè)指針的改變(即被移動的線程的指針以及兩列表中緊挨此之前的的線程)。當(dāng)完成線程的轉(zhuǎn)移之后,解釋器24在結(jié)110判斷是否新被轉(zhuǎn)移的虛擬線程處在比當(dāng)前執(zhí)行線程更高級別的優(yōu)先組中,如果是,則在步驟112中解釋器24和特定的模塊32(如圖3所示)會執(zhí)行一個(gè)上下文轉(zhuǎn)換,以至于新被轉(zhuǎn)移的線程變?yōu)楫?dāng)前執(zhí)行線程,然后列隊(duì)互斥體52在步驟114被解鎖。定時(shí)器處理在流程5A和圖5B中不包括定時(shí)器處理,因?yàn)槎〞r(shí)器處理不是虛擬線程的關(guān)鍵部分。然而編譯語言通常會需要給編程者提供一種設(shè)定定時(shí)器的方法。用虛擬線程執(zhí)行定時(shí)器的最有效辦法是保存所有定時(shí)器的全局列表在存儲器18中,該列表將被排序以至于將終止的定時(shí)器最早排在列表的起始處。每次主解釋程序循環(huán)反復(fù)進(jìn)行(如圖5A和圖5B所示),通常在事件處理期間,解釋器24會檢查定時(shí)器定時(shí)器列表中的第一個(gè)入口以確認(rèn)是否此入口已經(jīng)終止,如果沒有終止,由于列表中后面的定時(shí)器在列表中第一個(gè)定時(shí)器之后終止,因此沒有其它已經(jīng)終止的定時(shí)器,如果定時(shí)器已經(jīng)終止,它將會從列表中被移走,并會產(chǎn)生一個(gè)事件,此事件會使合適的的虛擬線程被激活(如果它還不是活動狀態(tài)的話),并且此線程會在檢查其隊(duì)列時(shí)找到定時(shí)器終止事件。如果沒有虛擬線程被分配給本地線程并且本地線程因此等待事件(步驟76)而不是檢查事件(步驟74),則解釋器24必須在等待事件之前檢查定時(shí)器。如果在列表中有定時(shí)器,則解釋器必須設(shè)定操作系統(tǒng)定時(shí)器以至于當(dāng)定時(shí)器終止時(shí)操作系統(tǒng)產(chǎn)生一個(gè)事件釋放此等待。注意到對不同的操作系統(tǒng)其定時(shí)器具有不同的精度是很重要,如果在列表中第一個(gè)定時(shí)器上的保持時(shí)間少于操作系統(tǒng)定時(shí)器的精度,則解釋器24可能不會等待消息但必須檢查消息,以至于產(chǎn)生必要精度的時(shí)間終止事件。線程間消息通常,虛擬線程需要一些交流的方法以使他們互相之間能進(jìn)行數(shù)據(jù)交換。在傳統(tǒng)多任務(wù)計(jì)算機(jī)系統(tǒng)中,本地線程一般是通過將數(shù)據(jù)放在存儲器中(以便數(shù)據(jù)能被所有線程訪問)然后鎖定對存儲器的訪問(以避免多線程同時(shí)訪問數(shù)據(jù))的方式來進(jìn)行數(shù)據(jù)共享。這里所說的虛擬線程使用不同的線程之間信息交換的方法。一個(gè)消息包含一個(gè)能唯一識別消息類型的標(biāo)識符(如字符串“mouse-move”就可以是一個(gè)消息的標(biāo)識符)以及一批數(shù)據(jù)。該批數(shù)據(jù)可以是任意格式和任意大小。(盡管由于性能原因大批幾兆字節(jié)大小的數(shù)據(jù)不可取,因此一系列較小的信息在這種情況下就成了首選。)以響應(yīng)從操作系統(tǒng)接收到的外部事件能夠產(chǎn)生消息(包括用戶輸入事件,如鼠標(biāo)移動、按下鍵盤按鈕等等)或響應(yīng)一個(gè)虛擬線程的字節(jié)碼中的指令。在流程5A的事件處理部分示出了一個(gè)信息是怎樣以響應(yīng)一個(gè)事件被加入到一個(gè)線程的消息隊(duì)列中,相同的技術(shù)用在增加一個(gè)信息到線程的信息隊(duì)列中以響應(yīng)一個(gè)字節(jié)碼指令。有一個(gè)例外,在線程將一個(gè)信息放到它自己的信息隊(duì)列中的情況下必須注意避免鎖定部分線程的上下文,該線程的上下文已經(jīng)被當(dāng)作部分執(zhí)行字節(jié)碼指令鎖定,避免試圖在兩個(gè)可能引起死鎖的地方進(jìn)行鎖定,該死鎖依賴于平臺的互斥體的執(zhí)行。將線程從活動隊(duì)列移到活動列表當(dāng)一個(gè)虛擬線程被激活以響應(yīng)一個(gè)信息或一個(gè)事件時(shí),虛擬線程會被放到合適本地線程50的列隊(duì)線程列表62中,而不是直接放到此本地線程的活動線程列表56中,因?yàn)楸镜鼐€程的活動列表56只能被本地線程本身訪問,因此列表56不一定要被鎖定。避免鎖定本地線程的活動線程列表56而只是鎖定列隊(duì)線程列表62會對性能有所改善,因?yàn)楸镜鼐€程50可能正忙于執(zhí)行一個(gè)指令,正在進(jìn)行激活的本地線程(可能是在不同于異步運(yùn)行在不同的處理器上的線程)不一定要等待此指令執(zhí)行完畢。因此,本地線程負(fù)責(zé)定期地將線程從它的活動隊(duì)列中移到其活動列表中。上下文轉(zhuǎn)換在本地線程列表36中的本地線程入口處,每個(gè)本地線程50儲存一個(gè)指向當(dāng)前執(zhí)行虛擬線程的指針(如指針54)。上下文轉(zhuǎn)換只是包括改變這個(gè)指針使其指向活動線程列表56中的不同虛擬線程58,在此指針的地址處,由指令執(zhí)行單元28(如圖3所示)實(shí)現(xiàn)的指令執(zhí)行代碼使用虛擬線程列表入口處的線程上下文,因此對于一個(gè)上下文轉(zhuǎn)換不需要其它動作。這意味著上下文轉(zhuǎn)換操作會很快,但由于此指針的間接性,執(zhí)行指令會比通常情況下稍慢。線程優(yōu)先級每個(gè)虛擬線程42、58、64被分配有一個(gè)優(yōu)先級,如果多線程在同時(shí)是活動的,即,如果活動線程列表56包含一個(gè)以上的線程58,則有較高優(yōu)先級的線程會收到更多處理器時(shí)間。線程優(yōu)先級的重要應(yīng)用之一是給線程一個(gè)響應(yīng)用戶輸入的優(yōu)先權(quán)利,例如此優(yōu)先權(quán)能使解釋器24在操作者激活鍵盤上的一個(gè)按鍵時(shí),立刻修正顯示器16上的對象,而操作者會立刻從計(jì)算機(jī)收到反饋信息顯示他的指令已經(jīng)被接收和處理,從而用戶知道鍵盤14以及處理器12處于工作狀態(tài)而沒有被凍結(jié),也沒有其它的故障。例如,考慮一個(gè)具有“打印”按鈕(如顯示器16上所示的對象)的應(yīng)用程序,該按鈕作為用戶輸入裝置被分配了它自己的虛擬線程42、58、64,按鈕的線程會發(fā)大部分時(shí)間在閑置線程列表34中。當(dāng)用戶點(diǎn)擊此按鈕(點(diǎn)擊鼠標(biāo)是一個(gè)用戶輸入事件)時(shí),其線程被激活。然后該線程必須重新拖動此按鈕使其看上去象被按下去了一樣,之后線程發(fā)送一個(gè)消息給其它一些線程以便通知其它線程此按鈕被按下,然后其它線程會做一些必要的事,例如,打印一個(gè)文件。通過給按鈕線程分配高于其它應(yīng)用任務(wù)的優(yōu)先級,可以保證當(dāng)用戶點(diǎn)擊按鈕時(shí)會立即有一個(gè)視覺的反應(yīng)(按鈕被重新拖動看起來象被按下),即使系統(tǒng)正忙于其它任務(wù)。一個(gè)簡單的優(yōu)先級系統(tǒng),如流程5A和5B中所展現(xiàn)的,通過給每個(gè)線程分配一個(gè)數(shù)值作為其優(yōu)先級,一般,這個(gè)值在0到100之間,數(shù)值越大表示優(yōu)先級越高,但任何范圍的值都可以被使用,在這個(gè)簡單的優(yōu)先級系統(tǒng)中,如果在相應(yīng)的活動線程列表56中有更高的優(yōu)先級線程存在,則一個(gè)給定的活動線程58不會被分配任何處理器時(shí)間。此系統(tǒng)中每一個(gè)本地線程50明了活動列表56中最高優(yōu)先級虛擬線程58的優(yōu)先級(此優(yōu)先級可以被稱為最高活動優(yōu)先級),當(dāng)一個(gè)本地線程50執(zhí)行一個(gè)上下文轉(zhuǎn)換,并且必須選定一個(gè)新的虛擬線程58使之變更當(dāng)前虛擬線程時(shí),本地線程50總是選擇處在最高活動優(yōu)先級的列表56中的下一個(gè)虛擬線程,從列表的起始端開始直到虛擬線程到達(dá)列表的末端。每個(gè)本地線程50也保持對處在最高活動優(yōu)先級的活動虛擬線程58的數(shù)量的跟蹤。在這個(gè)簡單的優(yōu)先級系統(tǒng)中,無論何時(shí)本地線程50將虛擬線程從相應(yīng)的列隊(duì)線程列表62中移到相應(yīng)的活動線程列表56中,如果此虛擬線程處在一個(gè)比最高活動優(yōu)先級更高的優(yōu)先級,則新的線程的優(yōu)先級會被調(diào)整為最高活動優(yōu)先級,最高活動優(yōu)先級上的線程數(shù)量被設(shè)定為1,而且會執(zhí)行一個(gè)上下文轉(zhuǎn)換以便使新線程成為當(dāng)前虛擬線程。如果新的虛擬線程的優(yōu)先級與最高活動優(yōu)先級相等,則處在最高活動優(yōu)先級的線程數(shù)會有增加。無論何時(shí)活動虛擬線程58終止或變?yōu)殚e置,相應(yīng)的本地線程50會減少處在最高活動優(yōu)先級上的線程數(shù),如果此線程數(shù)達(dá)到0,則本地線程50掃瞄其活動列表56來確認(rèn)新的最高活動優(yōu)先級以及在此優(yōu)先級上新的線程數(shù),并執(zhí)行一個(gè)上下文轉(zhuǎn)換使合適的線程變?yōu)樾碌漠?dāng)前虛擬線程。最后,如果活動虛擬線程58的優(yōu)先級增加,并且新的優(yōu)先級比當(dāng)前最高活動優(yōu)先級更高,則最高活動優(yōu)先級必須被調(diào)整,并且此線程必須變?yōu)樾碌漠?dāng)前線程。同樣地,如果活動虛擬線程58的優(yōu)先級降低,如果此虛擬線程以前是在最高優(yōu)先級,則相應(yīng)的本地線程50必須掃瞄其活動列表56來確認(rèn)新的最高活動優(yōu)先級以及在此優(yōu)先級上新的線程數(shù),然后執(zhí)行一個(gè)上下文轉(zhuǎn)換確定一個(gè)合適的的線程變?yōu)樾碌漠?dāng)前虛擬線程,由解釋器24執(zhí)行的指令的結(jié)果是可以改變優(yōu)先級別。高級線程優(yōu)先級更高級的系統(tǒng)能為線程優(yōu)先級所使用,但是對于虛擬線程工作不是絕對必須的,這個(gè)更高級的系統(tǒng)使得虛擬線程58有可能獲得處理器時(shí)間(即使有一個(gè)更高優(yōu)先級線程是活動的),這要通過使用優(yōu)先組來實(shí)現(xiàn)。在一般的執(zhí)行中線程的優(yōu)先級將會是一個(gè)從-9999到+9999之間的值(包括±9999),一個(gè)線程的優(yōu)先組等于線程的優(yōu)先級除以100以后取整,例如優(yōu)先組組中最低優(yōu)先級組中最低優(yōu)先級-3-399-300-2-299-200-1-199-1000-99+99110019922002993300399在前面章節(jié)中所說的簡單線程優(yōu)先級系統(tǒng)的規(guī)則還在被使用,而且這些規(guī)則代替優(yōu)先組的使用,因此,如果在一個(gè)更高優(yōu)先組中有一個(gè)活動線程,則給定的活動線程58將不會收到任何處理器時(shí)間。然而,在相同優(yōu)先組內(nèi)的線程58基于其在此組內(nèi)優(yōu)先級會收到處理器時(shí)間。線程優(yōu)先級是相對的,給定2個(gè)優(yōu)先級P和Q,優(yōu)先級為P的線程會收到一個(gè)時(shí)間片,優(yōu)先級為Q的線程會收到(Q-P)+1個(gè)時(shí)間片,因此,一個(gè)優(yōu)先級為N的線程會收到一個(gè)時(shí)間片,而優(yōu)先級為N+3線程回得到4個(gè)時(shí)間片。例如,考慮下列線程線程ID線程優(yōu)先級A50B120C121D122E124如果所有這些線程同時(shí)都是活動的,則由于線程A比其它線程的優(yōu)先級低,因此線程A將不會運(yùn)行,其余線程將被分配到時(shí)間片如下BCDEEEDEEECDEEEDEEEBCDEEEDEEECDEEEDEEE也就是說,從38個(gè)時(shí)間片里,線程B會收到2個(gè)時(shí)間片,線程C會收到4個(gè)時(shí)間片,線程D會收到8個(gè)時(shí)間片,線程E會收到24個(gè)時(shí)間片。此時(shí)間片的分配通過對每個(gè)活動虛擬線程58(如圖3所示)的跳躍計(jì)數(shù)器116進(jìn)行維護(hù)來實(shí)現(xiàn),每個(gè)計(jì)數(shù)器116有一個(gè)初始值0。無論何時(shí)一個(gè)上下文轉(zhuǎn)換發(fā)生以及一個(gè)新的線程58必須被選定執(zhí)行,選定的線程自然會在最高優(yōu)先組中,然而此選定的線程可能不是活動的最高優(yōu)先級線程,在相同優(yōu)先組中可能有另一個(gè)更高優(yōu)先級線程。因此,如果H是具有最高優(yōu)先級的活動線程58的優(yōu)先級別;P是另一個(gè)活動線程優(yōu)先級別,此活動線程是被定作為新的當(dāng)前虛擬線程并用來執(zhí)行上下文轉(zhuǎn)換操作的;S是新的當(dāng)前虛擬線程的跳躍計(jì)數(shù)器的值(初始值為0)。如果S≥(H-P),則通常會發(fā)生上下文轉(zhuǎn)換,否則,相應(yīng)的跳躍計(jì)數(shù)器116會增值,線程會被越過,而另一個(gè)活動線程58會被選作當(dāng)前線程。此程序在圖5A中進(jìn)行了說明,解釋器24首先進(jìn)行一個(gè)檢查118以確認(rèn)在活動虛擬線程58的相應(yīng)列表56中是否有與當(dāng)前線程相同優(yōu)先組的線程,樂觀的結(jié)果導(dǎo)致解釋器24在步驟120中選擇當(dāng)前優(yōu)先組中的下一個(gè)線程。正如所述討論的那樣,接著,解釋器24在步驟122中確定當(dāng)前優(yōu)先組中的最高優(yōu)先級活動虛擬線程的優(yōu)先級別H、選定線程的優(yōu)先級別P以及選定線程的的跳躍數(shù)S,在后來的確定結(jié)合124中,解釋器24查詢確認(rèn)是否跳躍數(shù)S大于或等于當(dāng)前優(yōu)先組中的最高優(yōu)先級活動虛擬線程的優(yōu)先級別H與選定線程的優(yōu)先級別P之差,如果跳躍數(shù)S大于或等于H-P之差,解釋器24會在步驟126中重新設(shè)定選定線程跳躍計(jì)數(shù)器116到零,并在步驟128中進(jìn)行上下文轉(zhuǎn)換。選定線程此時(shí)已經(jīng)變成當(dāng)前執(zhí)行線程。如果跳躍數(shù)S小于H-P之差,解釋器24將增大步驟130中選定線程的跳躍計(jì)數(shù)器116的容量,并返回到步驟120來選擇活動虛擬線程56的當(dāng)前優(yōu)先組中的其它線程。每件事都以線程58的相對優(yōu)先級而不是絕對優(yōu)先級為基礎(chǔ),無論怎樣,發(fā)生在一對優(yōu)先級為10和20的線程上的跳躍操作數(shù)與發(fā)生在一對優(yōu)先級為510和520的線程上的跳躍操作數(shù)相同,優(yōu)先級差是10,則具有較低優(yōu)先級的線程會收到一個(gè)時(shí)間片,具有較高優(yōu)先級的線程會收到10個(gè)時(shí)間片。執(zhí)行指令在活動虛擬線程58的一個(gè)時(shí)間片中,被分配有虛擬線程的本地線程50的解釋器24,特別是指令執(zhí)行單元28,會盡可能快地反復(fù)讀取(步驟132)并執(zhí)行(步驟134)來自虛擬線程的指令,在步驟134執(zhí)行完每一個(gè)指令之后,本地線程50(即,解釋器24的一個(gè)相應(yīng)實(shí)例)會進(jìn)行一系列檢查136、138、140以確認(rèn)指令的結(jié)果是否是當(dāng)前虛擬線程正在變?yōu)殚e置,或剛被執(zhí)行的指令的結(jié)果是否是當(dāng)前線程正在終止,或虛擬線程的時(shí)間片已經(jīng)終止。如果這些條件有任何一個(gè)為“真”,則本地線程50或相應(yīng)的解釋器24將停止執(zhí)行來自虛擬線程的指令,直到線程變?yōu)榛顒拥幕蚴潜环峙淞艘粋€(gè)新的時(shí)間片為止。時(shí)間片或處理時(shí)隙可以通過使用一個(gè)定時(shí)器或一個(gè)指令計(jì)數(shù)來計(jì)算,后者由指令計(jì)數(shù)器30(如圖3所示)來跟蹤完成,一般最好是用指令計(jì)數(shù)的方法來測量,因?yàn)槊總€(gè)指令的花費(fèi)低得很多。檢查時(shí)間片是否已經(jīng)終止僅僅只是增加一個(gè)計(jì)數(shù)器變量,然后測試此計(jì)數(shù)器變量是否已經(jīng)通過了最多數(shù)量的時(shí)間片指令。指令數(shù)與預(yù)定最大數(shù)的比較可以通過上下文轉(zhuǎn)換模塊32(如圖3所示)來進(jìn)行。選擇合適大小的時(shí)間片承認(rèn)時(shí)間片越長,對處理器12的利用更有效,從而使工作得更快;但是減小在給定時(shí)間內(nèi)能發(fā)生的上下文轉(zhuǎn)換數(shù),會導(dǎo)致用戶界面性能的不穩(wěn)定;根據(jù)基本的操作系統(tǒng)、硬件平臺以及應(yīng)用程序的特點(diǎn),不同大小的時(shí)間片具有不同的意義;一般,每個(gè)時(shí)間片的大小在20個(gè)到200個(gè)指令比較好,時(shí)間片太小(1到3個(gè)指令)對性能影響較大,而時(shí)間片太大(數(shù)百萬指令)會使多線程達(dá)不到其本來的目的,特別是對于具有繪圖用戶界面的應(yīng)用程序。如果本地線程50,即,解釋器24的相應(yīng)實(shí)例,在檢查步驟136發(fā)現(xiàn)其中最后一個(gè)被執(zhí)行的指令的結(jié)果是當(dāng)前執(zhí)行線程已經(jīng)變?yōu)殚e置的了,且此線程在步驟142從相應(yīng)的活動線程列表56中被移走,這種移動要求對緊挨活動線程列表56中被移動線程之前的線程的指針進(jìn)行調(diào)整。然后相應(yīng)的本地線程50的列隊(duì)互斥體52在步驟144被鎖定,最近閑置的線程在步驟146被插入到閑置線程列表34中,互斥體52在步驟148被解鎖。將一個(gè)線程插入到閑置線程列表34中,要對線程(包括被插入的線程以及閑置線程列表34中緊挨著被插入線程之前的線程)的指針進(jìn)行調(diào)整。如果本地線程50,即,解釋器24的相應(yīng)實(shí)例,在檢查步驟138發(fā)現(xiàn)最后一個(gè)被執(zhí)行的指令的結(jié)果是當(dāng)前執(zhí)行線程已經(jīng)終止其任務(wù)或工作,且此線程在步驟150從活動列表56中被移走,同時(shí)已終止的線程所占用的資源也被釋放出來。在步驟142、144、146、148將線程從活動列表56中移到閑置列表34中之后,或者是在步驟150將已終止的線程從活動列表56中被移走之后,相關(guān)的本地線程50的解釋器24在步驟152調(diào)查在與當(dāng)前線程處在同一優(yōu)先組的活動列表56中是否剩有線程,如果是,則解釋器24返回到步驟70(如圖5A所示)執(zhí)行維護(hù)任務(wù),如果不是,則解釋器24或本地線程50在步驟154通過活動列表56來運(yùn)行,以便確定列表中最高優(yōu)先級線程的優(yōu)先級別。在接下來的步驟156和158中,最高優(yōu)先級線程成為當(dāng)前線程,并且最高優(yōu)先級活動列表56中線程的數(shù)量也被計(jì)算出來。然后解釋器24又返回到步驟70執(zhí)行維護(hù)任務(wù)。當(dāng)在檢查步驟136和138確定最后一個(gè)字節(jié)碼指令執(zhí)行完畢時(shí)當(dāng)前線程沒有變?yōu)殚e置線程或沒有終止其任務(wù)之后,解釋器24在決策結(jié)160詢問是否剛執(zhí)行的指令的結(jié)果是當(dāng)前線程的優(yōu)先組已經(jīng)改變。如果不是,則執(zhí)行檢查步驟140以確定時(shí)間片是否已經(jīng)終止;如果是,則解釋器24在步驟162詢問當(dāng)前線程的優(yōu)先組是增加了還是減小了,如果增加了,則最高優(yōu)先組中的線程數(shù)在步驟164重新設(shè)定為1,如果減小了,則最高優(yōu)先組中的線程數(shù)在步驟166被減小。解釋器24在確定結(jié)合168調(diào)查是否有活動線程留在高優(yōu)先組中,如果調(diào)查結(jié)果為否,則解釋器24會在步驟170掃瞄活動線程以確定一個(gè)新的最高優(yōu)先組并計(jì)算此組中線程的數(shù)量,然后解釋器24在步驟172進(jìn)行上下文轉(zhuǎn)換,同時(shí)最高優(yōu)先級活動線程58變?yōu)楫?dāng)前線程;如果調(diào)查或確定結(jié)合168結(jié)果為真,則解釋器24會直接進(jìn)行上下文轉(zhuǎn)換步驟172以及接下來的讀取步驟132和指令執(zhí)行步驟134。線程負(fù)載平衡如上所述,可能有多重本地線程50,以及來自連接列表56(活動虛擬線程58的)的各執(zhí)行指令。當(dāng)一個(gè)虛擬線程變?yōu)榛顒訝顟B(tài)并被分配給本地線程50時(shí),系統(tǒng)試圖將其分配給具有最輕負(fù)載的本地線程,這使得虛擬線程在本地線程之間基本上保持平衡。當(dāng)活動線程終止或變?yōu)殚e置時(shí),在具有兩個(gè)本地線程的系統(tǒng)上沒有必要這樣做,每個(gè)被分配了10個(gè)虛擬線程,很有可能在一個(gè)本地線程中的6個(gè)虛擬線程都是終止的或閑置的,還有兩個(gè)本地線程,一個(gè)具有4個(gè)虛擬線程,而另一個(gè)具有10個(gè)虛擬線程。避免本地線程50中負(fù)載的不平衡或不均勻是有必要的,因?yàn)檫@樣的一個(gè)環(huán)境不能在多處理器的機(jī)器上有效地利用處理器,為了解決這個(gè)問題,由解釋器24所承擔(dān)的虛擬線程使用一種被稱作“線程平衡”的技術(shù),此線程平衡的基本原則是解釋器24應(yīng)該定期檢查運(yùn)行虛擬線程58的設(shè)備并對它們進(jìn)行重新分配以維持本地線程50中虛擬線程的平衡分配。線程平衡必須仔細(xì)進(jìn)行以避免本地線程50停下來等待被鎖定的數(shù)據(jù)變得可以使用。任何本地線程50都可能會執(zhí)行線程平衡,每個(gè)本地線程50都包含有一個(gè)計(jì)數(shù)器(沒有顯示出來),每次本地線程每增加線程已經(jīng)完成了整套時(shí)間片的執(zhí)行(也就是說,本地線程50達(dá)到了活動線程58的列表56中終端,并且又從頭開始了。)當(dāng)計(jì)數(shù)器達(dá)到選定的某一個(gè)值時(shí)(此選定值符合平臺以及所期望的應(yīng)用程序裝置和操作者的喜好),計(jì)數(shù)器重新設(shè)定為0,且本地線程50試圖執(zhí)行線程平衡。該本地線程50執(zhí)行線程平衡時(shí),如果另一個(gè)本地線程正在執(zhí)行線程平衡,則此本地線程會跳過平衡操作。在幾個(gè)本地線程50中線程平衡的協(xié)調(diào)是通過使用一個(gè)全球互斥體(未說明)來完成,為了執(zhí)行線程平衡,本地線程50必須在此互斥體上加鎖。當(dāng)本地線程50訪問此全球互斥體并發(fā)現(xiàn)其被鎖定時(shí),本地線程不會等待互斥體被解鎖,而是跳過線程平衡。一旦本地線程50在平衡互斥體上加鎖,本地線程就必須在此本地線程表格36上重復(fù)2次,每個(gè)本地線程50維護(hù)一個(gè)線程負(fù)載值(在上文中已有說明,一般是所有活動線程的優(yōu)先級之和)。在第一次通過本地線程表格期間,執(zhí)行平衡的線程50會計(jì)算所有本地線程的負(fù)載值之和,然后,所有本地線程的負(fù)載值之和除以本地線程50的總數(shù)就得到平均負(fù)載;在第二次通過本地線程列表期間,如果任何一個(gè)本地線程50的負(fù)載高于平均負(fù)載,則本地線程的活動列表56會被鎖定,,虛擬線程從活動列表中被移走,從低優(yōu)先級線程開始向高優(yōu)先級線程移動,直到本地線程的負(fù)載小于或等于平均負(fù)載。然后,使用通常的算法,將這些虛擬線程分配給本地線程,就好象是剛被激活一樣。(確定具有最輕負(fù)載的本地線程,并將虛擬線程分配給它。)命名的線程當(dāng)應(yīng)用程序執(zhí)行一個(gè)創(chuàng)建新線程的指令時(shí),此應(yīng)用程序通常會收到剛剛被創(chuàng)建的線程的唯一的標(biāo)識符,此標(biāo)識符一般是一個(gè)獨(dú)特的數(shù)字代碼。(此數(shù)字代碼在線程被創(chuàng)建時(shí)動態(tài)分配,當(dāng)發(fā)送一個(gè)線程間信息時(shí)用來指定目標(biāo)的地址。)然而,有時(shí)候會希望一個(gè)應(yīng)用程序與另一個(gè)正在運(yùn)行的應(yīng)用程序進(jìn)行信息交換,這樣的話,動態(tài)分配的目標(biāo)線程的數(shù)字ID就不能用來發(fā)送信息。因此推薦解釋語言提供一個(gè)指令用來分配一個(gè)名稱給線程,或者是執(zhí)行創(chuàng)建新線程的指令的部分功能,線程的名稱是一串能被唯一用來識別線程的字符。一般,一個(gè)應(yīng)用程序開發(fā)者會使用某個(gè)對于他們來說是唯一的識別器(如其發(fā)展程序包的序列數(shù)),與所說明的應(yīng)用程序名稱(如“Whiteboard”)結(jié)合在一起來確定一個(gè)能為應(yīng)用程序所用的獨(dú)一無二的線程名稱。當(dāng)一個(gè)應(yīng)用程序需要發(fā)送信息給另一個(gè)線程時(shí),可能會通過動態(tài)分配給線程的唯一數(shù)字ID來進(jìn)行,如果線程已經(jīng)被分配有一個(gè)名稱的話也可能會通過線程名稱來進(jìn)行。線程消息以及連網(wǎng)線程間消息是應(yīng)用程序組件特別是用戶界面組件(如按鈕、滾動條)之間進(jìn)行交流的有效辦法,它們通過線程名稱形成一個(gè)有效的機(jī)制來實(shí)現(xiàn)在同一臺計(jì)算機(jī)上運(yùn)行的應(yīng)用程序之間的交流。此外,線程信息還能形成一個(gè)在不同計(jì)算機(jī)上的應(yīng)用之間進(jìn)行交流的有效辦法,如果執(zhí)行恰當(dāng),它將對應(yīng)用以及應(yīng)用開發(fā)者透明,不管線程信息是否被傳送給本地計(jì)算機(jī)上指定線程或遠(yuǎn)程計(jì)算機(jī)上的指定線程,都不會影響需要傳送信息的指令的特性。不同計(jì)算機(jī)上的應(yīng)用程序之間的交流是通過使用代理線程174和176(參見圖6)來完成,當(dāng)本地計(jì)算機(jī)180上的線程178需要與遠(yuǎn)程計(jì)算機(jī)184上的線程182進(jìn)行交流時(shí),本地計(jì)算機(jī)180上的線程178必須執(zhí)行一個(gè)指令來與遠(yuǎn)程線程182相連。執(zhí)行指令時(shí)會創(chuàng)建一個(gè)新的本地代理線程174,此代理線程174執(zhí)行一個(gè)連接到遠(yuǎn)程計(jì)算機(jī)184的代碼模塊,遠(yuǎn)程計(jì)算機(jī)184接受此連接并建立自己的代理線程176,,然后代理線程174和176在網(wǎng)絡(luò)186(使用標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議,如TCP/IP。)上進(jìn)行互相交流。執(zhí)行原始連接指令的本地線程178此時(shí)接受到本地代理線程174的ID,本地線程178能使用此ID就好象它是遠(yuǎn)程目標(biāo)線程182的ID一樣,也就是說本地線程178能將本地代理線程174的ID當(dāng)成在遠(yuǎn)程線程182上被瞄準(zhǔn)的線程間信息的地址來使用。無論本地代理線程174何時(shí)接收信息,它都會用二進(jìn)制緩沖器(沒有表示出來)的形式建立一個(gè)此信息的表示法,并將整個(gè)網(wǎng)絡(luò)186上的這種緩沖器(buffer)傳送給使用標(biāo)準(zhǔn)協(xié)議的遠(yuǎn)程代理線程176,然后,遠(yuǎn)程代理線程176將信息的二進(jìn)制緩沖器表示法譯回成標(biāo)準(zhǔn)的信息并將此信息轉(zhuǎn)發(fā)給遠(yuǎn)程線程182。同一個(gè)系統(tǒng)用來向其它方向傳送信息,如果遠(yuǎn)程代理線程176收到此信息,此信息會被翻譯并在網(wǎng)絡(luò)上將其傳送給本地代理線程174,本地代理線程174又將其轉(zhuǎn)發(fā)給本地線程178??梢赃@樣理解,在這里提到的處理器模塊可能是有線元件(wiredcomponents)或普通計(jì)算機(jī)電路(此電路通過程序修正來完成一些指定的任務(wù)。)。因此,解釋器可能由數(shù)字電路實(shí)現(xiàn),此電路被軟件修正以便將用戶源碼編譯成偽代碼,并創(chuàng)建虛擬線程,用來實(shí)現(xiàn)任務(wù)或工作以及處理根據(jù)當(dāng)前執(zhí)行虛擬線程選定的偽代碼指令,等等。也可以進(jìn)一步理解為在這里對解釋器24以及其操作的描述適用于正在運(yùn)行的任何一個(gè)解釋器實(shí)例,即,不同的本地線程50。盡管本發(fā)明是參照其特定的優(yōu)選實(shí)施例和應(yīng)用程序,但本領(lǐng)域的技術(shù)人員根據(jù)此教案,在不脫離或超過由所附權(quán)利要求限定的本發(fā)明的精神或范圍的情況下.相應(yīng)地,可以理解這里通過例子提供附圖和說明書以便利對本發(fā)明的理解而不應(yīng)該理解對其范圍的限制。權(quán)利要求1.一種用于操作計(jì)算機(jī)的方法,該方法包含把多個(gè)偽碼指令,至少一些包含多個(gè)機(jī)器碼指令的所述偽碼指令存儲在計(jì)算機(jī)內(nèi)存中;對于多個(gè)由計(jì)算機(jī)執(zhí)行的任務(wù)或工作中的每個(gè),都自動產(chǎn)生各個(gè)執(zhí)行上下文數(shù)據(jù)的虛擬線程,該執(zhí)行上下文數(shù)據(jù)包括a)在執(zhí)行各個(gè)任務(wù)或工作中將執(zhí)行的下一個(gè)偽碼指令的存儲位置和(b)用于執(zhí)行各個(gè)任務(wù)或工作需要的任何局部變量的值,多個(gè)所述任務(wù)或工作中的每個(gè)都承擔(dān)包含多個(gè)機(jī)器語言指令的各個(gè)所述偽碼指令的執(zhí)行;在各個(gè)虛擬線程的控制下且在各個(gè)系列時(shí)間片或處理時(shí)隙內(nèi)處理每個(gè)所述任務(wù)或工作;和在不同虛擬線程之間的每個(gè)上下文轉(zhuǎn)接中,僅僅在完成當(dāng)前執(zhí)行的一個(gè)所述偽碼指令的執(zhí)行之后承擔(dān)如此的上下文轉(zhuǎn)接。2.根據(jù)權(quán)利要求1的方法,其中每個(gè)虛擬線程是各個(gè)虛擬線程的連接列表的一部分,每個(gè)虛擬線程還包括指向各個(gè)連接列表中的下一個(gè)虛擬線程的指針,進(jìn)一步包括,為在不同虛擬線程之間的每個(gè)上下文轉(zhuǎn)接,參考當(dāng)前執(zhí)行的虛擬線程的指針以確定將執(zhí)行的下一個(gè)虛擬線程的身份。3.根據(jù)權(quán)利要求2的方法,其中所述相應(yīng)的連接列表是多個(gè)所述虛擬線程的連接列表中的一個(gè),在所述連接列表中,一個(gè)是閑置虛擬線程的列表,另一個(gè)是活動虛擬線程的列表,還有一個(gè)是隊(duì)列虛擬線程的列表。還包含定期將至少一個(gè)虛擬線程從所述列隊(duì)虛擬線程的列表中移到所述活動虛擬線程的列表中。4.根據(jù)權(quán)利要求3的方法,其中虛擬線程從所述列隊(duì)虛擬線程的列表中向所述活動虛擬線程的列表中的移動包括設(shè)置互斥體以鎖定所述列隊(duì)虛擬線程的列表;隨后,修改指針(i)在已移動的虛擬線程中、(ii)在最初至少一個(gè)虛擬線程在所述活動虛擬線程列表中和(iii)在至少一個(gè)保留的虛擬線程在所述列隊(duì)虛擬線程的列表中;和然后,重新設(shè)定或釋放互斥體,以便對所述列隊(duì)虛擬線程的列表進(jìn)行訪問。5.根據(jù)權(quán)利要求1的方法,其中每一個(gè)所述虛擬線程還包括一個(gè)互斥體,進(jìn)一步包括設(shè)定所述選定的一個(gè)虛擬線程的互斥體;隨后在所述選定的虛擬線程中修改數(shù)據(jù);然后,重新設(shè)定或釋放互斥體,以便對所述選定的虛擬線程進(jìn)行訪問。6.根據(jù)權(quán)利要求5的方法,其中設(shè)定所述選定的虛擬線程的所述互斥體,或是修改所述數(shù)據(jù),以及在響應(yīng)來自所述另一個(gè)虛擬線程的信息來重新設(shè)定或釋放所述選定的一個(gè)虛擬線程的互斥體。7.根據(jù)權(quán)利要求5的方法,其中每個(gè)虛擬線程都是虛擬線程相應(yīng)連接列表的一部分,每個(gè)虛擬線程又包括一個(gè)指向相應(yīng)連接列表中的下一個(gè)虛擬線程的指針,所述對數(shù)據(jù)的修改還包括修改所述選定的一個(gè)虛擬線程的指針。8.根據(jù)權(quán)利要求1的方法,其中每個(gè)所述虛擬線程中都被分配了信息隊(duì)列,進(jìn)一步包括在依照另一個(gè)選定的虛擬線程執(zhí)行任務(wù)或工作時(shí),在所述選定的一個(gè)虛擬線程的信息隊(duì)列中輸入信息。9.根據(jù)權(quán)利要求8的方法,其中所述選定的一個(gè)虛擬線程以及所述虛擬線程中的所述另一個(gè)與來自不同應(yīng)用程序的相應(yīng)任務(wù)或工作對應(yīng),由此,在所述選定的一個(gè)虛擬線程的信息隊(duì)列中輸入所述信息來實(shí)現(xiàn)不同應(yīng)用程序之間的數(shù)據(jù)傳遞。10.根據(jù)權(quán)利要求8的方法,其中所述選定的一個(gè)虛擬線程以及所述虛擬線程中的所述另一個(gè)是不同計(jì)算機(jī)上的代理線程或界面線程,在包括所述計(jì)算機(jī)之間的信息鏈路上傳送所述信息的所述信息隊(duì)列中輸入所述信息。11.根據(jù)權(quán)利要求1的方法,其中虛擬線程的創(chuàng)建、在相應(yīng)的時(shí)間片或處理時(shí)隙中的所述任務(wù)或工作的處理和執(zhí)行上下文轉(zhuǎn)換都包括在解釋器程序下計(jì)算機(jī)的操作。12.根據(jù)權(quán)利要求11的方法,該方法還包括在計(jì)算機(jī)上運(yùn)行多個(gè)所述解釋程序的實(shí)例,每個(gè)實(shí)例對應(yīng)一個(gè)本地線程,每個(gè)本地線程創(chuàng)建相應(yīng)的一套執(zhí)行上下文數(shù)據(jù)的虛擬線程;在各個(gè)虛擬線程的控制下處理相應(yīng)系列時(shí)間片或處理時(shí)隙中的多個(gè)任務(wù)或工作;和不同虛擬線程之間的每一個(gè)上下文轉(zhuǎn)換中,執(zhí)行這種上下文轉(zhuǎn)換只有在當(dāng)前執(zhí)行所述偽代碼指令中的一個(gè)執(zhí)行完之后。13.根據(jù)權(quán)利要求12的方法,還包含將一個(gè)虛擬線程從具有一個(gè)比平均值重的負(fù)載的第一個(gè)本地線程移到具有一個(gè)比平均值輕的負(fù)載的第二個(gè)本地線程中。14.根據(jù)權(quán)利要求13的方法,其中虛擬線程的移動包括通過將各線程的線程負(fù)載值相加然后再除以線程數(shù)量來確定所有本地線程的平均負(fù)載;和對于每個(gè)本地線程,將各線程的負(fù)載值與平均負(fù)載值相比以得到相對負(fù)載。15.根據(jù)權(quán)利要求1的方法,其中所述虛擬線程包括第一個(gè)代理線程通過計(jì)算機(jī)網(wǎng)絡(luò)鏈路與另一臺計(jì)算機(jī)上的第二個(gè)代理線程進(jìn)行交流;與所述另一臺計(jì)算機(jī)的交流包括在所述第一個(gè)代理線程的控制之下使用標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議。16.根據(jù)權(quán)利要求15的方法,其中每一個(gè)所述虛擬線程,包括所述第一個(gè)代理線程都被分配了一個(gè)相應(yīng)的信息隊(duì)列,進(jìn)一步包括在所述第一個(gè)代理線程的信息隊(duì)列中輸入信息用來執(zhí)行在所述計(jì)算機(jī)網(wǎng)絡(luò)鏈路上另一臺計(jì)算機(jī)的數(shù)據(jù)轉(zhuǎn)換。17.根據(jù)權(quán)利要求1的方法,其中選定的一個(gè)處于閑置狀態(tài)的所述虛擬線程,進(jìn)一步包括產(chǎn)生一個(gè)信息以響應(yīng)來自計(jì)算機(jī)外部源的輸入;在所述選定的一個(gè)虛擬線程的信息隊(duì)列中插入信息;將所述選定的一個(gè)虛擬線程從所述閑置狀態(tài)變到活動狀態(tài);和在所述信息隊(duì)列中插入所述信息并改變所述選定的一個(gè)虛擬線程的狀態(tài)之后,在將一個(gè)時(shí)間片或處理時(shí)隙分配給選定的一個(gè)所述虛擬線程期間訪問所述信息隊(duì)列來獲取所述信息。18.根據(jù)權(quán)利要求1的方法,其中每個(gè)所述虛擬線程還包括一個(gè)線程優(yōu)先級,進(jìn)一步包括自動根據(jù)多個(gè)所述虛擬線程中的線程優(yōu)先級來確定相對優(yōu)先級,并根據(jù)確定的相對優(yōu)先級改變線程的次序。19.根據(jù)權(quán)利要求1的方法,其中在相應(yīng)虛擬線程的控制之下,在相應(yīng)一系列時(shí)間片或處理時(shí)隙中所處理的任務(wù)或工作包括控制成像于計(jì)算機(jī)顯示器上的對象,每一個(gè)所述對象組成一個(gè)獨(dú)立的分配給相應(yīng)的一個(gè)所述虛擬線程的任務(wù)或工作;和監(jiān)視計(jì)算機(jī)鍵盤上按鍵的活動,每個(gè)所述按鍵組成一個(gè)獨(dú)立的分配給相應(yīng)的一個(gè)所述虛擬線程的任務(wù)或工作。20.根據(jù)權(quán)利要求1的方法,其中所述時(shí)隙或處理時(shí)隙通過對連續(xù)執(zhí)行的偽代碼指令的計(jì)數(shù)來測量,進(jìn)一步包括對于多個(gè)所述時(shí)間片或處理時(shí)隙中的每一個(gè),在計(jì)數(shù)預(yù)定數(shù)量的連續(xù)執(zhí)行偽代碼指令時(shí),終止相應(yīng)的時(shí)間片或處理時(shí)隙。21.一種多任務(wù)計(jì)算機(jī)包含一存儲器;一顯示器;一輸入外圍設(shè)備;至少一個(gè)與所述存儲器、顯示器以及輸入外圍設(shè)備動態(tài)相連的處理器,此處理器有一編譯器,其用來將人工輸入的源代碼(operatorenteredsourcecode)指令轉(zhuǎn)換為字節(jié)碼或偽代碼指令,此編譯器與所述存儲器動態(tài)相連以便能存儲所述字節(jié)碼或偽代碼指令;用來執(zhí)行所述字節(jié)碼或偽代碼指令的解釋器;和所述存儲器存儲閑置虛擬線程的第一連接列表,活動虛擬線程的第二連接列表,以及列隊(duì)或等待的虛擬線程的第三個(gè)連接列表。每個(gè)所述線程包括上下文或狀態(tài)數(shù)據(jù)、一個(gè)互斥體以及一個(gè)指向相應(yīng)列表中下一個(gè)線程的指針。所述解釋器與所述輸入外圍設(shè)備動態(tài)相連,用來識別由所述輸入外圍設(shè)備產(chǎn)生的事件,所述解釋器與所述存儲器動態(tài)相連以用來(a)將至少一個(gè)所述閑置虛擬線程從所述第一個(gè)連接列表移到所述第三個(gè)連接列表,(b)將列隊(duì)或等待的虛擬線程從所述第三個(gè)連接列表移到所述第二個(gè)連接列表,(c)在連續(xù)的時(shí)間片或處理時(shí)隙中依照預(yù)定的優(yōu)先級安排,根據(jù)所述第二個(gè)連接列表中不同虛擬線程的上下文以及狀態(tài)數(shù)據(jù)執(zhí)行指令。所述解釋器與所述顯示器部分動態(tài)相連用于以響應(yīng)所述第二個(gè)連接列表中相應(yīng)的活動虛擬線程所指定的指令來修正所述顯示器上的對象。22.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中所述存儲器另外存儲本地線程的第四連接列表所述解釋器是多個(gè)共同解釋器的實(shí)例之一,所述共同解釋器的所述實(shí)例的每個(gè)與各自的所述本地線程相對應(yīng);所述第二連接列表是多個(gè)連接本地線程列表中的一個(gè),每個(gè)所述本地線程被通過指向各自所述連接本地線程列表的各個(gè)指針?biāo)B接;和所述第三連接列表是多個(gè)連接隊(duì)列線程列表中的一個(gè),每個(gè)所述本地線程被通過指向各自所述連接隊(duì)列線程列表的各個(gè)指針?biāo)B接。23.根據(jù)權(quán)利要求22的計(jì)算機(jī),其中所述活動線程每個(gè)都包括用于使能由一個(gè)本地線程鎖定的各個(gè)線程的互斥體,以防止其它本地線程對各個(gè)線程的訪問。24.根據(jù)權(quán)利要求22的方法,其中所述解釋器包括把虛擬線程從具有比平均值重的負(fù)載的第一本地線程移動到具有比平均值輕的負(fù)載的第二本地線程的裝置。25.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中所述閑置虛擬線程的列表包括多個(gè)分配給鍵盤上各按鍵的線程,用來處理各按鍵的活動。26.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中所述閑置虛擬線程的列表包括多個(gè)分配給顯示圖像中的各個(gè)對象的線程,用來處理各對象的外觀修正。27.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中所述解釋器包括一個(gè)上下文轉(zhuǎn)換模塊以及一個(gè)指令計(jì)數(shù)器,所述上下文轉(zhuǎn)換模塊與所述存儲器以及指令計(jì)數(shù)器動態(tài)相連,用于在依照所述當(dāng)前執(zhí)行活動線程執(zhí)行預(yù)定數(shù)量的字節(jié)碼或偽代碼指令時(shí),實(shí)現(xiàn)從所述第二個(gè)連接列表的當(dāng)前執(zhí)行活動線程到所述第二個(gè)連接列表中的下一個(gè)活動線程的上下文轉(zhuǎn)換。28.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中每個(gè)所述虛擬線程包括各線程中要執(zhí)行的下一個(gè)指令的存儲位置,各線程的任何一個(gè)局部變量值,以及各線程執(zhí)行的優(yōu)先級別。29.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中所述存儲器存儲了多個(gè)分配給所述各線程的信息隊(duì)列。30.根據(jù)權(quán)利要求21的計(jì)算機(jī),其中所述存儲器存儲了至少一個(gè)具有用來通過通信鏈路實(shí)現(xiàn)與遠(yuǎn)程計(jì)算機(jī)之間的交流的執(zhí)行上下文的代理線程或界面線程,此代理線程或界面線程包含一個(gè)通向網(wǎng)絡(luò)協(xié)議例行程序的存儲地址。31.在一種具有用來執(zhí)行一系列字節(jié)碼指令,且每個(gè)字節(jié)碼指令包含多個(gè)的機(jī)器碼步驟的解釋器的計(jì)算機(jī)中,多任務(wù)方法包含對于由計(jì)算機(jī)完成的任務(wù)中的每一個(gè)來說,使用解釋器定義一個(gè)相應(yīng)的虛擬線程;在一系列連續(xù)時(shí)間片中的每一個(gè)時(shí)間片里,執(zhí)行從虛擬線程中選定的各當(dāng)前線程的字節(jié)碼指令;在執(zhí)行完所述一個(gè)字節(jié)碼指令之后,執(zhí)行一個(gè)從所述虛擬線程到所述另一個(gè)虛擬線程的上下文轉(zhuǎn)換。32.根據(jù)權(quán)利要求31的方法,其中每個(gè)所述虛擬線程都是虛擬線程相應(yīng)連接列表的一部分,每個(gè)虛擬線程還包括一個(gè)指向相應(yīng)連接列表中下一個(gè)虛擬線程的指針,還包含對于不同虛擬線程之間的上下文轉(zhuǎn)換,參考當(dāng)前執(zhí)行虛擬線程的指針來確定要執(zhí)行的下一個(gè)虛擬線程的身份。33.根據(jù)權(quán)利要求32的方法,其中相應(yīng)的連接列表都是多個(gè)所述虛擬線程連接列表中的一個(gè),所述連接列表中,一個(gè)是閑置虛擬線程的一個(gè)列表,另一個(gè)是活動虛擬線程的一個(gè)列表,還有一個(gè)是列隊(duì)虛擬線程的一個(gè)列表,還包含周期地將至少一個(gè)虛擬線程從列隊(duì)虛擬線程的列表移到活動虛擬線程的列表中。34.根據(jù)權(quán)利要求33的方法,其中將一個(gè)虛擬線程從列隊(duì)虛擬線程的所述列表向活動虛擬線程的所述列表的移動包括設(shè)定互斥體鎖定列隊(duì)虛擬線程的所述列表;隨后,修正指針(i)在已移動的虛擬線程中、(ii)在最初至少一個(gè)虛擬線程在所述活動虛擬線程列表中和(iii)在至少一個(gè)虛擬線程保留在所述列隊(duì)虛擬線程列表中;和然后,重新設(shè)定或重新釋放互斥體以使得能對所述列隊(duì)虛擬線程的列表進(jìn)行訪問。35.根據(jù)權(quán)利要求31的方法,其中每個(gè)所述虛擬線程還包括一個(gè)互斥體,進(jìn)一步包括設(shè)定所述選定的一個(gè)虛擬線程的互斥體;隨后,修正所述選定的一個(gè)虛擬線程中的數(shù)據(jù);然后,重新設(shè)定或釋放互斥體以使得能對所述選定的一個(gè)虛擬線程進(jìn)行訪問。36.根據(jù)權(quán)利要求35的方法,其中設(shè)定所述選定的一個(gè)虛擬線程的所述互斥體、修正所述數(shù)據(jù)以及重新設(shè)定或釋放所述選定的一個(gè)虛擬線程的所述互斥體,以響應(yīng)一個(gè)來自其它所述虛擬線程的信息執(zhí)行所述三項(xiàng)。37.根據(jù)權(quán)利要求31的方法,其中每一個(gè)所述虛擬線程被分配一個(gè)信息隊(duì)列,進(jìn)一步包括在依照所述虛擬線程中的另一個(gè)執(zhí)行任務(wù)或工作時(shí),在所述選定的一個(gè)虛擬線程的信息隊(duì)列中輸入信息。38.根據(jù)權(quán)利要求31的方法,其中所述虛擬線程包括第一個(gè)代理線程,此代理線程用來通過通信鏈路與另一臺計(jì)算機(jī)上第二個(gè)代理線程進(jìn)行通信,進(jìn)一步包括根據(jù)用來在所述通信鏈路上將一個(gè)信息傳送給所述第二個(gè)代理線程的所述第一個(gè)代理線程的處理字節(jié)碼指令。39.根據(jù)權(quán)利要求31的方法,其中每一個(gè)所述虛擬線程還包括線程優(yōu)先級別,進(jìn)一步包括在多個(gè)所述虛擬線程中自動參考線程優(yōu)先級別來確定相對優(yōu)先級別,并且根據(jù)確定的相對優(yōu)先級別改變線程的次序。40.根據(jù)權(quán)利要求31的方法,其中所述時(shí)間片或處理時(shí)隙通過計(jì)算連續(xù)執(zhí)行的偽代碼指令來測量,進(jìn)一步包括對于多個(gè)所述時(shí)間片或處理時(shí)隙的每一個(gè)來說,在計(jì)算連續(xù)執(zhí)行的偽代碼指令的預(yù)定數(shù)量時(shí),終止相應(yīng)的時(shí)間片或處理時(shí)隙。41.一種多任務(wù)計(jì)算機(jī)包括一存儲器,用來存儲多線程或多任務(wù)的狀態(tài)或上下文數(shù)據(jù);一解釋器,用來執(zhí)行一系列每一個(gè)字節(jié)碼指令包含多個(gè)機(jī)器碼步驟的字節(jié)碼指令,解釋器將被編程為由計(jì)算機(jī)完成為每個(gè)任務(wù)定義的一個(gè)相應(yīng)的虛擬線程;在一系列連續(xù)時(shí)間片的每一個(gè)時(shí)間片中,執(zhí)行相應(yīng)的從虛擬線程中選定的當(dāng)前線程的字節(jié)碼指令;和僅僅當(dāng)執(zhí)行完一個(gè)所述字節(jié)碼指令之后,執(zhí)行從一個(gè)所述虛擬線程到另一個(gè)所述虛擬線程的上下文轉(zhuǎn)換。42.根據(jù)權(quán)利要求41的計(jì)算機(jī),其中每一個(gè)所述虛擬線程都是相應(yīng)的虛擬線程連接列表的一部分,每一個(gè)虛擬線程還包括指向相應(yīng)連接列表中下一個(gè)虛擬線程的指針。所述解釋器進(jìn)而被編程以參考當(dāng)前執(zhí)行虛擬線程的指針來確定要執(zhí)行的下一個(gè)虛擬線程的身份。43.根據(jù)權(quán)利要求42的計(jì)算機(jī),其中所述相應(yīng)連接列表是多個(gè)所述虛擬線程連接列表的一個(gè),所述連接列表中的一個(gè)是閑置虛擬線程的列表,另一個(gè)是活動虛擬線程的列表,還有一個(gè)是列隊(duì)虛擬線程的列表。所述解釋器進(jìn)而被編程以定期將至少一個(gè)虛擬線程從所述列隊(duì)虛擬線程的列表中移到所述活動虛擬線程的列表中。44.一種計(jì)算機(jī)方法包含運(yùn)行計(jì)算機(jī)的定時(shí)器以產(chǎn)生一系列時(shí)間片或處理時(shí)隙;將輸入用戶源碼編譯成字節(jié)碼或偽代碼的指令,而每一個(gè)字節(jié)碼或偽代碼的指令都與多個(gè)的機(jī)器碼指令對應(yīng);運(yùn)行所述計(jì)算機(jī)的解釋器來將計(jì)算任務(wù)分配給相應(yīng)的虛擬線程,將所述計(jì)算任務(wù)分配給相應(yīng)的虛擬線程包括識別和存儲每個(gè)所述計(jì)算任務(wù)的狀態(tài)和上下文數(shù)據(jù);在每一個(gè)所述時(shí)間片中,依照所述一個(gè)當(dāng)前虛擬線程的狀態(tài)和上下文數(shù)據(jù),所述解釋器運(yùn)行還用來執(zhí)行選定的一個(gè)字節(jié)碼或偽代碼的指令;只有當(dāng)執(zhí)行完選定的字節(jié)碼或偽代碼的指令中的每一個(gè)連續(xù)指令之后,進(jìn)而運(yùn)行所述解釋器以檢查自從依照所述當(dāng)前虛擬線程中的一個(gè)開始執(zhí)行指令之后,預(yù)定的時(shí)間間隔是否已經(jīng)消逝;和在確定所述預(yù)定的時(shí)間間隔已經(jīng)消逝時(shí),運(yùn)行所述解釋器來執(zhí)行上下文轉(zhuǎn)換。45.根據(jù)權(quán)利要求44的方法,其中分配給所述相應(yīng)的虛擬程序線程的任務(wù)包括(a)控制在顯示屏上成像的對象,(b)監(jiān)視操作者的輸入,(c)執(zhí)行應(yīng)用程序的例行程序,(d)運(yùn)行計(jì)算機(jī)維護(hù)例行程序,(e)通過計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)與遠(yuǎn)程計(jì)算機(jī)之間的通信,和(f)計(jì)算局部變量。全文摘要在計(jì)算機(jī)的操作中,多個(gè)字節(jié)碼或偽碼指令,至少一些包含多個(gè)機(jī)器碼指令的偽碼指令存儲在計(jì)算機(jī)內(nèi)存中,對于將由計(jì)算機(jī)執(zhí)行的多個(gè)任務(wù)或工作中的每一個(gè),自動產(chǎn)生各個(gè)執(zhí)行上下文數(shù)據(jù)的虛擬線程。該虛擬線程的每個(gè)都包括(a)在執(zhí)行各個(gè)任務(wù)或工作中將被執(zhí)行的下一個(gè)的偽碼指令的存儲位置和(b)用于執(zhí)行各個(gè)任務(wù)或工作需要的任何局部變量的值。至少一些任務(wù)或工作中的每個(gè)都承擔(dān)包含多個(gè)機(jī)器語言指令的各個(gè)偽碼指令的執(zhí)行。在各個(gè)虛擬線程的控制下和在各個(gè)系列時(shí)間片或處理時(shí)隙內(nèi)處理每個(gè)任務(wù)或工作,并且,在不同虛擬線程之間的每個(gè)上下文轉(zhuǎn)接中,僅僅在完成當(dāng)前執(zhí)行的一個(gè)偽碼指令的執(zhí)行之后承擔(dān)如此的上下文轉(zhuǎn)接。文檔編號G06F9/48GK1592886SQ01821855公開日2005年3月9日申請日期2001年10月26日優(yōu)先權(quán)日2000年11月24日發(fā)明者馬修·A·范伯格申請人:凱薩羅恩產(chǎn)品公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
若羌县| 天台县| 芮城县| 黄浦区| 石柱| 临猗县| 建平县| 万盛区| 拜城县| 大庆市| 平南县| 科技| 新巴尔虎右旗| 岳池县| 温泉县| 安达市| 湘潭市| 资源县| 大冶市| 湘阴县| 屏山县| 武鸣县| 潜江市| 即墨市| 靖安县| 许昌市| 太和县| 乡宁县| 印江| 吉首市| 云霄县| 密云县| 大荔县| 莒南县| 常熟市| 五莲县| 陵川县| 洱源县| 漳州市| 类乌齐县| 临高县|