專利名稱:用于操作系統(tǒng)服務(wù)的透明支持的制作方法
技術(shù)領(lǐng)域:
本發(fā)明的公開總的涉及信息處理系統(tǒng),尤其涉及有關(guān)用于多排序器多線程系
統(tǒng)(multi-sequencer multithreading system)內(nèi)的隔離的排序器(sequestered sequencer) 的支持操作系統(tǒng)("OS")服務(wù)的技術(shù)。
背景技術(shù):
己經(jīng)利用了硬件和軟件技術(shù)來提高諸如那些包括微處理器的信息處理系統(tǒng)的 性能。在硬件這一方面,用于改善微處理器性能的微處理器設(shè)計方法已經(jīng)包括增加 的時鐘速度、流水線、分支預(yù)測、超標量執(zhí)行、亂序執(zhí)行和高速緩存。許多這些方 法都會導致晶體管數(shù)量的增加,在某些情況下甚至會導致晶體管數(shù)量增加的速率比 性能改善的速率還要快。
除了明確地通過添加晶體管來增加性能之外,其他的性能增強還涉及軟件技 術(shù)。已經(jīng)用來改善處理器性能的一種軟件方法被稱為"多線程"。在軟件多線程中, 一個指令流被分成并行執(zhí)行的多個指令流??蛇x地,多個獨立的軟件指令流也可以 并行執(zhí)行。
在一種被稱為時間片多線程或者時間多路復用("TMUX")多線程的方法 中,單個處理器在固定的時間段之后在各線程間切換。在另一種方法中,單個處理 器在出現(xiàn)諸如長等待時間高速緩存未命中的觸發(fā)事件時在各線程之間切換。在被稱 為基于事件切換的多線程("SoEMT")的后一種方法中,在給定時刻最多只有 一個線程活動。
多線程技術(shù)越來越多地受到硬件的支持。例如,在一種方法中,在諸如單芯 片多處理器("CMP")的多處理器系統(tǒng)中的各處理器都可以并發(fā)地作用于多個軟 件線程之一。在被稱為同步多線程("SMT")的另一種方法中,單個物理處理 器對操作系統(tǒng)和用戶應(yīng)用程序看來象多個邏輯處理器。對于SMT而言,多個軟件 線程可以是活動的并且無需切換地在單個處理器上同時執(zhí)行。也就是說,每個邏輯
處理器保持一組完整的體系結(jié)構(gòu)狀態(tài),但是諸如高速緩存、執(zhí)行單元、分支預(yù)測器、 控制邏輯和總線之類的物理處理器的許多其他資源則可以被共享。對于SMT而言, 來自多個軟件線程的指令于是就可以并發(fā)地在每個邏輯處理器上執(zhí)行。
對于支持軟件線程并發(fā)執(zhí)行的系統(tǒng)而言,諸如SMT和/或CMP系統(tǒng),操作系 統(tǒng)應(yīng)用程序可以控制對線程執(zhí)行資源的調(diào)度和軟件線程的執(zhí)行。操作系統(tǒng)也可以提 供特定的服務(wù),諸如為它控制的各線程提供同步對象和結(jié)構(gòu)化異常處理。
附圖簡述
可以參考以下附圖來理解本發(fā)明的各實施例,在各附圖中類似標號指代類似
元素。這些附圖并不意欲限制,而只是為一種用于向隔離的排序器提供特定os服
務(wù)透明支持的系統(tǒng)、方法和機制選定的實施例進行說明。
圖1是示出了多排序器系統(tǒng)的各實施例的框圖。
圖2是說明用于一多排序器系統(tǒng)的并行編程方法的圖形表示的框圖。 圖3是示出了用戶線程(shred)代理執(zhí)行機制的至少一個實施例的流程圖。 圖4是示出用于利用代理項線程的多排序器系統(tǒng)的一種一般性并行編程方法 的圖形表示的框圖。
圖5是示出了利用代理項線程的用戶線程代理執(zhí)行機制的至少一個實施例的 控制流程圖。
圖6是闡明了作為有關(guān)指定線程資源的多用戶線程爭用的結(jié)果而出現(xiàn)的一種 死鎖類型的說明性示例的時序圖。
圖7和圖8是示出了在多用戶線程系統(tǒng)中使用"代理項線程"來避免死鎖的 一個示例的時序圖。
圖9是示出了在包括一個或多個隔離的排序器的多用戶線程環(huán)境內(nèi)結(jié)構(gòu)化異 常處理機制1010的至少一個實施例的框圖。
圖IO是示出了為用于各用戶線程的結(jié)構(gòu)化異常處理利用代理項線程的一機制 的至少一個實施例的框圖。
圖11是示出了在多用戶線程系統(tǒng)的結(jié)構(gòu)化異常處理期間使用代理項線程來避 免對指定線程資源爭用的至少一個實施例的時序圖。
圖12是示出了能夠執(zhí)行所公開技術(shù)的系統(tǒng)的至少一個實施例的框圖。
詳細描述
隨后的討論將描述透明地觸發(fā)用于線程執(zhí)行資源("排序器(sequencer)") 的操作系統(tǒng)服務(wù)的方法、系統(tǒng)和機制的所選實施例,其中上述線程執(zhí)行資源是與操 作系統(tǒng)的查看相隔離的。在此討論的機制和方法的實施例可用于單核或多核多線程 系統(tǒng)。在以下的描述中,已經(jīng)闡明了諸如處理器類型、多線程環(huán)境、系統(tǒng)配置、數(shù) 據(jù)結(jié)構(gòu)和指定操作系統(tǒng)服務(wù)之類的多種特定細節(jié)以提供對本發(fā)明各實施例的更為 透徹的理解。然而本領(lǐng)域普通技術(shù)人員應(yīng)該認識到即使沒有這些特定細節(jié)也可以實 踐本發(fā)明。此外,某些周知的結(jié)構(gòu)、電路等沒有詳細示出以避免對本發(fā)明主題不必 要的混淆。
圖1是示出了支持線程的用戶級控制的多排序器系統(tǒng)的實施例310、 350的選 定硬件特征部件的框圖。圖1示出了 SMT多排序器多線程環(huán)境310中的選定硬件 特征。圖1還示出了多核多線程環(huán)境350的選定硬件特征部件,在該環(huán)境中每個排 序器是各自的物理處理器核。
在SMT環(huán)境310中,使得單個物理處理器304由操作系統(tǒng)和用戶程序看來像 多個邏輯處理器(未示出),這多個邏輯處理器在此被稱為U^至IJV每個邏輯 處理器LPi至LP。都各自保持一整套的體系結(jié)構(gòu)狀態(tài)AS,至ASn。體系結(jié)構(gòu)狀態(tài)312a 和312b對于至少一個實施例包括數(shù)據(jù)寄存器、段寄存器、控制寄存器、調(diào)試寄存 器和大多數(shù)特定模型的寄存器。
邏輯處理器LP,至LPn共享物理處理器304的大多數(shù)其他資源,諸如高速緩存、 執(zhí)行單元、分支預(yù)測、控制邏輯和總線。雖然這些特征部件可以被共享,但是在多 線程環(huán)境310中的每個線程上下文都能夠獨立地生成下一個指令地址(并且執(zhí)行例 如從指令高速緩存、執(zhí)行指令高速緩存或跟蹤高速緩存中的讀取)。
于是,處理器304包括邏輯獨立的下一指令指針和讀取邏輯320來為每個線 程上下文讀取指令,即使多個邏輯排序器可在單個物理讀取/解碼單元322中實現(xiàn)。 對于SMT或?qū)嵤├?,術(shù)語"排序器"至少包括用于線程上下文的下一指令指 針和讀取邏輯320,以及有關(guān)該線程上下文的至少部分相關(guān)聯(lián)體系結(jié)構(gòu)狀態(tài)AS。 應(yīng)該注意到SMT系統(tǒng)310的排序器沒有必要是對稱的。例如,用于同一物理核的 兩個SMT排序器在它們各自保持的體系結(jié)構(gòu)狀態(tài)信息的量上可以有所不同。
于是,對于至少一個實施例而言,多排序器系統(tǒng)310是支持并發(fā)多線程的單 核處理器304。對于這一實施例而言,每個排序器都是具有其本身的下一指令指針 和讀取邏輯以及其本身的體系結(jié)構(gòu)狀態(tài)信息的邏輯處理器,雖然同一物理處理器核 304執(zhí)行所有的線程指令。對于這一實施例而言,邏輯處理器保持其本身的體系結(jié)構(gòu)狀態(tài)版本,雖然單處理器核304的執(zhí)行資源可以在并發(fā)執(zhí)行的各線程間共享。
圖1還示出了多核多線程環(huán)境350的至少一個實施例。這一環(huán)境350包括兩 個或多個分隔的物理處理器304a至304n,其中的每一個物理處理器都能夠執(zhí)行不 同的線程/用戶線程,以使不同線程/用戶線程的至少部分的執(zhí)行可以同時進行。每 個處理器304a至304n包括物理獨立的讀取單元322,用來讀取用于其各自線程或 用戶線程的指令信息。在每個處理器304a至304n都執(zhí)行單個線程/用戶線程的實 施例中,讀取/解碼單元322執(zhí)行單個下一指令指針和讀取邏輯320。然而在每個處 理器304a至304n都支持多線程上下文的實施例中,讀取/解碼單元322為每個受 支持的線程上下文執(zhí)行各自不同的下一指令指針和讀取邏輯320。在多處理器環(huán)境 350中額外下一指令指針和讀取邏輯320的可選特性在圖1中由虛線表示。
因此,至少對于圖1所示多核系統(tǒng)350的一個實施例而言,每一個排序器都 可以是處理器核304,并帶有駐留于單芯片封裝360內(nèi)的多核304a至304n。每個 核304a至304n都可以是單線程或多線程處理器核。芯片封裝360由圖1中的折線 表示以指示多核系統(tǒng)350所示出的單芯片實施例僅僅是示例性的。對于其他實施例 而言,多核系統(tǒng)的處理器核可以駐留在各自的芯片上。
為了討論方便,以下的討論聚焦于多核系統(tǒng)350的各實施例。然而這一焦點 不應(yīng)被理解為限制性的,因為下述機制既可以在多核又可以在單核多排序器環(huán)境中執(zhí)行。
圖2是示出了在多排序器多線程系統(tǒng)上并行編程方法的圖形表示的框圖。共 享存儲器多處理范例可以在被稱為并行編程的方法中使用。根據(jù)該方法,應(yīng)用程序 設(shè)計人員可以將有些時候被稱為"應(yīng)用程序"或"迸程"的軟件程序分成并發(fā)運行 的多個線程從而實現(xiàn)該軟件程序的并行性。同一軟件程序("進程")的全部線程 都共享存儲器的公共邏輯視圖。
圖2示出了對操作系統(tǒng)140可見的進程100和120。這些進程100和120可以 是不同的軟件應(yīng)用程序,諸如字處理程序和電子郵件管理程序。通常每個進程在不 同的地址空間內(nèi)操作。
操作系統(tǒng)("OS" ) 140通常負責管理與諸如進程120的進程有關(guān)的用戶創(chuàng) 建的任務(wù)。因此,操作系統(tǒng)140可以為與該進程120相關(guān)聯(lián)的每個用戶定義的任務(wù) 創(chuàng)建截然不同的線程125和126,并且把線程125和126映射至各線程執(zhí)行資源。 OS 140通常負責調(diào)度這些線程125和126以便在各執(zhí)行資源上執(zhí)行。與單個進程 相關(guān)聯(lián)的各線程通常具有相同的處理器視圖并且對彼此的虛擬地址空間可見。
因為OS 140負責創(chuàng)建、映射和調(diào)度線程,所以線程125和126對OS 140 "可 見"。此外,本發(fā)明的實施例還包括對OS 140不可見的線程130至136。也就是 說,OS 140不創(chuàng)建、不管理或者換句話說不確認、不控制這些額外的線程130至 136。既不由OS 140創(chuàng)建也不由其控制的這些額外的線程有時被稱為"用戶線程 (shred) " 130至136以便將它們與OS可見的線程區(qū)分開來。這些用戶線程可以 由用戶級程序創(chuàng)建、管理并控制,并且可以在完全OS透明的情況下被調(diào)度以便在 與操作系統(tǒng)隔絕的排序器上運行。(OS隔絕的排序器在此有時被稱為"OS不可 見")。OS隔絕的排序器與OS可見的排序器共享同一個環(huán)0狀態(tài)。這些用戶線 程于是就共享相同的執(zhí)行環(huán)境(地址映射),該執(zhí)行環(huán)境是為與該相同進程相關(guān)聯(lián) 的各線程創(chuàng)建的。
OS不可見用戶線程可由(例如,通過應(yīng)用程序設(shè)計人員編碼的)指令生成, 而這些指令是由OS可見線程執(zhí)行的。因此,用戶線程對操作系統(tǒng)不可見但是卻能 夠與OS可見的線程相關(guān)聯(lián)。OS可見線程可由OS調(diào)度程序調(diào)度以便在OS可見的
排序器上運行,而用戶線程則可由os獨立的用戶應(yīng)用程序或運行時例程調(diào)度。
圖2示出了一種至少用于本發(fā)明一個實施例的系統(tǒng)可支持OS可見線程(諸如, 線程125)以及與該線程相關(guān)聯(lián)的用戶線程130至136 (對OS不可見)之間1對 多的關(guān)系。用戶線程對OS不"可見"(參見圖2中的140)的意思是程序設(shè)計人 員而不是OS則可利用用戶級技術(shù)來創(chuàng)建、同步并在其他方面管理和控制執(zhí)行用戶 線程的操作。雖然OS 140知道并控制一線程,但是該OS 140不知道并且不管理 或控制用戶線程。
于是,代替依賴操作系統(tǒng)管理線程單元硬件和各用戶線程之間映射的情況, 至少對于一個實施例而言,用戶可以直接控制這一映射并且可以直接操縱與用戶線 程執(zhí)行相關(guān)聯(lián)的控制和狀態(tài)傳輸。用戶線程控制指令可以允許對多線程單元進行 OS透明的控制和狀態(tài)傳輸處理。
對于至少一個實施例而言,用戶線程是經(jīng)由用戶指令生成的,或者是調(diào)用軟 件庫或用于生成OS不知道的用戶線程的其他OS獨立的機制的"原語(primitive)" 生成的。例如,用戶線程可以響應(yīng)于用戶級軟件庫調(diào)用而生成。對用戶級用戶線程 指令的進一步討論可以在題為"A Mechanism For Instructions Set-Based Thread Execution on a Plurality of Instruction Sequencers"的未決美國專禾U申i青U.S. Pat. Ser. No._ (律師案巻號42390.P19770)中找到。
在此也可交換地稱為"排序器"的線程單元可以是能夠執(zhí)行線程或用戶線程
的任何物理或邏輯單元。它可以包括為給定線程或用戶線程確定要執(zhí)行的下一個指
令的下一指令指針邏輯。例如,圖2中示出的OS線程125可以在一個排序器(未 示出)上執(zhí)行,而每個活動的用戶線程130至136可以在其他排序器(也未示出) 上執(zhí)行。
現(xiàn)在參考圖3進一步地討論圖2。圖2和圖3示出了用戶級多線程環(huán)境的至少 一個實施例。對于這一實施例而言,在OS隔離的排序器360上運行的代碼共享執(zhí) 行環(huán)境,而該執(zhí)行環(huán)境是由OS創(chuàng)建以便在相關(guān)聯(lián)的OS可見的排序器370上運行 線程T。對于這一環(huán)境的至少一個實施例而言,在OS隔離的排序器360上運行的 代碼不能直接訪問OS服務(wù)。對于諸如系統(tǒng)呼叫和特定異常之類的系統(tǒng)級事件而言, 代理可以允許OS不可見的用戶線程接收來自操作系統(tǒng)140的用于這些事件的服 務(wù)。
這些服務(wù)至少在一個實施例中是由代理機制提供的。也就是說,多用戶線程 系統(tǒng)可以支持OS透明的代理機制,從而允許在OS隔離的排序器上的事件可由該 操作系統(tǒng)處理。
圖3是由主線程T執(zhí)行的代理執(zhí)行的流程圖,用以完成對與該主線程相關(guān)聯(lián) 的用戶線程的由OS提供的服務(wù)。該用戶線程可以在一個或多個隔離排序器360的 任何一個上執(zhí)行。在此使用的術(shù)語代理執(zhí)行指的是排序器間用戶線程遷移——從隔 離的排序器到OS可見的排序器的控制和狀態(tài)信息的傳輸,以使得OS可見的排序 器可以觸發(fā)操作系統(tǒng)代表該隔離的排序器提供服務(wù)。
代理執(zhí)行因此是這樣一種途徑,OS可見的排序器通過它可以獲得操作系統(tǒng)的 注意,從而為隔離的排序器上的用戶線程提供受OS支持的服務(wù)??梢岳么韴?zhí) 行向包括不對稱排序器的系統(tǒng)上的應(yīng)用程序設(shè)計人員呈現(xiàn)體系結(jié)構(gòu)對稱的假象。
圖3示出了在一個或多個OS隔離的排序器360之一期望受OS支持的服務(wù)(諸 如,獲取對同步對象的鎖定或者為結(jié)構(gòu)化異常處理注冊回調(diào)函數(shù))的任何時刻,將 請求365發(fā)送給OS可見的排序器370上的恰當線程。
恰當?shù)腛S可見的排序器370是運行線程T的排序器,它的存儲器邏輯視圖 由該請求用戶線程共享。線程T可以在OS可見的排序器370上執(zhí)行302,并且可 能會在接收到代理(proxy)請求365時被中斷。OS可見370排序器可以立刻處理 該請求,也可以將該請求記入日志以供隨后處理。當該請求由OS可見的排序器370 處理時,排序器370可以代表在該請求排序器360上運行的用戶線程來請求306 OS 服務(wù)。
排序器370隨后可以重新開始執(zhí)行框302處的線程T指令,直到在框308處 該線程終止(或者直到它被另一個代理請求中斷)。
圖3中示出的代理方法300于是可用來在期望特定OS服務(wù)時為隔離的排序器 360生成從隔離的排序器360到OS可見的排序器370的控制異步傳輸。
OS服務(wù)可由在OS可見的排序器370上運行的線程T代表隔離的排序器360 來請求,使得該OS可見的排序器370能夠得到操作系統(tǒng)的注意,從而提供已經(jīng)由 隔離的排序器360請求的服務(wù)。這樣該代理機制就允許OS可見的排序器370模仿 (impersonate)用戶線程,以得到操作系統(tǒng)的注意,從而獲得該用戶線程期望的服 務(wù)。
代理方法300可以由任何數(shù)量的方式實現(xiàn)。例如,這一方法300可以在隔離 的排序器360嘗試在OS隔離的排序器上執(zhí)行諸如系統(tǒng)調(diào)用的特許指令時被隱式地 調(diào)用。嘗試的系統(tǒng)調(diào)用可能會引起異常的產(chǎn)生。異常處理程序可以保存該用戶線程 狀態(tài)并生成送至OS隔離的排序器370的請求365信號。如上所述,該OS隔離的 排序器370可以經(jīng)由代理執(zhí)行立刻服務(wù)該異常,也可以將該異常記入日志并延遲服 務(wù)。在任一種情況下,排序器370都會在獲得該用戶線程的狀態(tài)并調(diào)用操作系統(tǒng)以 獲得期望服務(wù)之前保存它自身的狀態(tài)。
應(yīng)該注意到能夠執(zhí)行在此公開的技術(shù)的實施例的系統(tǒng)的排序器沒有必要是對 稱的。排序器可以在任何方式上都有所不同,甚至包括那些會影響計算質(zhì)量的方面。 例如,排序器可以依據(jù)功耗、計算性能速度、功能特征等而有所不同。
例如在對一個實施例而言,排序器可以在功能上有所不同。在圖2和圖3中 示出的功能不對稱的示例顯示了至少一個排序器370對OS可見(例如,可參見圖 2的140),并且因此能夠執(zhí)行"環(huán)0"操作,諸如執(zhí)行系統(tǒng)調(diào)用、服務(wù)頁錯誤、 注冊回調(diào)函數(shù)等等。另一方面, 一個或多個其他排序器360可以與OS相隔離,并 因此無法執(zhí)行環(huán)0操作。然而這也只是功能不對稱的一個示例。多排序器系統(tǒng)的各 排序器還可以在任何其他的方式上有所不同,諸如尺寸、字和/或數(shù)據(jù)路徑大小、 拓撲、存儲器、功耗、功能單元的數(shù)量、通信體系結(jié)構(gòu)(多點總線相對于點對點互 連),或者與功能、性能、覆蓋區(qū)有關(guān)的任何其他度量。
作為扼要重述,圖3這樣示出了包括代理機制300的用戶級多線程環(huán)境,以 使得OS可見的排序器370可以為在隔離的排序器360上執(zhí)行的用戶線程調(diào)用操作 系統(tǒng)服務(wù)。該操作系統(tǒng)服務(wù)的一種特定類型包括獲取在OS提供的同步對象上的鎖 定。該操作系統(tǒng)服務(wù)的另一個示例可以包括對回調(diào)函數(shù)的注冊。
代理項(surrogate)線程
為了替OS不可見的用戶線程調(diào)用這些和其他操作系統(tǒng)服務(wù),可以使用代理項 線程。代理項線程是由主線程創(chuàng)建的OS可見的進程,在用戶線程期望OS服務(wù)時 用作用戶線程的服務(wù)代理程序(agent)。代理項線程在服務(wù)涉及有可能遭受多用 戶線程爭用的線程特定資源時對處理OS相關(guān)的服務(wù)特別有效。
圖4是示出了用于支持代理項線程(諸如代理項線程402、 404、 406和408) 的多排序器系統(tǒng)的常規(guī)并行編程方法的框圖。(在圖2和圖4中類似的元件帶有類 似的編號。)代理項線程402至408可以由應(yīng)用程序-編寫器創(chuàng)建以處理特定的異 常、系統(tǒng)調(diào)用、回調(diào)注冊以及代表用戶線程的其他代理服務(wù)。對于至少一個實施例 而言,應(yīng)用程序設(shè)計人員可以在與用戶線程被初始化以共享該主線程程序的執(zhí)行環(huán) 境相同的時刻經(jīng)由主線程程序中的指令推選用以生成代理項線程。
圖4示出了對OS 140可見的代理項線程402至408 (也就是說,它們在OS 可見的排序器上運行)。因此它們可以被OS 140調(diào)度運行。
圖5是示出了利用代理項線程為用戶線程提供代理執(zhí)行的流程圖。圖5示出 了當在隔離的排序器560上的用戶線程期望OS (參見圖2中的140)的服務(wù)時將 代理請求565遞送給OS可見的排序器570的過程。與該用戶線程相關(guān)聯(lián)的主線程 T可以在OS可見的排序器570上執(zhí)行502直到其被請求565中斷。如果接收到這 一請求,線程T就執(zhí)行框506。
圖5在框506處示出了線程T將該事件記入日志。并非執(zhí)行代理執(zhí)行本身的 這一做法,主線程代替地喚醒506與該請求用戶線程相關(guān)聯(lián)的代理項線程。
對于至少一個實施例而言,代理項線程在大多數(shù)時間保持在"等待"狀態(tài)。 諸如圖5所示ST的代理項線程在由相關(guān)聯(lián)的用戶線程請求特定OS服務(wù)時,可由 主線程T調(diào)用507而進入活動狀態(tài)("被喚醒")以執(zhí)行508代理執(zhí)行。當代理 項線程ST已經(jīng)完成其代理執(zhí)行508時,它就重新進入等待狀態(tài)。
因此,代理項線程ST可用于執(zhí)行代理執(zhí)行以代表OS不可見的用戶線程調(diào)用 操作系統(tǒng)服務(wù)。代理項線程ST允許該用戶線程以一種對該OS透明的方式來接收 OS服務(wù),即該OS不知道這些用戶線程。以此方式使用代理項線程對允許OS不 可見的用戶線程訪問特定類型的OS服務(wù)特別有用。也就是說,可以利用代理項線 程使得各用戶線程能夠訪問調(diào)用了單個每線程資源的任何OS服務(wù),而該單個每線 程資源可能會遭受多用戶線程爭用。使用代理項線程以使得各用戶線程能夠訪問遭 受多用戶線程爭用的OS服務(wù)的兩個具體示例包括使用代理項線程用于同步服務(wù)以
及用于結(jié)構(gòu)化異常處理。這兩個具體示例將在以下詳細討論。然而,這些示例不應(yīng) 被理解為限制性的。在此討論的代理項線程技術(shù)可用于透明地允許用戶線程訪問涉 及每線程資源的任何OS訪問,而上述每線程資源可能會遭受多用戶線程爭用。 代理項線程用于同步鎖定的代理執(zhí)行
圖6是闡明一種死鎖類型的說明性示例的時序圖,其中該死鎖在不對稱多排 序器系統(tǒng)中可以通過使用代理項線程而避免。此類死鎖會作為OS提供的同步對象 的用戶線程使用的結(jié)果而發(fā)生。圖6所示的死鎖場景與線程嘗試獲取已經(jīng)從代碼關(guān) 鍵部分內(nèi)部保留的鎖定時可能發(fā)生的死鎖場景相類似。
圖6中示出的示例假設(shè)多排序器系統(tǒng)的各排序器760a、 760b和770之間不對 稱。圖6示出了兩個隔離的排序器760a和760b,它們各自執(zhí)行用戶線程指令流Sl 和S2。每個用戶線程Sl和S2都與同一個線程T相關(guān)聯(lián)。圖6示出了在排序器770 上運行并對操作系統(tǒng)780可見的線程T。
圖6在時刻tl示出了第一隔離的排序器760a嘗試做出系統(tǒng)調(diào)用以獲得信號量 740 (或者任何其他類型的OS提供的同步對象)。為了圖6所示的示例,假設(shè)信 號量710在時刻tl至t3沒有被鎖,因此是可用的。
作為在時刻tl執(zhí)行系統(tǒng)調(diào)用的結(jié)果,隔離的排序器760a經(jīng)歷一個異常。也就 是說,因為排序器760a是與操作系統(tǒng)780相隔離的,所以它沒有被許可執(zhí)行請求 操作系統(tǒng)780服務(wù)的諸如系統(tǒng)調(diào)用的指令。為了處理該異常,排序器760a發(fā)送一 信號給OS可見的排序器770,并藉此在時刻t2觸發(fā)了代理方法。圖6示出了在接 收到觸發(fā)信號的時刻,OS可見的核770運行線程T。
在時刻t2生成的觸發(fā)被發(fā)送給OS可見的排序器770并且觸發(fā)OS可見的排序 器770上的代理方法的執(zhí)行,從而中斷線程T的執(zhí)行。如上結(jié)合圖5所述,該代 理方法可以引起OS可見的排序器770保存其自身的狀態(tài),復制該用戶線程狀態(tài), 并在隨后引起該OS可見的排序器770模仿用戶線程Sl來執(zhí)行系統(tǒng)調(diào)用的代理執(zhí) 行。
圖6在時刻3示出了 OS可見的排序器770代理執(zhí)行請求鎖定信息量740的系 統(tǒng)調(diào)用。因為如上所述為了該示例假設(shè)信息量740可用,所以圖6就示出了OS可 見的排序器770在時刻t4獲取了信息量740上的鎖定。
作為獲取鎖定的結(jié)果,由OS可見的排序器770模仿的該系統(tǒng)調(diào)用在時刻t4 之后完成。代理方法隨后引起OS可見的排序器770恢復各狀態(tài)并使得隔離的排序 器760a和OS可見的排序器770都可重新開始執(zhí)行它們各自的指令流(分別為Sl
和T)。對于至少一個實施例而言,假設(shè)己經(jīng)獲得了信息量740上的鎖定,用戶線 程Sl在這一時刻開始執(zhí)行代碼的關(guān)鍵部分。
圖6示出了在時刻t5在該示例中的另一個隔離的排序器760b可能也嘗試獲取 同一信息量740上的鎖定,而第一隔離的排序器760a仍在執(zhí)行關(guān)鍵部分并且尚未 釋放該信息量740上的鎖定。
如上連同時刻t2所述,第二隔離的排序器760b嘗試執(zhí)行系統(tǒng)調(diào)用以獲得信息 量740會在時刻t6引起異常和觸發(fā)該代理的異常機制。
響應(yīng)于時刻t6發(fā)送的觸發(fā),OS可見的排序器770可以如上連同時刻t3所述 執(zhí)行代理執(zhí)行,從而為隔離的排序器760b模仿該系統(tǒng)調(diào)用。
圖6示出了當OS可見的排序器770嘗試在信息量740上固定第二把鎖時,會 因為排序器770己經(jīng)保存了對同一信息量740的鎖定而在時刻t8出現(xiàn)死鎖。
因此,圖6示出了在上述結(jié)合圖3討論的代理方法300的各實施例用于為所 有用戶線程模仿所有系統(tǒng)調(diào)用的情況下可能會遇到的示例性死鎖情形。盡管如此, 但有時候也期望許可應(yīng)用程序設(shè)計人員編寫利用OS提供的同步對象的多用戶線程 代碼和/或期望其利用第三方庫,而該第三方庫則利用了 OS提供的同步對象。
圖7示出了如何利用一個或多個"代理項線程"來避免圖6中示例所示的死 鎖情形的一個示例的時序圖。同樣地,圖7中示出的示例假設(shè)多排序器系統(tǒng)的各排 序器860a、 860b和870之間不對稱。圖7示出了兩個隔離的排序器860a和860b, 它們各自執(zhí)行用戶線程指令流Sl和S2。每個用戶線程Sl和S2都與同一個線程T 相關(guān)聯(lián)。圖7示出了在排序器870上運行并對操作系統(tǒng)880可見的線程T。圖7還 示出了兩個代理項線程ST1和ST2。對于至少一個實施例而言,每個代理項線程 ST1和ST2都與各自不同的用戶線程(分別是S1和S2)相關(guān)聯(lián)。
代理項線程在用戶線程期望OS服務(wù)時用作該用戶線程的服務(wù)代理程序。代理 項線程可以響應(yīng)于由應(yīng)用程序設(shè)計人員編寫的代碼而被創(chuàng)建;代理項線程可以在 OS可見的排序器上運行并且可由OS調(diào)度運行。該代理項線程可由應(yīng)用程序設(shè)計 人員用來處理來自用戶線程的異常和系統(tǒng)調(diào)用。
因此,如上所述,代理項線程在大多數(shù)時間不活動并且可以被"喚醒"來為 用戶線程執(zhí)行有關(guān)特定系統(tǒng)級事件(例如,系統(tǒng)故障、系統(tǒng)調(diào)用等)的代理執(zhí)行。 對于圖7中所示的實施例而言,假設(shè)應(yīng)用程序設(shè)計人員將為每個隔離的排序器(諸 如,860a和860b)啟動一個代理項線程,它被初始化以執(zhí)行與一具體主線程(諸 如,線程T)相關(guān)聯(lián)的用戶線程指令流。
圖7在時刻tl示出了線程T指令流中的指令在OS可見的排序器870上執(zhí)行 以創(chuàng)建一個或多個代理項線程(ST1和ST2)。每個代理項線程ST1和ST2都可 被置于等待狀態(tài),直到其被觸發(fā)以便為了模仿相關(guān)聯(lián)用戶線程(分別是S1和S2) 的指令而執(zhí)行代理執(zhí)行。
在圖7所示的時刻t2和t3處表示的動作基本上與上述連同圖6的時刻tl和t2 處表示的動作相對應(yīng)由隔離的排序器860a嘗試系統(tǒng)調(diào)用,并得到送至OS可見 的排序器870的異常和觸發(fā)。
當OS可見的排序器870接收到有關(guān)代理執(zhí)行的觸發(fā)時,它并不直接提供代理 執(zhí)行模仿(參見上述連同圖6的t3的討論)。相反在時刻t4, OS可見的排序器 870喚醒與生成該觸發(fā)的用戶線程(Sl)相關(guān)聯(lián)的代理項線程ST1,從而讓代理項 線程ST1為該用戶線程Sl執(zhí)行代理執(zhí)行。
響應(yīng)于時刻t4發(fā)出的喚醒信號,代理項線程ST1進入活動狀態(tài)。代理項線程 ST1在圖7中示出為時間段"A"的時間段內(nèi)保持在活動狀態(tài)。
在時刻t5,代理項線程ST1執(zhí)行代理執(zhí)行以模仿用戶線程Sl和TO執(zhí)行系統(tǒng) 調(diào)用,從而請求信號量840上的鎖定。同樣為了圖7所示的例子,假定信號量840 當前未被鎖定并因此可用。因此,圖7示出了代理項線程STl在時刻t6獲取信號 量840上的鎖定。
作為獲取鎖定的結(jié)果,由OS可見的排序器870模仿的系統(tǒng)調(diào)用在時刻t6之 后完成。如上結(jié)合圖5中的框508所述,代理方法隨后引起OS可見的排序器870 恢復各狀態(tài)并且引起隔離的排序器860a重新開始880用戶線程Sl的執(zhí)行。
對于至少一個實施例而言,假設(shè)已經(jīng)獲取信號量840上的鎖定,用戶線程S1 此刻開始執(zhí)行代碼的關(guān)鍵部分。在時刻t6完成模仿之后,代理項線程ST1在時刻 t7重新進入等待狀態(tài),以等待將會觸發(fā)用于用戶線程Sl的代理執(zhí)行的下一事件。
對于圖7所示的示例而言,另一個隔離的排序器860b在時刻t嘗試獲取同一 信號量840上的鎖定,而第一隔離的排序器860a此時仍在執(zhí)行關(guān)鍵部分并且尚未 釋放信號量840上的鎖定。
同樣地,第二隔離的排序器860b嘗試執(zhí)行系統(tǒng)調(diào)用以獲得信息量840會在時 刻t9引起異常并觸發(fā)一代理執(zhí)行方法。圖7示出了并非執(zhí)行代理執(zhí)行本身,OS可 見的排序器870上的主線程T代替地在時刻t10喚醒與用戶線程(S2)相關(guān)聯(lián)的代 理項線程(ST2),而該用戶線程S2在時刻t9生成觸發(fā)。
代理項線程ST2隨后代表用戶線程S2在時刻tll模仿系統(tǒng)調(diào)用。盡管如此,
操作系統(tǒng)880在時刻t12阻止系統(tǒng)調(diào)用,因為另一個線程ST1仍然保有信號量840 上的鎖定。因此,OS 880將不會調(diào)度代理項線程ST2執(zhí)行直到第一代理項線程ST1 已經(jīng)釋放信號量840上的鎖定。處理在圖8的時刻t13處繼續(xù)。
圖8是進一步示出在圖7內(nèi)開始的"代理項線程"代理執(zhí)行的示例的時序圖。 圖8示出了發(fā)生在圖7所示時刻U2之后的時刻t13。在這一時刻tl3,用戶線程Sl 已經(jīng)完成了關(guān)鍵部分的執(zhí)行,并且已經(jīng)準備好釋放信號量840上的鎖定。因此圖9 示出了在tl3時刻用戶線程S1嘗試執(zhí)行系統(tǒng)調(diào)用以釋放該鎖定。如上結(jié)合圖8所 述,其上正執(zhí)行用戶線程S1的隔離的排序器860a沒有被許可執(zhí)行系統(tǒng)調(diào)用。在時 刻tl3對執(zhí)行系統(tǒng)調(diào)用的嘗試于是會引發(fā)異常。而在時刻tl4,將觸發(fā)信號從隔離 的排序器860a發(fā)送至OS可見的排序器870以請求代理執(zhí)行系統(tǒng)調(diào)用。
圖8在時刻tl5示出了主線程T喚醒與用戶線程(Sl)相關(guān)聯(lián)的代理項線程 ST1,該用戶線程Sl生成了該觸發(fā)信號。在時刻U6,代理項線程ST1代表用戶線 程S1執(zhí)行系統(tǒng)調(diào)用,從而釋放信號量840上的鎖定。在時刻tl7, OS釋放信號量 840上的鎖定作為代理項線程ST1執(zhí)行該系統(tǒng)調(diào)用的結(jié)果。在該系統(tǒng)調(diào)用的代理執(zhí) 行已經(jīng)完成時,代理項線程ST1就在時刻t18重新進入等待狀態(tài)。
在時刻t19, OS調(diào)度代理項線程ST2以供執(zhí)行。代理項線程ST2在被執(zhí)行時 會在時刻t20執(zhí)行系統(tǒng)調(diào)用以代表隔離的排序器860b上的用戶線程S2獲取信號量 840上的鎖定。圖8示出了在時刻t21鎖定被獲取。
在代理項線程ST2己經(jīng)代表用戶線程S2在時刻t21獲取該鎖定之后,代理執(zhí) 行完成。因此,代理項線程ST2在時刻t22重新進入等待狀態(tài)并且該用戶線程S2 指令流的執(zhí)行在時刻t23處重新開始。第二隔離的排序器860現(xiàn)在能夠執(zhí)行該關(guān)鍵 部分并且經(jīng)由代理項線程ST1和ST2的使用就己經(jīng)避免了圖6所示的死鎖情形。 因此,在圖7和圖8中闡明的說明性示例顯示了 OS不可見的用戶線程(諸如Sl 和S2)可以冒充代理項線程,以使得這些用戶線程可以使用OS提供的同步對象, 同時避免在單線程執(zhí)行用于多個用戶線程的代理執(zhí)行的情況下可能發(fā)生的死鎖。
雖然圖7和圖8以及相關(guān)聯(lián)的上述討論僅聚焦于一個示出了使用代理項線程 以管理多個用戶線程間的代理執(zhí)行的示例,但是這些說明性的示例不應(yīng)被理解為限 制性的。
對于可選實施例而言,可以利用代理項線程在支持在主線程及其用戶線程間 使用OS提供的同步對象的同時將死鎖的可能性降到最小。對于這一實施例而言, 代理項線程不僅僅被調(diào)用以便代表用戶線程執(zhí)行系統(tǒng)調(diào)用。而是每當進入和離開在
隔離的排序器上執(zhí)行的代碼關(guān)鍵部分時就調(diào)用該代理項線程。對于這一實施例而 言,該代理項線程代理代表其相關(guān)聯(lián)的隔離的排序器執(zhí)行關(guān)鍵代碼的整個部分,而 不是簡單地為系統(tǒng)調(diào)用模仿該用戶線程。
代理項線程用于結(jié)構(gòu)化異常處理的代理執(zhí)行
現(xiàn)對圖9做出參考,圖9是示出了多用戶線程環(huán)境中的結(jié)構(gòu)化異常處理機制 1010的至少一個實施例的框圖。該多用戶線程環(huán)境包括一個或多個隔離的排序器 Seql、 Seq2以及一個或多個OS可見的排序器1030.
應(yīng)用程序設(shè)計人員可以利用代碼中的結(jié)構(gòu)化異常處理來提供對會在用戶模式 下執(zhí)行代碼時發(fā)生的特定異常的用戶提供處理,而不是依賴于操作系統(tǒng)1020來處 理這些異常。更具體地,以下圖9的討論聚焦于對于在執(zhí)行一個或多個用戶線程 Sl、 S2期間出現(xiàn)的異常所進行的結(jié)構(gòu)化異常處理。
對于圖9所示的樣本實施例,每個隔離的排序器Seql、 Seq2都已經(jīng)被初始化, 從而能夠執(zhí)行與一線程相關(guān)聯(lián)的用戶線程(例如,S1和S2)。圖9所示的例子顯 示了兩個用戶線程Sl和S2,它們已經(jīng)由在OS可見的排序器1030之一上運行的 線程T生成。用戶線程Sl和S2已經(jīng)被調(diào)度分別在隔離的排序器Seql和Seq2上 執(zhí)行。
通常為了調(diào)用結(jié)構(gòu)化異常處理,應(yīng)用程序設(shè)計人員可以在用于向一特定異常 的OS 1020注冊回調(diào)函數(shù)的代碼中包含一些指令。而OS 1020則在其處于用戶模 式執(zhí)行代碼期間遇到該特定異常時執(zhí)行該回調(diào),這樣就允許用戶模式應(yīng)用程序自己 來處理在執(zhí)行該應(yīng)用程序時發(fā)生的異常。
對于至少一個實施例而言,機制IOIO可以包括一個或多個被稱為線程環(huán)境塊 ("TEB") 1040的數(shù)據(jù)結(jié)構(gòu)。操作系統(tǒng)1020可以為每個線程分配指定線程的TEB 1040。該TEB 1040的一個字段可以是指向一個或多個異常注冊記錄1050的指針。 異常注冊記錄可以是單個記錄,或者可以是多個記錄1055a、 1055b…1055n的結(jié)構(gòu) (表、數(shù)組、鏈接列表)。對于至少一個實施例而言,異常注冊記錄1050是記錄 的鏈接列表,每個記錄都指向一個用戶級異常處理所期望的用于不同異常的異常處 理程序例程。
期望調(diào)用有關(guān)一線程的結(jié)構(gòu)化異常處理的應(yīng)用程序設(shè)計人員可以通過如下方 法來注冊一回調(diào)處理程序1)將信息置入該線程的TEB 1040以使得該TEB 1040 的適當字段1045指向該注冊記錄1050,和/或2)修訂該注冊記錄1050以指示包 括該異常處理代碼的回調(diào)處理程序。此過程被稱為回調(diào)函數(shù)的"注冊(registration)"。
取決于優(yōu)選的設(shè)計考慮,可以向鏈接列表1060的開頭或結(jié)尾添加新的注冊記 錄。對于向列表1060的結(jié)尾添加新注冊記錄的實現(xiàn)而言,注冊的第一步驟可能只 需要執(zhí)行一次。也就是說,在已經(jīng)為一線程注冊第一回調(diào)函數(shù)之后,就沒有必要重 復注冊該第一步驟。
然而對于至少一個其他實施例而言,新的注冊記錄被添加到鏈接列表的開頭。 在此情況下,"下一字段"1045指向最近添加的在前注冊記錄。對這一實施例而 言,TEB 1040在每一次添加注冊記錄時被修訂,以指向新的記錄。在此討論的各 示例假定為后一種方法,然而本領(lǐng)域普通技術(shù)人員將會認識到在此討論的機制和方 法可以執(zhí)行用于任一種注冊方法。
圖9中示出的結(jié)構(gòu)化異常處理機制1010于是就是一種許可回調(diào)處理例程注冊 的受OS支持的動態(tài)機制,要被調(diào)用的上述例程將控制從操作系統(tǒng)1020傳送至用 戶級異常處理程序以處理某些指定的用戶模式異常。
從圖9中可見,如果一個以上用戶線程(Sl、 S2)嘗試注冊回調(diào)處理程序就 可能出現(xiàn)對單個指定線程的TEB 1040的爭用。 一個或多個用戶線程Sl和S2可以 與相關(guān)聯(lián)的主OS可見的進程T并發(fā)運行。因此,如果用戶線程嘗試寫入TEB 1040 或者嘗試修改已經(jīng)由主線程(T)或另一用戶線程修改的異常記錄1050,則會出現(xiàn) 訛誤。使用代理項線程可以減輕這種爭用和訛誤的發(fā)生。
圖10是示出了結(jié)構(gòu)化異常處理機制1100的至少一個實施例的框圖,其中該 結(jié)構(gòu)化異常處理機制1100利用代理項線程以支持不對稱多用戶線程環(huán)境中的結(jié)構(gòu)
化異常處理。圖o示出了代理項線程可以被結(jié)構(gòu)化異常處理期望的任何用戶線程
所利用,以避免以上結(jié)合圖9所述的爭用。
圖10示出了可以為結(jié)構(gòu)化異常處理期望的每個用戶線程(分別為Sl、 S2)生 成的代理項線程(ST1、 ST2)。對于至少一個實施例而言,代理項線程(ST1、 ST2)可以響應(yīng)于用于主線程T的代碼中的用戶級指令而被生成。該代理項線程例 如可以在初始化對應(yīng)用戶線程時生成。
代理項線程S1、 S2對操作系統(tǒng)1020可見。因此,操作系統(tǒng)為主線程(諸如, 線程T)分配TEB 1040,也為每個代理項線程分配TEB 1040。圖10示出了己被 操作系統(tǒng)1020分配給主線程T的TEB (TEB(T)) 1040a。此外,圖10還示出了已被 操作系統(tǒng)1020分配給兩個代理項線程(分別是ST1和ST2)中的每一個的TEB (TEB(STl)) 1140b和(TEB(ST2)) 1040c。
類似于以上連同圖7和圖8討論的方法,每個代理項線程ST1和ST2代表被 指定的用戶線程(分別是Sl和S2)動作。每個代理項線程可以在其相關(guān)聯(lián)用戶線 程嘗試執(zhí)行注冊回調(diào)處理程序的寫入指令的任何時刻從等待狀態(tài)中醒來。代理項線 程代替地執(zhí)行該寫入指令本身,因此該用戶線程的嘗試寫入操作向一個或多個OS 可見的結(jié)構(gòu)執(zhí)行,上述這一個或多個OS可見的結(jié)構(gòu)(例如,TEB 1040和異常記 錄105t))是經(jīng)由代理項線程被分配給該用戶線程的。
TEB 1040于是被分配給每個用戶線程(經(jīng)由其代理項線程)以及主線程T。 由任何用戶線程或線程做出的注冊回調(diào)處理程序的嘗試應(yīng)該被寫入適當?shù)腡EB。 寄存器1120可用于指向當前TEB 1040。對于至少一個實施例而言,寄存器1120 可以被實現(xiàn)為段寄存器。
于是可以利用機制1100來避免在主線程和/或一個或多個其相關(guān)聯(lián)用戶線程 嘗試向同一TEB 1040為同一異常注冊不同的回調(diào)處理程序的情況下會出現(xiàn)的潛在 訛誤。代替地,通過為每個用戶線程(經(jīng)由代理項線程)并為主線程分配一 TEB 1040,就可以避免這一爭用和訛誤。
圖11是示出了使用代理項線程以避免多用戶線程爭用/訛誤并還提供一用戶 線程可以在用戶線程執(zhí)行期間接收用于結(jié)構(gòu)化異常處理的OS服務(wù)的至少一個實施 例的流程圖。當圖11中示出的示例舉例說明兩用戶線程間的潛在爭用時,本領(lǐng)域 普通技術(shù)人員將會認識到在圖11中示出的本方法也可用于其他場景,諸如用來避 免主線程和用戶線程之間爭用的場景或者用來避免大量用戶線程間爭用的場景。
圖11是示出了如何利用一個或多個"代理項線程"來避免由于用于結(jié)構(gòu)化異 常處理所用的對指定線程數(shù)據(jù)結(jié)構(gòu)的OS (見圖10中的1020)線程爭用引起訛誤 的時序圖。圖11中示出的示例假定多排序器系統(tǒng)中各排序器1260a、 1260b和1270 間不對稱。圖11示出了兩個隔離的排序器1260a和1260b,它們分別執(zhí)行用戶線 程指令流S1和S2。每個用戶線程S1和S2都與線程T相關(guān)聯(lián)。圖ll中示出了線 程T作為在對操作系統(tǒng)1280可見的排序器1270上運行的線程。
圖11還示出了兩個代理項線程ST1和ST2。對于至少一個實施例而言,每個 代理項線程ST1和ST2都與不同的用戶線程(分別是Sl和S2)相關(guān)聯(lián)。對于圖12 中所示的示例而言,假定應(yīng)用程序設(shè)計人員將為每個隔離的排序器(諸如,1260a 和1260b)起始一個代理項線程,上述隔離的排序器被初始化以執(zhí)行與一具體主線 程(諸如,線程T)相關(guān)聯(lián)的用戶線程指令流。
圖ll示出了在時刻tO執(zhí)行初始化以便對期望注冊回調(diào)處理程序的用戶線程的
代理執(zhí)行。對于至少一個實施例而言,在時刻tO執(zhí)行的初始化包括如下修改與
FS寄存器1120相關(guān)聯(lián)的值以使得由用戶線程對該FS寄存器1120的任何訪問嘗試
都會生成一錯誤。對于至少一個實施例而言,執(zhí)行該初始化以"捉住"由用戶線程
對TEB 1040的任何訪問嘗試(當前TEB 1040的基地址被保持在FS寄存器1120 中)。
在時刻tl,在OS可見的排序器1270上執(zhí)行線程T指令流內(nèi)的各指令以創(chuàng)建 一個或多個代理項線程(ST1、 ST2)。每個代理項線程ST1和ST2都可被置于等 待狀態(tài),直到它被觸發(fā)用來為關(guān)聯(lián)用戶線程(分別是S1和S2)執(zhí)行代理執(zhí)行。
在時刻t2,圖11示出了在隔離的排序器1260a上執(zhí)行的用戶線程Sl嘗試讀 取FS寄存器1120以確定TEB的地址以供回調(diào)處理程序注冊。這一嘗試會導致一 錯誤(參見時刻tO的初始化)。
對于至少一個實施例而言,錯誤處理程序在時刻t3將該錯誤作為一事件發(fā)送 給在OS可見的排序器1270上運行的主線程T。該錯誤至少在一個實施例中可以 作為觸發(fā)用于回調(diào)注冊的代理執(zhí)行的一事件而被發(fā)送。
當OS可見的排序器1270接收到有關(guān)代理執(zhí)行的觸發(fā)時,它并不直接提供代 理執(zhí)行模仿。代替地,OS可見的排序器1270在時刻t4喚醒與生成該觸發(fā)的用戶 線程(Sl)相關(guān)聯(lián)的代理項線程ST1,以使得該用戶線程Sl得以為用戶線程Sl 執(zhí)行代理執(zhí)行。
響應(yīng)于在時刻t4發(fā)出的喚醒信號,代理項線程ST1進入活動狀態(tài)。代理項線 程ST1在圖11中示出為時間段"A"的時間段內(nèi)保持在活動狀態(tài)。
在時刻t5,代理項線程ST1開始執(zhí)行代理執(zhí)行從而為了回調(diào)注冊模仿用戶線 程S1。在該代理執(zhí)行期間,代理項線程ST1嘗試執(zhí)行該指令,從而引發(fā)該錯誤。 因為代理項線程對OS 1280可見,所以通過OS 1280的動作,可以假定FS寄存器 1120在時刻t5指向用于代理項線程STl的TEB(TEB(STl)) 1040b。因此,代理項 線程ST1在時刻t5訪問FS寄存器1120以確定用于回調(diào)注冊的適當TEB 1140。對 于圖11所示的示例而言,代理項線程ST1在時刻t5讀取FS寄存器1120以確定 TEB(ST1) 1140b是用于代理項線程ST1的適當TEB。
引起與該用戶線程有關(guān)錯誤的指令于是就可由代理項線程ST1在時刻t5代理 執(zhí)行。因為當代理項線程ST1讀取FS寄存器1120時該錯誤不會再現(xiàn),所以ST1 可以持續(xù)執(zhí)行代理執(zhí)行以代表用戶線程Sl注冊回調(diào)處理程序。因此,圖11示出 了代理項線程ST1在時刻t6注冊回調(diào)處理程序。作為在時間A內(nèi)出現(xiàn)的代理執(zhí)行
的一部分,代理項線程ST1可以如圖11所示修改TEB(ST1) 1140b,并修改一個或 多個異常記錄(參見圖9和圖10的1050)。
可選地,如果回調(diào)處理程序在前已經(jīng)在其中將新注冊記錄添加至鏈接列表結(jié) 尾的一環(huán)境中對該用戶線程做出注冊,則在ST1的代理項線程可以修改與TEB(ST1) 1140b (參見圖9的1050)相關(guān)聯(lián)的一個或多個異常記錄以代表用戶線程Sl注冊 回調(diào)處理程序,而無需修改TEB 1140。
作為完成該注冊的結(jié)果,可以在時刻t6之后完成OS可見的排序器1270的代 理執(zhí)行。如上連同圖5的框508所述,代理機制隨后恢復各狀態(tài)并且引起隔離的排 序器1260a重新開始1220用戶線程Sl的執(zhí)行。在時刻t6完成模仿之后,代理項 線程STl在時刻t7重新進入等待狀態(tài)以等待將觸發(fā)用于用戶線程Sl代理執(zhí)行的下 一事件。
圖11在時刻t8示出了用戶線程Sl重新開始下一指令的執(zhí)行。出于舉例說明 的目的,圖ll顯示了在時刻t9用戶線程Sl遇到了一種類型的異常,該類型就是 在時刻t6回調(diào)處理程序為其注冊的類型。作為該異常的結(jié)果,就在時刻tlO將一 事件從在隔離的排序器1260a上運行的用戶線程Sl發(fā)送給在OS可見的排序器 1270上運行的主線程T。該事件可以觸發(fā)代理執(zhí)行以請求OS服務(wù)來處理該異常。
在時刻tll,主線程T喚醒代理項線程ST1來由代理執(zhí)行代表用戶線程S1處 理該異常。在時刻tl2,代理項線程可以代表該用戶線程執(zhí)行引起該異常的指令。 以此方式,該異??捎纱眄椌€程ST1再現(xiàn)并且操作系統(tǒng)1280隨后可以服務(wù)該錯 誤。
因此,圖11在時刻tl3示出了操作系統(tǒng)1280開始服務(wù)該異常。OS 1280讀取 有關(guān)該代理項用戶線程的TEB (TEB(ST1), 1040b)以確定回調(diào)處理程序是否已經(jīng)做 出了有關(guān)當前異常類型的注冊。
因為回調(diào)處理程序在前注冊了該異常(參見以上時刻t6的討論),所以O(shè)S 1280 將控制傳送到回調(diào)處理程序1290的起始地址,該地址是用戶線程Sl中的指令地 址。圖11示出了在時刻t14在OS調(diào)用該回調(diào)處理程序代碼1290的情況下該控制 的傳送。
當主線程T在時刻t15在回調(diào)處理程序地址處接收到控制時,該代理執(zhí)行完 成。主線程T于是在回調(diào)處理程序1290起始地址處將控制傳送回的用戶線程S1。 用戶線程Sl于是在時刻t16開始執(zhí)行回調(diào)處理程序。在時刻t15將控制傳送給用 戶線程回調(diào)處理程序1290之后,代理項線程在時刻tl7重新進入等待狀態(tài)。 圖11的前述討論描述了主線程藉此可以引起代理項線程在處理異常期間模仿 一用戶線程。如圖11所示的主線程T為已被該主線程初始化的每個用戶線程生成 代理項線程。圖ll還示出了主線程T可以在該用戶線程并發(fā)執(zhí)行的同時執(zhí)行主線 程指令流的一個或多個指令。主線程T可以接收觸發(fā)信號以指示該用戶線程已經(jīng)
經(jīng)歷異常。該異常例如可以是由與嘗試寫入一結(jié)構(gòu)(諸如,TEB 1040)、注冊有 關(guān)用戶級異常處理的回調(diào)函數(shù)有關(guān)的處理引起。該處理例如可以包括嘗試讀取段寄 存器1120以確定適當?shù)腡EB 1040。響應(yīng)于該信號,主線程可以喚醒該代理項線程, 并且使得該代理項線程在異常處理期間向操作系統(tǒng)模仿該用戶線程。
雖然圖11僅示出了一個用戶線程Sl,但該說明性示例不應(yīng)被理解為限制性 的。對于至少一個實施例而言,主線程T可以初始化多個用戶線程并可由此生成 多個代理項線程。對于至少一個實施例而言,例如主線程T可以為每個被初始化 的用戶線程生成一個代理項線程。以此方式,就可以為與該主線程相關(guān)聯(lián)的每個 OS不可見的用戶線程創(chuàng)建一 OS可見的代理項線程。因此就可生成多個代理項線 程。代理項線程可以在任何時候其相關(guān)聯(lián)用戶線程經(jīng)歷期望操作系統(tǒng)服務(wù)的事件時 被調(diào)用。通過生成多個代理項線程,就可以排除對于某些指定線程資源(諸如, TEB結(jié)構(gòu))的用戶線程爭用。
在此討論的機制和方法的實施例和技術(shù)可以在任何多排序器系統(tǒng)上實現(xiàn),包 括單核SMT系統(tǒng)(例如,參見圖1的310)和多核系統(tǒng)(例如,參見圖1的350)。 如下將結(jié)合圖12進一步討論這些系統(tǒng)。
圖12示出了能夠執(zhí)行所公開技術(shù)的計算系統(tǒng)1300的至少一個實施例。計算 系統(tǒng)1300包括至少一個處理器核1304和存儲器系統(tǒng)1340。存儲器系統(tǒng)1340可以 包括較大但相對較慢的存儲器存儲1302,以及一個或多個較小但相對較快的高速 緩存,諸如指令高速緩存1344和/或數(shù)據(jù)高速緩存1342。存儲器存儲1302可以存 儲用于控制處理器1304操作的指令1310和數(shù)據(jù)1312。
指令1310包括主線程代碼1350。主線程代碼1350可以包括用于初始化一個 或多個OS不可見的用戶線程的指令。主線程代碼1350的初始化指令在由排序器 執(zhí)行時可以使得OS不可見的排序器在共享該主線程的邏輯執(zhí)行環(huán)境的同時可用于 執(zhí)行用戶線程指令流。
主線程代碼1350在至少一個實施例中可以包括用于生成一個或多個代理項線 程的指令。主線程代碼1350還可以包括用于執(zhí)行一個或多個上述方法300、 500 或者結(jié)合圖3、 5、 7、 8或11討論的各機制的一個實施例的指令。 對于至少一個實施例而言,指令1310還可包括為在初始化的排序器上執(zhí)行而
調(diào)度各用戶線程的調(diào)度器例程1360。
存儲器系統(tǒng)1340旨在廣義地表示存儲器,并且可以包括各種形式的存儲器, 諸如硬盤、CD-ROM、隨機存取存儲器(RAM)、動態(tài)隨機存取存儲器(DRAM)、 靜態(tài)隨機存取存儲器(SRAM)、閃存及相關(guān)電路。存儲器系統(tǒng)1340可以存儲由 數(shù)據(jù)信號表示的指令1310和/或數(shù)據(jù)1312,而該數(shù)據(jù)信號可由處理器1304執(zhí)行。 指令1310和/或數(shù)據(jù)1312可以包括用于執(zhí)行在此描述的任意或所有技術(shù)的代碼和/ 或數(shù)據(jù)。
處理器1304可以包括向執(zhí)行核1330供應(yīng)指令信息的前端1320。讀取的指令 信息可以被緩沖在高速緩存225內(nèi)以等待執(zhí)行核1330的執(zhí)行。前端1320可以按程 序順序向執(zhí)行核1330供應(yīng)指令信息。對于至少一個實施例而言,前端1320包括用 以確定要執(zhí)行的下一個指令的讀取/解碼單元322。對于系統(tǒng)1300的至少一個實施 例而言,讀取/解碼單元322可以包括單個下一指令指針和讀取邏輯320。然而在每 個處理器1304都支持多個線程上下文的實施例中,讀取/解碼單元322實現(xiàn)用于每 個支持的線程上下文的各自不同的下一指令指針和讀取邏輯320。在多處理器環(huán)境 中額外下一指令指針和讀取邏輯320的可選特性由圖13中的虛線所指示。
在此討論的各方法的實施例可以用硬件、硬件仿真軟件或其他軟件、固件或 這些實現(xiàn)方法的集合來實現(xiàn)。本發(fā)明的各實施例可被實現(xiàn)于包括至少一個處理器、 數(shù)據(jù)存儲系統(tǒng)(包括易失性和非易失性存儲器和/或存儲元件)、至少一個輸入設(shè) 備和至少一個輸出設(shè)備的可編程系統(tǒng)。出于該應(yīng)用的目的,處理系統(tǒng)包括具有處理 器的任何系統(tǒng),上述處理器例如可以是數(shù)字信號處理器(DSP)、微控制器、專用 集成電路(ASIC)或者微處理器。
可以將程序存儲在可由通用或?qū)S每删幊烫幚硐到y(tǒng)讀取的存儲介質(zhì)或設(shè)備 (諸如硬盤驅(qū)動器、軟盤驅(qū)動器、只讀存儲器(ROM) 、 CD-ROM設(shè)備、閃存設(shè) 備、數(shù)字通用盤(DVD)或其他存儲設(shè)備)上??捎商幚硐到y(tǒng)中的處理器訪問的 這些指令在存儲介質(zhì)或設(shè)備由處理系統(tǒng)讀取以執(zhí)行在此描述的過程時提供配置并 操作該處理系統(tǒng)。還可以考慮將本發(fā)明的實施例實現(xiàn)為配置用于一處理系統(tǒng)的機器 可讀存儲介質(zhì),其中如此配置的該存儲介質(zhì)使得處理系統(tǒng)以特定和預(yù)定的方式運行 以執(zhí)行在此討論的各種功能。
示例的系統(tǒng)1300以基于可從Intel公司購得的Pentium 、 Pentium Pro、 Pentium II、 Pentium III、 Pentium 4以及Itanium⑧和Itanium 2微處理器的處
理系統(tǒng)為典型代表,雖然也可以使用其他的系統(tǒng)(包括具有其他微處理器的個人計 算機(PC)、工程工作站、個人數(shù)字助理或者其他手持設(shè)備、機頂盒等)。對于
一個實施例而言,示例性系統(tǒng)可以執(zhí)行可從Microsoft公司購得的WindowsTM操作 系統(tǒng)的一個版本,雖然也可以使用例如其他的操作系統(tǒng)或圖形用戶界面。
盡管已經(jīng)示出并討論了本發(fā)明的各具體實施例,但本領(lǐng)域的技術(shù)人員應(yīng)該理 解可在不背離所附權(quán)利要求范圍的情況下做出變化和修改。因此,本領(lǐng)域的技術(shù)人 員應(yīng)該認識到能夠做出變化和修改而不背離本發(fā)明的廣義范圍。所附權(quán)利要求包括 在其范圍內(nèi)的所有這些落入本發(fā)明真實范圍的變化和修改。
權(quán)利要求
1.一種方法,包括為對操作系統(tǒng)(“OS”)不可見的用戶線程生成OS可見的代理項線程;在所述用戶線程正并發(fā)執(zhí)行的同時執(zhí)行OS可見的主線程的指令;以及引發(fā)所述代理項線程之一在異常處理期間向所述操作系統(tǒng)模仿所述用戶線程。
2. 如權(quán)利要求l所述的方法,其特征在于,還包括接收信號以指示所述用戶線程已經(jīng)嘗試爭用由所述操作系統(tǒng)管理的指定 線程的資源。
3. 如權(quán)利要求l所述的方法,其特征在于,還包括接收信號以指示所述用戶線程己經(jīng)嘗試獲取在由所述操作系統(tǒng)管理的同 步對象上的鎖定。
4. 如權(quán)利要求l所述的方法,其特征在于,還包括接收信號以指示所述用戶線程已經(jīng)嘗試寫入由所述操作系統(tǒng)保持的用戶 級異常處理結(jié)構(gòu)。
5. 如權(quán)利要求l所述的方法,其特征在于所述生成還包括生成多個代理項線程,對多個OS不可見的用戶線程的每 一個都生成一個代理項線程。
6. 如權(quán)利要求5所述的方法,其特征在于所述執(zhí)行還包括在兩個或多個所述用戶線程正并發(fā)執(zhí)行的同時執(zhí)行所述 OS可見的主線程的所述指令。
7. —種包含具有多個機器可訪問指令的機器可訪問介質(zhì)的物品,其中當所述指令被處理器執(zhí)行時,所述指令能夠用于生成對操作系統(tǒng)("OS")可見的第一線程;在OS不可見的用戶線程正并發(fā)執(zhí)行的同時執(zhí)行主線程的指令;以及 引發(fā)所述第一線程在由所述用戶線程引發(fā)的異常處理期間向所述操作系 統(tǒng)模仿所述用戶線程。
8. 如權(quán)利要求7所述的物品,其特征在于能夠用于引發(fā)的所述指令還包括在由處理器執(zhí)行時能夠響應(yīng)于所述用戶 線程已經(jīng)嘗試爭用由所述操作系統(tǒng)管理的指定線程的資源的指示符而引發(fā)所 述代理項線程模仿所述用戶線程的指令。
9. 如權(quán)利要求7所述的物品,其特征在于能夠用于引發(fā)的所述指令還包括在由處理器執(zhí)行時能夠響應(yīng)于所述用戶 線程已經(jīng)嘗試爭用由所述操作系統(tǒng)提供的服務(wù)的指示符而引發(fā)所述代理項線 程模仿所述用戶線程的指令。
10. 如權(quán)利要求7所述的物品,其特征在于能夠用于引發(fā)的所述指令還包括在由處理器執(zhí)行時能夠響應(yīng)于所述用戶 線程已經(jīng)嘗試獲取在由所述操作系統(tǒng)管理的同步對象上的鎖定的指示符而引 發(fā)所述代理項線程模仿所述用戶線程的指令。
11. 如權(quán)利要求7所述的物品,其特征在于,還包括能夠用于引發(fā)的所述指令還包括在由處理器執(zhí)行時能夠響應(yīng)于所述用戶 線程已經(jīng)嘗試寫入由所述操作系統(tǒng)保持的用戶級異常處理結(jié)構(gòu)的指示符而引 發(fā)所述代理項線程模仿所述用戶線程的指令。
12. 如權(quán)利要求7所述的物品,其特征在于能夠用于生成第一線程的所述指令還包括在由處理器執(zhí)行時能夠用于生 成多個OS可見的代理項線程的指令,對多個OS不可見的用戶線程的每一個 都生成一個代理項線程。
13. 如權(quán)利要求7所述的物品,其特征在于能夠用于引發(fā)所述第一線程模仿所述用戶線程的所述指令還包括某種指 令,所述指令在由處理器執(zhí)行時能夠用于.-保存所述第一線程的狀態(tài);以及將所述用戶線程的所述狀態(tài)復制給所述第一線程。
14. 一種方法,包括在并發(fā)執(zhí)行1)由操作系統(tǒng)控制的主線程的指令和2)隔離的排序器上的 指令期間確定在所述隔離的排序器上的指令已經(jīng)嘗試調(diào)用操作系統(tǒng)服務(wù);以及引發(fā)代理項線程代表所述隔離的排序器調(diào)用所述操作系統(tǒng)服務(wù)。
15. 如權(quán)利要求14所述的方法,其特征在于,所述確定和所述引發(fā)在下述指令的并發(fā)執(zhí)行期間被進一步執(zhí)行3)第二隔離的排序器上的指令。
16. 如權(quán)利要求14所述的方法,其特征在于 所述操作系統(tǒng)服務(wù)還包括同步對象的獲取或釋放。
17. 如權(quán)利要求14所述的方法,其特征在于 所述操作系統(tǒng)服務(wù)還包括用戶級異常處理例程的注冊。
18. 如權(quán)利要求17所述的方法,其特征在于 所述操作系統(tǒng)服務(wù)還包括調(diào)用所述用戶級異常處理例程。
19. 如權(quán)利要求M所述的方法,其特征在于所述確定還包括接收在所述隔離的排序器的所述指令執(zhí)行期間生成的系 統(tǒng)事件。
20. —種包含具有多個機器可訪問指令的機器可訪問介質(zhì)的物品,其中當所述指令被處理器執(zhí)行時,所述指令在并發(fā)執(zhí)行1)由操作系統(tǒng)控制的主線程的指令和2)隔離的排序器上的指令期間,能夠用于確定在所述隔離的排序器上的指令已經(jīng)嘗試調(diào)用操作系統(tǒng)服務(wù);以及 引發(fā)代理項線程代表所述隔離的排序器調(diào)用所述操作系統(tǒng)服務(wù)。
21. 如權(quán)利要求20所述的物品,其特征在于,所述指令還提供某種指令,所述指令能夠用于所述確定和所述引發(fā)在下述指令的并發(fā)執(zhí)行期間被進一步執(zhí)行3)第二隔離的排序器上的指令。
22. 如權(quán)利要求20所述的物品,其特征在于所述操作系統(tǒng)服務(wù)還包括同步對象的獲取或釋放。
23. 如權(quán)利要求20所述的物品,其特征在于所述操作系統(tǒng)服務(wù)還包括用戶級異常處理例程的注冊。
24. 如權(quán)利要求23所述的物品,其特征在于 所述操作系統(tǒng)服務(wù)還包括調(diào)用所述用戶級異常處理例程。
25. 如權(quán)利要求20所述的物品,其特征在于能夠用于所述確定的所述指令還包括能夠用于接收在所述隔離的排序器 的所述指令執(zhí)行期間生成的系統(tǒng)事件的指令。
全文摘要
為與操作系統(tǒng)的查看相隔離的各線程執(zhí)行資源(“排序器”)透明地觸發(fā)操作系統(tǒng)服務(wù)。由該操作系統(tǒng)管理并對其可見的“代理項”線程被用來代表隔離的排序器獲取OS服務(wù)。于是就能夠減輕有關(guān)指定用戶程序的多用戶程序爭用。同時還描述并聲明一些其他的實施例。
文檔編號G06F9/48GK101176066SQ200680016118
公開日2008年5月7日 申請日期2006年5月11日 優(yōu)先權(quán)日2005年5月13日
發(fā)明者B·帕特爾, B·比格比, G·什雅, H·王, J·沈, P·瑟希, R·漢金斯, S·考什克 申請人:英特爾公司