專利名稱:多處理器系統(tǒng)中的高性能隊(duì)列實(shí)現(xiàn)的制作方法
技術(shù)領(lǐng)域:
本公開一般涉及排隊(duì)軟件,更具體來說涉及用于多處理環(huán)境的排 隊(duì)軟件。
背景技術(shù):
從計(jì)算機(jī)行業(yè)最初期起, 一直存在對(duì)提高系統(tǒng)性能以便比以往更 快地運(yùn)行應(yīng)用程序的需求或?qū)υ诳山邮艿臅r(shí)間范圍內(nèi)運(yùn)行能產(chǎn)生結(jié) 果的應(yīng)用程序的需求。用于提高計(jì)算機(jī)系統(tǒng)的性能的一種方法是,使 系統(tǒng)將進(jìn)程或進(jìn)程的一部分(例如線程)彼此并行地在具有多個(gè)處理 器的系統(tǒng)上運(yùn)行。
隊(duì)列是一種用于線程通信和同步的常用數(shù)據(jù)結(jié)構(gòu)。線程可以將數(shù)據(jù)項(xiàng)目置于隊(duì)列中(稱為入列(enqueuing)),并且其他線程可以通過 先進(jìn)先出(FIFO)方式從隊(duì)列取出數(shù)據(jù)項(xiàng)目(稱為出列(dequeuing)), 因此在線程之間傳送數(shù)據(jù),并可以協(xié)調(diào)所涉及的線程的活動(dòng)。例如流 傳輸計(jì)算、分組處理計(jì)算、數(shù)據(jù)流計(jì)算等的多線程應(yīng)用延伸性地采用 隊(duì)列。例如,多線程網(wǎng)絡(luò)應(yīng)用可以4吏一個(gè)線程處理分組凈艮頭,然后經(jīng) 由隊(duì)列將分組傳遞到另一個(gè)線程以進(jìn)行有效載荷處理。
隊(duì)列實(shí)現(xiàn)的主要潛在性能瓶頸包括提供并發(fā)訪問控制,即確保對(duì) 隊(duì)列項(xiàng)的多線程并發(fā)訪問的正確性同時(shí)還保持FIFO特性。在現(xiàn)有的 實(shí)現(xiàn)中,所采用的機(jī)制可能包括1)使用互斥或原子臨界部分(atomic critical section),這通常通過鎖或推測來實(shí)現(xiàn);2)用于加載-修改-存 儲(chǔ)的多個(gè)存儲(chǔ)器訪問原子指令或更具體地說用于多個(gè)存儲(chǔ)器操作的 原子指令,例如原子比較交換或原子交換;或3)線程調(diào)度器協(xié)調(diào), 例如Linux內(nèi)核中的任務(wù)就緒隊(duì)列。遺憾的是,為了保證正確地并發(fā)訪問隊(duì)列,這些機(jī)制的每一種機(jī)制都可能帶來相當(dāng)大的性能懲罰。
圖1是示出結(jié)合了本發(fā)明實(shí)施例的系統(tǒng)的硬件和軟件組件的框圖。
圖2A是根據(jù)本發(fā)明實(shí)施例的隊(duì)列數(shù)據(jù)結(jié)構(gòu)的框圖。
圖2B是根據(jù)本發(fā)明備選實(shí)施例的隊(duì)列數(shù)據(jù)結(jié)構(gòu)的框圖。
圖3A是圖示根據(jù)本發(fā)明實(shí)施例、用于讀取隊(duì)列項(xiàng)的方法的流程圖。
圖3B是圖示根據(jù)本發(fā)明實(shí)施例、用于寫入隊(duì)列項(xiàng)的方法的流程圖。
圖3C是圖示根據(jù)本發(fā)明實(shí)施例、用于讀取緩沖的隊(duì)列項(xiàng)的方法 的流程圖。
圖3D是圖示根據(jù)本發(fā)明實(shí)施例、用于寫入緩沖的隊(duì)列項(xiàng)的方法 的流程圖。
圖4是圖示根據(jù)本發(fā)明實(shí)施例的多個(gè)寫入器單個(gè)讀取器排隊(duì)系統(tǒng) 的軟件組件的框圖。
圖5是圖示根據(jù)本發(fā)明實(shí)施例的單個(gè)寫入器多個(gè)讀取器排隊(duì)系統(tǒng) 的軟件組件的框圖。
圖6是圖示根據(jù)本發(fā)明實(shí)施例的多個(gè)寫入器多個(gè)讀取器排隊(duì)系統(tǒng) 的軟件組件的框圖。
具體實(shí)施例方式
在下文對(duì)本發(fā)明的示范實(shí)施例的詳細(xì)描述中,參考了附圖,這些 附圖構(gòu)成描述的 一部分并且在附圖中以說明形式示出了可以實(shí)施本 發(fā)明主題的特定示范實(shí)施例。對(duì)這些實(shí)施例進(jìn)行了充分詳細(xì)地描述, 從而使本領(lǐng)域技術(shù)人員能夠?qū)嵤┍景l(fā)明的多種實(shí)施例,并且要理解可 以利用其他實(shí)施例,并在不背離本發(fā)明主題范圍的前提下可以進(jìn)行邏 輯、機(jī)械、電子或其他方面的更改。因此,下文的詳細(xì)描述不應(yīng)視為 限制意義。
在這些附圖中,相同的引用號(hào)通篇用于指代多個(gè)附圖中出現(xiàn)的完全相同的組件。信號(hào)和連接可以由相同的引用號(hào)或標(biāo)記來指代,實(shí)際的含義將在描述的上下文中通過其使用予以闡明。
圖1是示出結(jié)合了本發(fā)明實(shí)施例的系統(tǒng)100的硬件和軟件組件的框圖。在一些實(shí)施例中,系統(tǒng)100包括處理單元102、存儲(chǔ)器104、線程106和隊(duì)列108。在一些實(shí)施例中,處理單元102可以是作為多核處理器的一部分的處理引擎。這些類型的體系結(jié)構(gòu)可以稱為多核體系結(jié)構(gòu)。因此,多核處理體系結(jié)構(gòu)在邏輯上是具有多個(gè)獨(dú)立處理引擎(核)的單個(gè)處理器。在備選實(shí)施例中,在電路板上存在多個(gè)處理器的情況中,處理單元102可以是電路板上的各個(gè)處理器。在又一個(gè)備選實(shí)施例中,處理單元102均可以位于作為多處理器板系統(tǒng)的一部分的板上。在一些實(shí)施例中,系統(tǒng)100包括SMP (對(duì)稱多處理)體系結(jié)構(gòu),SMP (對(duì)稱多處理)體系結(jié)構(gòu)使多個(gè)處理單元可用于同時(shí)完成各個(gè)進(jìn)程(多處理)。在SMP中,可以將任何空閑的處理器指定給任何任務(wù),并且可以添加附加的處理單元來提高性能和處理增加的負(fù)栽。而且,處理器102能夠?qū)崿F(xiàn)多線程。多線程提供同時(shí)執(zhí)行程序的若干部分(稱為線程)的能力。
應(yīng)該注意,雖然圖1中圖示了四個(gè)處理單元102,但是本發(fā)明的 任何實(shí)施例都不局限于任何數(shù)量的處理單元102。多種實(shí)施例可以具有更多或更少的處理單元,以及在一些實(shí)施例中,使用十六個(gè)處理單 元。
存儲(chǔ)器104可以是能夠存儲(chǔ)程序和數(shù)據(jù)的任何類型的存儲(chǔ)器。此 類存儲(chǔ)器的示例包括SRAM (靜態(tài)RAM )、 DRAM (動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器)、SDRAM (同步DRAM )、 DDR-SDRAM (雙數(shù)據(jù)速率SDRAM) 或任何其他類型的存儲(chǔ)器。
每個(gè)線程106是能夠獨(dú)立于程序或進(jìn)程的其他線程來執(zhí)行的程序 的一部分。線程106可以在不同處理器102上以并行方式執(zhí)行。在本發(fā)明的多種實(shí)施例中,線程106在一個(gè)或多個(gè)隊(duì)列108中讀取和/或?qū)?br>
入項(xiàng)。圖1中示出四個(gè)線程106.1-106.4,但是,多種實(shí)施例中可以有 更多或更少的線程106。
隊(duì)列108是用于提供對(duì)隊(duì)列中的項(xiàng)進(jìn)行先進(jìn)先出處理的數(shù)據(jù)結(jié) 構(gòu)。換言之,插入到隊(duì)列中的第一個(gè)元素將是從隊(duì)列中移除的第一個(gè) 元素。因此,無論何時(shí),只要添加項(xiàng),則需要移除之前添加的所有項(xiàng) 之后才能移除最近添加的項(xiàng)。圖1中圖示了兩個(gè)隊(duì)列108.1和108.2, 但是多種實(shí)施例中可能有更多或更少的隊(duì)列108。下文參考圖2A-2B 提供有關(guān)本發(fā)明多種實(shí)施例中使用的隊(duì)列數(shù)據(jù)結(jié)構(gòu)的進(jìn)一步細(xì)節(jié)。
圖1圖示其中每個(gè)隊(duì)列108.1和108.2是單個(gè)讀取器單個(gè)寫入器 (single reader single writer SRSW)隊(duì)列的示范實(shí)施例。即,單個(gè)線程 從單獨(dú)隊(duì)列讀取,而單個(gè)線程向單獨(dú)隊(duì)列寫入。在圖1所示的示例中, 線程106.1向隊(duì)列102.1中寫入,而線程106.2從隊(duì)列108.1中讀取。
圖2A是根據(jù)本發(fā)明實(shí)施例的隊(duì)列數(shù)據(jù)結(jié)構(gòu)108的框圖。在一些 實(shí)施例中,隊(duì)列數(shù)據(jù)結(jié)構(gòu)108包括頭部值202、尾部值204和隊(duì)列項(xiàng) 206。在一些實(shí)施例中,隊(duì)列項(xiàng)206包含具有值的隊(duì)列項(xiàng)的陣列,這 些值是空隊(duì)列項(xiàng)值或非空隊(duì)列項(xiàng)值。在一些實(shí)施例中,隊(duì)列項(xiàng)是指向 隊(duì)列項(xiàng)的數(shù)據(jù)對(duì)象的指針。如杲隊(duì)列項(xiàng)具有空值,則隊(duì)列項(xiàng)是空的。 任何不是有效隊(duì)列項(xiàng)值的值均可用作空(NULL)值。例如,在隊(duì)列項(xiàng)是 指向數(shù)據(jù)對(duì)象的指針的情況中,可以使用0 (零)或-1的值來指示空 值,因?yàn)檫@些值都不是有效的指針值。此外,隊(duì)列項(xiàng)206中的每個(gè)隊(duì) 列項(xiàng)在存儲(chǔ)器邊界上對(duì)齊,這將允許利用單個(gè)存儲(chǔ)器訪問(例如加載 (讀取)或存儲(chǔ)(寫入))對(duì)隊(duì)列項(xiàng)的原子訪問。在一些實(shí)施例中, 隊(duì)列項(xiàng)在字邊界上對(duì)齊,并且是具有字大小的項(xiàng)。但是,可以使用將 提供利用單個(gè)存儲(chǔ)器訪問對(duì)隊(duì)列項(xiàng)的原子訪問的任何邊界和大小。
頭部值202是對(duì)隊(duì)列108的頭部的引用。隊(duì)列的頭部是隊(duì)列中將 從隊(duì)列移除下一個(gè)隊(duì)列項(xiàng)所在的點(diǎn)。當(dāng)移除項(xiàng)時(shí),頭部值4皮調(diào)整為引 用新的頭部項(xiàng)。在一些實(shí)施例中,頭部值202是至隊(duì)列項(xiàng)陣列的索引。
尾部值204是對(duì)隊(duì)列108的尾部的引用。隊(duì)列的尾部是隊(duì)列中將下一個(gè)隊(duì)列項(xiàng)添加到隊(duì)列所在的點(diǎn)。當(dāng)添加項(xiàng)時(shí),尾部值^皮調(diào)整為引 用隊(duì)列中的下一個(gè)可用項(xiàng)。
在一些實(shí)施例中,隊(duì)列108可以包括讀取緩沖器208和寫入緩沖 器210。高速緩存性能可以是隊(duì)列系統(tǒng)性能的一個(gè)重要要素。在典型 的隊(duì)列訪問模式中,讀取(出列)和寫入(入列)互相混合。作為結(jié) 果,讀取之后寫入,或?qū)懭胫笞x取可能導(dǎo)致高速緩存未命中。使用 讀取緩沖器208和寫入緩沖器210增加了讀取之后寫入(或反之)導(dǎo) 致高速緩存命中的概率,因?yàn)樽x取和寫入緩沖器可以存儲(chǔ)在分開的高 速緩存行中。下文參考圖3C和3D提供有關(guān)使用讀取緩沖器208和寫 入緩沖器210的進(jìn)一步細(xì)節(jié)。
而且,在一些實(shí)施例中,隊(duì)列108可以具有隊(duì)列標(biāo)識(shí)符212。在 一些實(shí)施例中,使用多個(gè)隊(duì)列108來實(shí)現(xiàn)排隊(duì)系統(tǒng)。在此情況中,每 個(gè)隊(duì)列108可以稱為子隊(duì)列??梢允褂藐?duì)列ID來標(biāo)識(shí)排隊(duì)系統(tǒng)中指 定給特定線程的隊(duì)列。在一些實(shí)施例中,隊(duì)列標(biāo)識(shí)符212是所謂的"線 程本地變量"。使用線程本地變量是所希望的,因?yàn)檫M(jìn)程的線程通常 共享與該進(jìn)程相同的地址空間。因此線程本地變量為線程^是供維護(hù)不 與進(jìn)程中的其他線程共享的值的方式。
圖2B是根據(jù)本發(fā)明備選實(shí)施例的隊(duì)列數(shù)據(jù)結(jié)構(gòu)108的框圖。在 這些實(shí)施例中,隊(duì)列數(shù)據(jù)結(jié)構(gòu)108包括填充陣列214。如上文提到的, 高速緩存性能對(duì)隊(duì)列系統(tǒng)性能有相當(dāng)大的影響。因此,所希望的是確 保頭部202、尾部204和隊(duì)列項(xiàng)206均占據(jù)不同的高速緩存行。在一 些實(shí)施例中,在隊(duì)列數(shù)據(jù)結(jié)構(gòu)中插入填充陣列214,并具有經(jīng)計(jì)算以 確保下一個(gè)屬性(例如尾部或隊(duì)列項(xiàng))位于不同高速緩存行中的大小。 例如,假定頭部202是整數(shù)值。可以將頭部值202之后的填充陣列214 確定為大小等于系統(tǒng)的高速緩存行大小減去整數(shù)的大小。在備選實(shí)施 例中,可以使用編譯器指導(dǎo)指令來確保頭部202、尾部204和隊(duì)列項(xiàng) 206位于不同的高速緩存行中。例如,如下代碼段使用"attribte"編 譯器指導(dǎo)指令來向編譯器指示應(yīng)該在高速緩存行邊界上對(duì)齊整數(shù)尾部值
int tail—attribute((allgned(LINE—SIZE));
圖3A-3D是圖示根據(jù)本發(fā)明實(shí)施例、用于讀取和寫入隊(duì)列項(xiàng)的方 法的流程圖。這些方法可以在例如上文參考圖l所述的操作環(huán)境內(nèi)扭^ 行。該操作環(huán)境要執(zhí)行的方法構(gòu)成由計(jì)算機(jī)可執(zhí)行指令組成的計(jì)算機(jī) 程序。參考流程圖描述這些方法使本領(lǐng)域技術(shù)人員能夠開發(fā)包含此類 指令的此類程序以在適合的計(jì)算機(jī)(執(zhí)行來自諸如RAM、 ROM、 CD-ROM、 DVD-ROM、硬盤、閃速存儲(chǔ)器等的機(jī)器可讀取4某體的指令的計(jì)算機(jī)的處理器)上執(zhí)行這些方法。圖3A-3D所示的方法包含由 運(yùn)行本發(fā)明的示范實(shí)施例的操作環(huán)境所執(zhí)行的動(dòng)作。
圖3A是圖示根據(jù)本發(fā)明實(shí)施例、用于寫入隊(duì)列項(xiàng)的方法的流程 圖。在一些實(shí)施例中,該方法開始于接收將新項(xiàng)置于隊(duì)列中的請(qǐng)求(框 304)。在一些實(shí)施例中,該請(qǐng)求采用提供對(duì)隊(duì)列以及對(duì)要置于隊(duì)列中 (入列)的數(shù)據(jù)(或數(shù)據(jù)指針)的引用的函數(shù)調(diào)用的形式。
該系統(tǒng)保存當(dāng)前尾部項(xiàng)值(框306 ),然后進(jìn)行檢查以確定所保存 的尾部項(xiàng)值是否不是空值(框308 )。如果當(dāng)前保存的尾部項(xiàng)值不為空, 則系統(tǒng)指示寫入失敗(框310)。在一些實(shí)施例中,這通過返回FLASE 值來實(shí)現(xiàn)。在備選實(shí)施例中,系統(tǒng)可以通過讀取尾部項(xiàng)值并檢查該尾 部項(xiàng)值為空來重試框306和308,從而使寫入能在后續(xù)重試中成功。 寫入可能因?yàn)殛?duì)列已滿而失敗?;蛘?,寫入可能因?yàn)殛?duì)列的頭部和尾 部引用相同的隊(duì)列項(xiàng)而失敗。在此情況中,讀取線程可能尚未完成讀 取隊(duì)列項(xiàng)(并將頭部隊(duì)列項(xiàng)設(shè)為空),因此所希望的是在讀取完成之 后將新項(xiàng)寫入隊(duì)列的嘗試才會(huì)成功。
如果在框308處檢查確定所保存的尾部項(xiàng)為空,則系統(tǒng)接著將新 項(xiàng)寫入到當(dāng)前尾部位置(框312)。然后將尾部值調(diào)整為指向隊(duì)列中的 下一個(gè)項(xiàng)(框314)。如果隊(duì)列是固定大小的,則在寫入最后一個(gè)隊(duì)列 項(xiàng)之后可以將尾部值回繞到第一個(gè)隊(duì)列項(xiàng)。該方法然后返回指示寫 入已成功(框316)。在一些實(shí)施例中,這通過返回TRUE值來實(shí)現(xiàn)。
圖3B是圖示根據(jù)本發(fā)明實(shí)施例、用于讀取隊(duì)列項(xiàng)的方法的流程 圖。該方法開始于接收從隊(duì)列中檢索項(xiàng)(即要將項(xiàng)出列)的請(qǐng)求(框 320)。在一些實(shí)施例中,該請(qǐng)求采用標(biāo)識(shí)要使用的隊(duì)列的函數(shù)調(diào)用的 形式。
系統(tǒng)然后保存隊(duì)列的頭部位置的頭部值(框322)。接下來,系統(tǒng) 進(jìn)行檢查以確定所保存的頭部項(xiàng)是否等于空值(框324 )。如果所保存 的頭部項(xiàng)為空,則系統(tǒng)將空值返回到請(qǐng)求方(框326)。空值可以指示 該隊(duì)列是空的?;蛘呖罩悼梢灾甘绢^部和尾部引用相同的隊(duì)列項(xiàng),以 及寫入隊(duì)列的線程尚未完成寫入隊(duì)列項(xiàng)。
如果在框324處檢查確定所保存的頭部項(xiàng)不為空,則系統(tǒng)將當(dāng)前 頭部項(xiàng)設(shè)為空(框328)以指示已移除該項(xiàng)(即出列)。系統(tǒng)然后將頭 部指針更新為指向隊(duì)列中的下一個(gè)項(xiàng)(框330),并將所保存的隊(duì)列項(xiàng) 返回到請(qǐng)求方(框331 )。
可以看到圖3A和3B所示的方法提供對(duì)隊(duì)列的原子和并發(fā)訪問, 并避免了數(shù)據(jù)竟?fàn)帬顩r。最初,如果頭部和尾部引用是引用不同的隊(duì) 列項(xiàng),則讀取(出列)和寫入(入列)相對(duì)于彼此是原子的,因?yàn)樯?及的是完全不同的隊(duì)列項(xiàng)。在頭部引用和尾部引用都引用相同隊(duì)列項(xiàng) 的情況中,存在兩種情況,如果要讀取隊(duì)列項(xiàng)(出歹'J)或要寫入隊(duì)列 項(xiàng)(入列)的請(qǐng)求方不交叉,則請(qǐng)求方相對(duì)于彼此是原子的。但是, 如果請(qǐng)求方交叉,即出列期間接收到入列或入列期間接收到出列,則 在框322與330之間執(zhí)行框306,或在框306與314之間執(zhí)行框322。 在這兩種情況的任何一種情況中,兩個(gè)線程將加栽相同的項(xiàng)值。因?yàn)?它們?cè)诳?08和324處的檢查是針對(duì)相反的狀況(空或非空),它們 僅其中之一將發(fā)現(xiàn)狀況為FALSE,并繼續(xù)在框312或328處進(jìn)行存儲(chǔ) 4喿作。因此,原子性得以維持,因?yàn)樵谧x取(出歹'j )和寫入(入列) 請(qǐng)求交叉時(shí)僅一個(gè)線程更新隊(duì)列。
圖3C是圖示根據(jù)本發(fā)明實(shí)施例、用于寫入緩沖的隊(duì)列項(xiàng)的方法 的流程圖。如上文提到的,緩沖是所希望的,因?yàn)樗梢越档透咚倬?br>
存未命中的概率,在本發(fā)明的一些實(shí)施例中,緩沖器大小等于一個(gè)高
速緩存行大小,將緩沖器對(duì)齊(align)使得它僅被映射到一個(gè)高速纟爰存 行。以此方式,從隊(duì)列的緩沖器加載或?qū)﹃?duì)列的刷新僅觸及一個(gè)高速 緩存行。同時(shí),按高速緩存行大小粒度的隊(duì)列訪問(入列和出列)使 得高速緩存未命中更少,并能夠利用存儲(chǔ)器系統(tǒng)的大量傳輸能力。該 方法開始于接收將新項(xiàng)置于隊(duì)列的請(qǐng)求(框304 )。
系統(tǒng)然后檢查寫入緩沖器是否已滿(框332)。如果緩沖器未滿, 則將新項(xiàng)置于寫入緩沖器中(框334),并且方法結(jié)束。
否則,如果緩沖器已滿,則該方法進(jìn)行檢查以查看當(dāng)前尾部項(xiàng)是 否不等于空值(框336)。如果當(dāng)前尾部項(xiàng)不等于空值,則隊(duì)列已滿并 且無法保存更多項(xiàng),或入列請(qǐng)求與出列請(qǐng)求交叉,而出列尚未完成。 在任何一種情況中,該方法向請(qǐng)求方指示失敗(框338 )。
否則,如果尾部項(xiàng)為空,則將寫入緩沖器中的當(dāng)前隊(duì)列項(xiàng)傳送到 (transfer to)隊(duì)列(框340)。在一些實(shí)施例中,傳送按相反次序(從最 后一個(gè)向第一個(gè))進(jìn)行,從而當(dāng)前尾部項(xiàng)將保持為空直到寫入了整個(gè) 緩沖器為止。這是所希望的,因?yàn)榈竭_(dá)當(dāng)前尾部項(xiàng)的任何交叉的出列 請(qǐng)求將返回指示該隊(duì)列為空的空值,直到(第一個(gè)纟爰沖器項(xiàng)的)最后 一次寫入完成為止。
接下來,調(diào)整當(dāng)前尾部指針(框342X在一些實(shí)施例中,按從寫 入緩沖器傳送到隊(duì)列的項(xiàng)的數(shù)量調(diào)整當(dāng)前尾部指針。在備選實(shí)施例 中,可以按與緩沖器項(xiàng)的總數(shù)相等的常量來調(diào)整尾部指針。系統(tǒng)然后向請(qǐng)求方指示已成功寫入隊(duì)列項(xiàng)(框344)。
應(yīng)該注意,如果未將數(shù)據(jù)提供給隊(duì)列上的項(xiàng),則在相對(duì)豐支長的時(shí) 間段內(nèi)僅部分填充寫入緩沖器是可能的。因此,所希望的是周期性地 檢查寫入緩沖器以查看寫入緩沖器是否為部分滿,并將項(xiàng)從寫入緩沖 器刷新到隊(duì)列項(xiàng)。在一些實(shí)施例中,將在其中檢查部分填充的緩沖器 的時(shí)間段設(shè)為稍長于隊(duì)列寫入(入列)函數(shù)的調(diào)用時(shí)間間隔。在備選 實(shí)施例中,在其中檢查部分填充的緩沖器的時(shí)間段可以基于存儲(chǔ)器等待時(shí)間和將項(xiàng)目從寫入緩沖器傳送到隊(duì)列項(xiàng)所需的存儲(chǔ)器總線事務(wù) 的數(shù)量來確定。
在一些實(shí)施例中,即使緩沖器可能不滿,刷新操作仍使用任何未 填充的緩沖器項(xiàng)的空值將所有緩沖器項(xiàng)寫入到隊(duì)列項(xiàng)中。隊(duì)列讀取器 可以在將隊(duì)列項(xiàng)讀取到讀取緩沖器時(shí)忽略這些空值。
圖3D是圖示根據(jù)本發(fā)明實(shí)施例、用于讀取緩沖的隊(duì)列項(xiàng)的方法 的流程圖。該方法開始于接收從隊(duì)列中檢索項(xiàng)的請(qǐng)求(框320)。
系統(tǒng)然后確定讀取緩沖器中是否存在任何項(xiàng)(框352 ),如果存在 的話,則將讀取緩沖器中的第一個(gè)可用項(xiàng)返回到請(qǐng)求方(框354)。修 改緩沖器的內(nèi)容以指示已移除該項(xiàng),并將緩沖器中的項(xiàng)的計(jì)數(shù)遞減1。
如果在框352處檢查確定緩沖器是空的,則系統(tǒng)保存當(dāng)前頭部項(xiàng) (框356 )。系統(tǒng)然后確定當(dāng)前頭部項(xiàng)是否等于空值(框358)。如果 當(dāng)前頭部項(xiàng)為空,則系統(tǒng)將空值返回到請(qǐng)求方(框360)。這指示隊(duì)列 是空的,或隊(duì)列的頭部和尾部引用相同的項(xiàng),并且入列器(enqueuer) 將項(xiàng)寫入隊(duì)列尚未完成。
如果在框358處檢查指示隊(duì)列不是空的(即,所保存的頭部項(xiàng)不 為空),則系統(tǒng)接著將項(xiàng)從隊(duì)列傳送到讀取緩沖器(框362)。在傳送 每個(gè)項(xiàng)時(shí),進(jìn)行檢查以確定它是否是空值。在一些實(shí)施例中,如果讀 取緩沖器已滿,則傳送停止。而且,如果讀取到空的隊(duì)列項(xiàng),傳送也 可以停止,這意味著余下的隊(duì)列項(xiàng)全部為空,并因此對(duì)于此緩沖器加 載忽略余下隊(duì)列項(xiàng)。
然后調(diào)整頭部引用(框364)。在一些實(shí)施例中,按傳送到讀取緩 沖器的隊(duì)列項(xiàng)的數(shù)量來調(diào)整頭部引用。在備選實(shí)施例中,按與緩沖器 項(xiàng)的總數(shù)相等的常量來調(diào)整頭部引用。該方法結(jié)束于將所保存的頭部 項(xiàng)值返回到請(qǐng)求方(框366)。
上文提供的系統(tǒng)和方法描述了所謂的單個(gè)讀取器單個(gè)寫入器 (SRSW)隊(duì)列。下文中圖4-6描述使用SRSW隊(duì)列作為構(gòu)建塊來創(chuàng) 建更廣泛且更靈活的排隊(duì)系統(tǒng)的實(shí)施例。
圖4是圖示根據(jù)本發(fā)明實(shí)施例的單個(gè)讀取器多個(gè)寫入器(SRMW) 隊(duì)列系統(tǒng)的軟件組件的框圖。在圖3所示的示范配置中,創(chuàng)建兩個(gè) SRSW隊(duì)列108.1和108.2。將兩個(gè)線程106.1和106.2分別與隊(duì)列108.1 和108.2關(guān)聯(lián)。在本發(fā)明一些實(shí)施例中,每個(gè)線程將隊(duì)列標(biāo)識(shí)212保 存在線程本地變量中。線程106.3是從隊(duì)列108.1和108.2讀取的線程。 從圖3可看到,每個(gè)隊(duì)列具有單個(gè)寫入器和單個(gè)讀取器線程。如上所 述,此類隊(duì)列支持對(duì)隊(duì)列項(xiàng)的并發(fā)原子訪問。因此,圖4所示的SRMW 排隊(duì)系統(tǒng)也能夠支持對(duì)每個(gè)單獨(dú)隊(duì)列108中的項(xiàng)的并發(fā)原子訪問。雖 然圖4中圖示了兩個(gè)隊(duì)列,但是多種實(shí)施例可以支持多于兩個(gè)的隊(duì)列。 實(shí)際上,可以支持任意數(shù)量"n"的寫入線程,只要作為SRMW排隊(duì) 系統(tǒng)的一部分創(chuàng)建的每個(gè)單獨(dú)隊(duì)列是具有一個(gè)讀取器和一個(gè)寫入器 的SRSW隊(duì)列即可。在一些實(shí)施例中,單個(gè)讀取器線程以循環(huán)方式(例
如以108.1、 108.2.....108.n、 108.1、 108.2..... 108.n,以此類推)
從隊(duì)列108.1 - 108.n中讀取。在備選實(shí)施例中,單個(gè)讀取器線程能以
擺動(dòng)方式(例如以108.1、 108.2、...、跳n、 108.n、跳n-l.....108.2、
108.1,以此類推)從隊(duì)列108.1 — 108.n中讀取。
圖5是圖示根據(jù)本發(fā)明實(shí)施例、用于多個(gè)讀取器單個(gè)寫入器 (MRSW)排隊(duì)系統(tǒng)的軟件組件的框圖。在圖5所示的示例中,兩個(gè) 隊(duì)列108.1和108.2均具有一個(gè)讀取器線程,分別為線程106.1和106.2, 以及對(duì)兩個(gè)隊(duì)列寫入的單個(gè)寫入器線程106.3。同樣地,因?yàn)槊總€(gè)單 獨(dú)隊(duì)列108.1和108.2是SRSW隊(duì)列,所以圖5所示的MRSW排隊(duì)系 統(tǒng)可以提供對(duì)隊(duì)列108.1和108.2中的隊(duì)列項(xiàng)的并發(fā)原子訪問。雖然 圖5中圖示了兩個(gè)隊(duì)列,但是多種實(shí)施例可以支持多于兩個(gè)的隊(duì)列。 實(shí)際上,可以支持任意數(shù)量"n"的讀取線程,只要作為MRSW排隊(duì) 系統(tǒng)的一部分創(chuàng)建的每個(gè)單獨(dú)隊(duì)列是具有一個(gè)讀取器線程和一個(gè)寫 入器線程的SRSW隊(duì)列即可。在一些實(shí)施例中,寫入線程106.3以循 環(huán)方式對(duì)隊(duì)列108.1-108.n寫入。在備選實(shí)施例中,寫入線程106.3以 才罷動(dòng)方式對(duì)隊(duì)列108.1-108.n寫入。
圖6是圖示根據(jù)本發(fā)明實(shí)施例的多個(gè)寫入器多個(gè)讀取器 (MRMW)排隊(duì)系統(tǒng)的軟件組件的框圖。在圖6所示的示例中,創(chuàng)建 了四個(gè)隊(duì)列108.1-108.4。兩個(gè)線程是寫入線程(線程106.1和106.2 ), 兩個(gè)線程是讀取線程(106.3和106.4 )。創(chuàng)建復(fù)用器線程602,它從隊(duì) 列108.1和108.2中讀取并對(duì)隊(duì)列108.3和108.4寫入。復(fù)用器線程602 是所謂的幫助器線程,因?yàn)槠淠康脑谟谠谧x取和寫入線程可以對(duì)隊(duì)列 項(xiàng)執(zhí)行處理時(shí),通過在多種讀取和寫入線程之間讀取和分發(fā)(即復(fù)用) 隊(duì)列項(xiàng)來幫助隊(duì)列處理。
在圖4-6所示的多個(gè)隊(duì)列實(shí)施例的每個(gè)實(shí)施例(即SRMW、MRSW 和MRMW排隊(duì)系統(tǒng))中,用于創(chuàng)建較大的SRMW、 MRSW或MRMW 隊(duì)列的SRSW隊(duì)列可以稱為子隊(duì)列??梢栽诰幊虝r(shí)、編譯時(shí)或運(yùn)行時(shí) 中的任一個(gè)確定隊(duì)列中子隊(duì)列的計(jì)數(shù)。在編程時(shí),編程員可以通過對(duì) 讀取器和寫入器的數(shù)量計(jì)數(shù)來指定子隊(duì)列的計(jì)數(shù)。在編譯時(shí),編譯器
將執(zhí)行程序分析來推導(dǎo)將有多少個(gè)讀取器和寫入器存在,然后確定子 隊(duì)列計(jì)數(shù)。在運(yùn)行時(shí),運(yùn)行時(shí)系統(tǒng)可以在每次新線程訪問隊(duì)列時(shí)動(dòng)態(tài) 地遞增子隊(duì)列數(shù)量,而在線程退出時(shí)遞減子隊(duì)列數(shù)量。在一些實(shí)施例 中,如果讀取器線程退出時(shí)隊(duì)列項(xiàng)仍在隊(duì)列中,則可以將余下的隊(duì)列 項(xiàng)傳送(例如通過復(fù)用器線程)到具有與之關(guān)聯(lián)的頭部線程的新隊(duì)列。 在備選實(shí)施例中,系統(tǒng)可以容許"丟失的"隊(duì)列,并只需丟棄余下的 隊(duì)列項(xiàng)即可。
已經(jīng)描述了用于提供多線程排隊(duì)系統(tǒng)的系統(tǒng)和方法。本申請(qǐng)旨在 涵蓋本發(fā)明實(shí)施例的任何調(diào)整或改變。要理解上文描述旨在進(jìn)行說明 而非限制。對(duì)于審閱了上文描述的本領(lǐng)域技術(shù)人員來說,將顯見到許 多其他實(shí)施例。因此,顯然本發(fā)明主題僅由所附權(quán)利要求及其等效物 限定。
權(quán)利要求
1.一種方法,包括將第一隊(duì)列初始化,所述第一隊(duì)列具有一組第一隊(duì)列項(xiàng),所述第一隊(duì)列項(xiàng)具有至少一個(gè)有效值和空值,所述第一隊(duì)列項(xiàng)的每一個(gè)占用在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分;接收對(duì)所述一組第一隊(duì)列項(xiàng)的隊(duì)列項(xiàng)執(zhí)行隊(duì)列操作的請(qǐng)求;以及基于所述隊(duì)列項(xiàng)是否具有空值的確定來確定是否要執(zhí)行所述隊(duì)列操作。
2. 如權(quán)利要求l所述的方法,其中,所述隊(duì)列操作包括寫入所述 隊(duì)列項(xiàng),并且如果所述隊(duì)列項(xiàng)具有空值,則執(zhí)行所述隊(duì)列操作。
3. 如權(quán)利要求l所述的方法,其中,所述隊(duì)列操作包括讀取隊(duì)列 項(xiàng),并且如果所述隊(duì)列項(xiàng)具有所述至少一個(gè)有效值,則執(zhí)行所述隊(duì)列 操作。
4. 如權(quán)利要求1所述的方法,其中,所述存儲(chǔ)器部分在字邊界上 對(duì)齊。
5. 如權(quán)利要求1所述的方法,還包括將第二隊(duì)列初始化,所述第二隊(duì)列具有一組第二隊(duì)列項(xiàng),所述笫 二隊(duì)列項(xiàng)具有至少一個(gè)有效值和空值,所述第二隊(duì)列項(xiàng)的每一個(gè)占用
6. 如權(quán)利要求1所述的方法,還包括提供用于所述第一隊(duì)列項(xiàng)的 子集的緩沖器。
7. 如權(quán)利要求6所述的方法,其中,所述緩沖器包括寫入緩沖器, 并且所述方法還包括將隊(duì)列值寫入到所述寫入緩沖器;以及 將所述寫入緩沖器傳送到所述第 一隊(duì)列。
8. 如權(quán)利要求6所述的方法,其中,所述緩沖器包括讀取緩沖器,并且所述方法還包括將所述第一隊(duì)列項(xiàng)的子集傳送到所述讀取緩沖器;以及 從所述讀取緩沖器讀取隊(duì)列值。
9. 一種系統(tǒng),包括具有多個(gè)第 一隊(duì)列項(xiàng)的第 一隊(duì)列,所述第 一隊(duì)列項(xiàng)具有至少一個(gè) 有效值和空值,所述第 一隊(duì)列項(xiàng)的每一個(gè)占用在單個(gè)存儲(chǔ)器訪問中以 原子方式可訪問的存儲(chǔ)器部分;用于在所述第一隊(duì)列中寫入隊(duì)列項(xiàng)的第一線程;以及 用于從所述第 一 隊(duì)列讀取所述隊(duì)列項(xiàng)的第二線程; 其中如果所述隊(duì)列項(xiàng)具有空值,則執(zhí)行所述寫入,并且如果所述 隊(duì)列項(xiàng)具有所述至少一個(gè)有效值,則執(zhí)行所述讀取。
10. 如權(quán)利要求9所述的系統(tǒng),其中,所述第一隊(duì)列還包括用于 標(biāo)識(shí)所述多個(gè)隊(duì)列項(xiàng)的頭部項(xiàng)的頭部值,并且所述頭部值在高速緩存 行邊界上對(duì)齊。
11. 如權(quán)利要求9所述的系統(tǒng),其中,所述第一隊(duì)列還包括用于 標(biāo)識(shí)所述多個(gè)隊(duì)列項(xiàng)的尾部項(xiàng)的尾部值,并且所述尾部值在高速緩存 行邊界上對(duì)齊。
12. 如權(quán)利要求9所述的系統(tǒng),其中,所述多個(gè)第一隊(duì)列項(xiàng)在高 速緩存行邊界上對(duì)齊。
13. 如權(quán)利要求9所述的系統(tǒng),還包括 具有多個(gè)第二隊(duì)列項(xiàng)的第二隊(duì)列,所述第二隊(duì)列項(xiàng)具有至少 一個(gè) 有效值和空值,所述第一隊(duì)列項(xiàng)的每一個(gè)占用在單個(gè)存儲(chǔ)器訪問中以 原子方式可訪問的存儲(chǔ)器部分;以及 用于在第二數(shù)據(jù)結(jié)構(gòu)中寫入隊(duì)列項(xiàng)的第三線程,如果所述隊(duì)列項(xiàng) 具有空值,則執(zhí)行所述寫入; 其中如果所述隊(duì)列項(xiàng)具有所述至少一個(gè)有效值,則所述笫二線程 從所述第二數(shù)據(jù)結(jié)構(gòu)讀取所述隊(duì)列項(xiàng)。
14. 如權(quán)利要求9所述的系統(tǒng),還包括具有多個(gè)第二隊(duì)列項(xiàng)的第二隊(duì)列,所述第二隊(duì)列項(xiàng)具有至少 一個(gè) 有效值和空值,所述第二隊(duì)列項(xiàng)的每一個(gè)占用在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分;以及用于從所述第二數(shù)據(jù)結(jié)構(gòu)讀取隊(duì)列項(xiàng)的第三線程,如果所述隊(duì)列 項(xiàng)具有所述至少一個(gè)有效值,則執(zhí)行所述讀取;其中如果所述隊(duì)列項(xiàng)具有空值,則所述笫 一線程在所述第二數(shù)據(jù) 結(jié)構(gòu)中寫入所述隊(duì)列項(xiàng)。
15. —種系統(tǒng),包括具有多個(gè)第 一隊(duì)列項(xiàng)的第 一隊(duì)列,所述第 一隊(duì)列項(xiàng)的每一個(gè)占用 在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分;具有多個(gè)笫二隊(duì)列項(xiàng)的第二隊(duì)列,所述第二隊(duì)列項(xiàng)的每一個(gè)占用 在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分;具有多個(gè)第三隊(duì)列項(xiàng)的第三隊(duì)列,所述第三隊(duì)列項(xiàng)的每一個(gè)占用 在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分;具有多個(gè)第四隊(duì)列項(xiàng)的第四隊(duì)列,所述第四隊(duì)列項(xiàng)的每一個(gè)占用用于對(duì)所述第 一隊(duì)列寫入的第 一線程; 用于對(duì)所述第二隊(duì)列寫入的第二線程;復(fù)用器線程,用于讀取所述第一隊(duì)列和所述第二隊(duì)列以及對(duì)所述 第三隊(duì)列和所述第四隊(duì)列寫入;用于從所述第三隊(duì)列讀取的第三線程;以及 用于從所述第四隊(duì)列讀取的第四線程。
16. 如權(quán)利要求15所述的系統(tǒng),其中,所述第一隊(duì)列、所述第二 隊(duì)列、所述第三隊(duì)列和所述第四隊(duì)列是動(dòng)態(tài)地創(chuàng)建的。
17. 如權(quán)利要求15所述的系統(tǒng),其中,所述第一隊(duì)列、所述第二 隊(duì)列、所述第三隊(duì)列和所述第四隊(duì)列均具有多個(gè)隊(duì)列項(xiàng),所述隊(duì)列項(xiàng) 具有有效值和空值,在讀取期間,如果所述隊(duì)列項(xiàng)具有所述有效值, 則返回所述多個(gè)隊(duì)列項(xiàng)的隊(duì)列項(xiàng),并且在寫入期間,如果所述隊(duì)列項(xiàng)具有空值,則寫入所述隊(duì)列項(xiàng)。
18. —種具有用于執(zhí)行方法的機(jī)器可執(zhí)行指令的機(jī)器可讀媒體, 所述方法包括將第一隊(duì)列初始化,所述第一隊(duì)列具有一組第一隊(duì)列項(xiàng),所述第 一隊(duì)列項(xiàng)具有至少一個(gè)有效值和空值,所述第一隊(duì)列項(xiàng)的每一個(gè)占用 在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分;接收對(duì)所述一組第一隊(duì)列項(xiàng)的隊(duì)列項(xiàng)執(zhí)行隊(duì)列操作的請(qǐng)求;以及 基于所述隊(duì)列項(xiàng)是否具有空值的確定來確定是否要執(zhí)行所述隊(duì) 列操作。
19. 如權(quán)利要求18所述的機(jī)器可讀媒體,其中,所述隊(duì)列操作包 括寫入所述隊(duì)列項(xiàng),并且如果所述隊(duì)列項(xiàng)具有空值,則執(zhí)行所述隊(duì)列 操作。
20. 如權(quán)利要求18所述的機(jī)器可讀媒體,其中,所述隊(duì)列操作包 括讀取隊(duì)列項(xiàng),并且如果所述隊(duì)列項(xiàng)具有所述至少一個(gè)有效值,則執(zhí) 行所述隊(duì)列操作。
21. 如權(quán)利要求18所述的機(jī)器可讀媒體,其中,所述存儲(chǔ)器部分 在字邊界上對(duì)齊。
22. 如權(quán)利要求18所述的機(jī)器可讀媒體,其中,所述方法還包括 如下步驟將第二隊(duì)列初始化,所述第二隊(duì)列具有一組第二隊(duì)列項(xiàng),所述第 二隊(duì)列項(xiàng)具有至少 一個(gè)有效值和空值,所述第二隊(duì)列項(xiàng)的每一個(gè)占用 在單個(gè)存儲(chǔ)器訪問中以原子方式可訪問的存儲(chǔ)器部分。
23. 如權(quán)利要求18所述的機(jī)器可讀媒體,其中,所述方法還包括 提供用于所述第 一 隊(duì)列項(xiàng)的子集的緩沖器。
24. 如權(quán)利要求23所述的機(jī)器可讀媒體,其中,所述緩沖器包括 寫入緩沖器,并且所述方法還包括將隊(duì)列值寫入到所述寫入緩沖器;以及 將所述寫入緩沖器傳送到所述第一隊(duì)列。
25.如權(quán)利要求23所述的機(jī)器可讀媒體,其中,所述緩沖器包括 讀取緩沖器,并且所述方法還包括將所述第 一隊(duì)列項(xiàng)的子集傳送到所述讀取緩沖器;以及 從所述讀取緩沖器讀取隊(duì)列值。
全文摘要
系統(tǒng)和方法提供單個(gè)讀取器單個(gè)寫入器(SRSW)隊(duì)列結(jié)構(gòu),該隊(duì)列結(jié)構(gòu)具有能夠利用單個(gè)存儲(chǔ)器訪問以原子方式并行訪問的項(xiàng)??梢詫RSW隊(duì)列組合以創(chuàng)建較復(fù)雜的隊(duì)列,包括多個(gè)讀取器單個(gè)寫入器(MRSW)、單個(gè)讀取器多個(gè)寫入器(SRMW)和多個(gè)讀取器多個(gè)寫入器(MRMW)隊(duì)列。
文檔編號(hào)G06F9/00GK101346692SQ200580052419
公開日2009年1月14日 申請(qǐng)日期2005年12月29日 優(yōu)先權(quán)日2005年12月29日
發(fā)明者D·R·居, X·李 申請(qǐng)人:英特爾公司