專利名稱:帶有依賴性等級的多線程電子表格處理的制作方法
帶有依賴性等級的多線程電子表格處理
背景
將電子表格應(yīng)用程序用于數(shù)據(jù)分析己變得普及。此外,隨著越來越多的企 業(yè)依賴于這些應(yīng)用程序來進(jìn)行復(fù)雜數(shù)據(jù)計(jì)算,對這些程序的更快且更高效的處
理的需求也變得十分渴求。Microsoft ExcelTM是這一電子表格應(yīng)用程序的一個(gè) 示例。電子表格應(yīng)用程序的一個(gè)單元格中被稱為"依賴"公式的公式依賴于另 一單元格的內(nèi)容或其中被稱為"支持"公式的公式是典型的。當(dāng)單元格的內(nèi)容 改變時(shí),可觸發(fā)重新i「算("重'"算(recalc)")操作,其中使用一程序線 程來迭代通過各公式并基于這些改變來重計(jì)算需要重新計(jì)算的任何公式。當(dāng)重 計(jì)算程序線程面臨依賴于尚未被計(jì)算的支持公式的公式時(shí),用于計(jì)算操作的處 理時(shí)間即使沒有完全暫停相當(dāng)長的一段時(shí)間也會在速度上減慢。即使在這些應(yīng) 用程序中采用多個(gè)處理器或多個(gè)程序線程的情況下,計(jì)算和重計(jì)算的執(zhí)行速度 在至少一個(gè)處理器不能在等待支持公式被計(jì)算的同時(shí)完成計(jì)算或重計(jì)算的情 況下也不能提高。該問題隨著電子表格應(yīng)用程序中的依賴公式的數(shù)目增加而惡 化。
雖然本背景一節(jié)中著眼于特定的問題,但本發(fā)明決不旨在限于解決那些特 定問題。
概述
本發(fā)明的各實(shí)施例 一般涉及在有一個(gè)以上處理器或處理弓I擎可用時(shí)用多 個(gè)處理器或多個(gè)并發(fā)線程來處理電子表格計(jì)算和重新計(jì)算。其它實(shí)施例涉及在 對輸入項(xiàng)鏈重新排序時(shí)使用樹結(jié)構(gòu)和依賴性等級來執(zhí)行重計(jì)算操作的多線程 處理。此外,某些實(shí)施例涉及對重計(jì)算操作的多線程處理的同步。
如此處所討論的, 一特定實(shí)施例的一方面涉及對輸入項(xiàng),或稱"ENT"的 計(jì)算鏈重新排序,以創(chuàng)建由既不包含依賴公式也不包含支持公式的子鏈和ENT 的子鏈(即,依賴公式和支持公式以樹分層結(jié)構(gòu)來組織)構(gòu)成的統(tǒng)一重計(jì)算鏈。"ENT"指的是包含在電子表格的單元格內(nèi)的公式。在另一實(shí)施例中,該統(tǒng)一 鏈被劃分成單獨(dú)的依賴性等級,其中每一依賴性等級包含除了依賴于該依賴性
等級內(nèi)的子鏈中的支持公式之外僅依賴于先前的依賴性等級中的ENT的ENT。 這一實(shí)施例中的安排允許多個(gè)線程在不必等待未計(jì)算的支持ENT被計(jì)算的情 況下繼續(xù)處理整個(gè)依賴性等級中的ENT。 一旦到達(dá)下一依賴性等級,對位于其 中的ENT和子鏈(如果有)的處理基于在先前的依賴性等級中已經(jīng)完成的計(jì) 算而高效地完成。
其它實(shí)施例涉及在系統(tǒng)包括一個(gè)以上處理器或處理引擎的情況下使用多 個(gè)異步程序線程來對該統(tǒng)一重計(jì)算鏈中的公式求值。在一個(gè)實(shí)施例中,可使用 控制線程來控制該多線程處理的同步。
提供本概述以便以簡化的形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一 些概念。本概述并不旨在標(biāo)識所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也決 不旨在用于限制所要求保護(hù)的主題的范圍。
附圖
圖l示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的在電子表格應(yīng)用程序中使用的、包 括"N"個(gè)重新計(jì)算引擎("重計(jì)算引擎")的示例性功能組件模塊的邏輯表 示。
圖2描繪了根據(jù)本發(fā)明的一個(gè)實(shí)施例的由圖l所示的系統(tǒng)執(zhí)行的、用于加 載電子表格應(yīng)用程序并確定要對其使用的處理器的個(gè)數(shù)的基本操作。
圖3示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的由
圖1所示的系統(tǒng)執(zhí)行的、用于用 圖1所描繪的重計(jì)算引擎執(zhí)行重計(jì)算操作的基本操作。
圖4描繪了根據(jù)本發(fā)明的一個(gè)實(shí)施例的示出使用圖1所示的功能組件模塊 的電子表格應(yīng)用程序中具有值和/或多個(gè)公式的單元格輸入項(xiàng)的示例性3x3電 子表格。
圖5示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的最初被加載到單計(jì)算鏈中的圖4 所示的電子表格單元格。
圖6A描繪了被重新排序成子鏈的統(tǒng)一重計(jì)算鏈的圖4和5所示的單元格。 圖6B示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的被加載到兩個(gè)重新計(jì)算引擎中并被分隔成依賴性等級的圖6A的子鏈,其中單元格之一被移至第二依賴性等級。
圖6C是示出根據(jù)本發(fā)明的其它實(shí)施例的用于如圖6A和6B的示例性實(shí)施 例中所描繪的將單元格重新排序成子鏈和依賴性等級的過程的操作特性的流 程圖。
圖7示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的由兩個(gè)單獨(dú)的重計(jì)算引擎對圖4 所示的單元格的處理,以及要對每一重計(jì)算引擎重新排序的單元格隊(duì)列。
圖8描繪了根據(jù)本發(fā)明的一個(gè)實(shí)施例的對圖7中排隊(duì)的單元格的非最優(yōu)重 新排序的表示。
圖9示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于同步圖7所示的重計(jì)算引擎的 線程的程序代碼。
圖10A是示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于啟動對圖2所示的單元格 中的值和公式的求值的過程的操作特性的流程圖。
圖10B是示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于掛起或觸發(fā)圖7所示的重 計(jì)算引擎的控制線程和/或異步線程的過程的操作特性的流程圖。
圖11是示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于用圖7所示的重計(jì)算引擎的 控制線程和異步線程對單元格重新排序的過程的操作特性的流程圖。
圖12是示出根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于允許控制線程對圖7所示的 隊(duì)列的單元格重新排序以便在僅適用控制線程的公式上工作并重新顯示單元 格的過程的操作特性的流程圖。
圖13示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的將控制線程公式重新排序到下一 依賴性等級的邏輯表示。
圖14A示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的采用多線程處理對循環(huán)公式的 處理。
圖14B是示出根據(jù)本發(fā)明的其它實(shí)施例的用于如圖14A的示例性實(shí)施例 中所描述的對計(jì)算鏈重新排序以供可能的循環(huán)引用檢測和求值的過程的操作 特性的流程圖。
圖15描繪其上可以實(shí)現(xiàn)本發(fā)明的各實(shí)施例的示例性計(jì)算系統(tǒng)。 詳細(xì)描述
8本發(fā)明現(xiàn)將參考其中示出了各具體實(shí)施例的附圖來更完整地描述各示例 性實(shí)施例。然而,其它方面能以許多不同的形式來實(shí)現(xiàn),并且在本發(fā)明中包括 具體的實(shí)施例不應(yīng)被解釋為將這些方面限于在此所述的各實(shí)施例。相反,包括 附圖中描繪的各實(shí)施例是為了提供全面和完整且將預(yù)期的范圍完全地傳達(dá)給 本領(lǐng)域技術(shù)人員的公開。在參考附圖時(shí),使用相同的附圖標(biāo)記來指示所有附圖 所示的相同的結(jié)構(gòu)和元素。虛線可用于示出可任選組件或操作。虛線也可用于 示出單元格從一個(gè)位置到另一位置的移動的邏輯表示。
用于用"N"個(gè)處理器和相應(yīng)的程序線程來處理電子表格重新計(jì)算的環(huán)境
100在圖1中示出。在一個(gè)實(shí)施例中,系統(tǒng)100包括處理模塊102,其包括操 作系統(tǒng)中的"N"個(gè)可用處理器,每一處理器具有在其上操作的重新計(jì)算引擎 ("重計(jì)算引擎")104。系統(tǒng)100還包括數(shù)據(jù)庫116、可用于從數(shù)據(jù)庫106 接收和發(fā)送數(shù)據(jù)以及與加載控制模塊112通信的I/O或發(fā)送/接收模塊114。加 載控制模塊進(jìn)而與邊界檢測模塊110通信,后者確定"臟"單元格的范圍和域, 或由于依賴于或支持另一單元格中改變的內(nèi)容而需要重計(jì)算的單元格的范圍 和域。在一個(gè)實(shí)施例中,臟單元格在從發(fā)送/接收模塊114接收到重新計(jì)算命令 的情況下被重新計(jì)算。
在使用系統(tǒng)100的多處理器環(huán)境的電子表格應(yīng)用程序中,有必要確定操作 系統(tǒng)中可用的處理器的個(gè)數(shù)。圖2描繪了由圖l所示的系統(tǒng)執(zhí)行的、用于加載 或調(diào)用電子表格應(yīng)用程序并確定要對其使用的處理器的個(gè)數(shù)的操作200的基本 初始化序列。開始操作202在與加載控制模塊112通信之后啟動,其中在加載 應(yīng)用程序操作204中加載電子表格應(yīng)用程序。在使用多個(gè)處理器,因此使用多 個(gè)程序線程來對電子表格鏈計(jì)算中的輸入項(xiàng),即"ENT"求值的實(shí)施例中,有 必要同步多個(gè)處理器對這些ENT的求值。因此,確定操作206確定操作系統(tǒng) 中的處理器,以及因而重計(jì)算引擎104的個(gè)數(shù)。存儲操作208將所確定處理器 個(gè)數(shù)及其訪問位置儲存在數(shù)據(jù)庫116中。在一個(gè)實(shí)施例中,所使用的處理器是 單獨(dú)的處理器,而在另一實(shí)施例中,它們是單個(gè)芯片上的一個(gè)或多個(gè)嵌入的協(xié) 處理器。進(jìn)而在分配操作209中將重計(jì)算引擎分配給每一處理器,然后過程200 的控制轉(zhuǎn)移到返回操作210。
現(xiàn)在轉(zhuǎn)向圖3,重計(jì)算過程300以開始操作302開始,該操作響應(yīng)于處理在圖1所示的系統(tǒng)100上運(yùn)行的電子表格內(nèi)的鏈計(jì)算的手動或自動計(jì)算或重新
計(jì)算請求而啟動。從開始操作302,由發(fā)送/接收模塊114接收重新計(jì)算請求, 并且如該請求所需從數(shù)據(jù)庫116中檢索數(shù)據(jù)。在一個(gè)實(shí)施例中,開始操作302 是由用戶做出的重新計(jì)算所顯示的電子表格的手動請求來觸發(fā)的。在另一實(shí)施 例中,開始操作302是由來自調(diào)用例程的請求自動觸發(fā),或在用戶改變ENT 中的值或公式或向電子表格添加另外的ENT時(shí)自動觸發(fā)的。不論具體的觸發(fā) 機(jī)制是什么,在操作304中標(biāo)識或"解析"重新計(jì)算請求。在解析操作304之 后,在操作306中確定重計(jì)算請求的域和范圍。在一個(gè)實(shí)施例中,這僅涉及一 個(gè)ENT。在另一實(shí)施例中,它涉及依賴于或支持改變的單元格內(nèi)容,即"臟" ENT的ENT數(shù)組。從確定操作306,過程300前進(jìn)到重計(jì)算操作308,該操作 根據(jù)本發(fā)明的實(shí)施例來重新計(jì)算臟單元格。當(dāng)重新計(jì)算完成時(shí),控制轉(zhuǎn)移到返 回操作310,該操作將操作返回到調(diào)用代碼或用戶界面。
圖4描繪了可利用以上參考圖3所描述的過程來重新計(jì)算的示例電子表格 400。在該3x3的電子表格的示例性表示中,行402中的單元格A1和B1被示 為具有示例性值"=1 "。行404中的單元格A2和B2被示為分別具有公式=八1 和二B1,它們表示依賴于Al和B1的公式。類似地,行406中的單元格A3和 B3被示為分別具有公式A2和B2,它們表示依賴于A2和B2的公式。最后, 單元格C3被示為具有公式-A3+B3,這意味著其依賴于A3和B3。如上所述, 單元格Al到C3的內(nèi)容可包括必須被計(jì)算或重新計(jì)算的值或公式,且因此每 一單元格的內(nèi)容被稱為輸入項(xiàng),即"ENT"。例如,公式"=A3+B3"是位于 單元格C3中的ENT。
在用圖1所示的系統(tǒng)100加載或調(diào)用電子表格400時(shí),處理器通過基于對 電子表格本身的輸入將ENT以連貫的順序排序成單計(jì)算鏈來開始。圖5示出 了對圖4所示的電子表格400的單元格Al到C3的這一單計(jì)算鏈排序。僅作 為示例,單元格A1到C3中的ENT按照Al、 A2、 A3、 Bl、 B2、 B3、最后是 C3的順序輸入到電子表格400中。在如此最初將ENT排序成單鏈時(shí),程序代 碼將第一個(gè)ENT (即,此處所指的示例性實(shí)施例中的Al)置于計(jì)算鏈的最右 邊末端。接下來的ENT按照連貫的順序添加,從右邊到左邊操作并以C3結(jié)束。
在繼而對單計(jì)算鏈500中的ENT求值時(shí),計(jì)算代碼以C3開始,并確定公式A3+B3依賴于單元格A3和B3中的公式。接著,在首先査看單元格A3 (因 為它是公式中的第一個(gè)命名單元格)時(shí),確定單元格A3是"臟"的,即待決 計(jì)算。在該實(shí)施例中,ENT "A3+B3"被稱為"依賴"公式,而單元格A3中 的公式被稱為"支持"公式。在本發(fā)明的一個(gè)實(shí)施例中,單計(jì)算鏈500被重新 排序以創(chuàng)建依賴和支持公式的統(tǒng)一鏈,該統(tǒng)一鏈利用其中的子鏈來組織成樹結(jié) 構(gòu)。在一個(gè)實(shí)施例中,依賴公式,例如C3被確定為第一個(gè)支持公式,例如A3 的子。此外,第一個(gè)支持公式可以成為其所依賴的第二個(gè)支持公式的子。
一旦C3被移為A3的子,則對單鏈中的下一單元格,即圖5所示的示例 性實(shí)施例中的B3求值。在試圖對B3求值時(shí),計(jì)算代碼發(fā)現(xiàn)B3依賴于單元格 B2,且B2為"臟"。B3因此變?yōu)锽2的子。類似地,該代碼試圖計(jì)算下一單 元格,即B2,并確定B2依賴于B1。 B2因此變?yōu)锽1的子,且因?yàn)锽3是B2 的子,因此產(chǎn)生了 Bl、 B2和B3的完整子鏈(示為圖6A中的鏈600中的子鏈 602)。接著,計(jì)算代碼試圖對A3求值并確定A3 (如上所述具有子C3)依賴 于支持公式A2,而A2本身依賴于A1。因此,產(chǎn)生了子鏈A1、 A2、 A3和C3。 該子鏈的一個(gè)示例性表示被示為圖6A中的子鏈604。
盡管鏈604示出了子鏈A1、 A2、 A3禾PC3,但圖6B中所描繪的本發(fā)明 的另一示例性實(shí)施例示出了其中移除了 C3的類似的子鏈610,其中C3被包括 在位于根據(jù)本發(fā)明的另一實(shí)施例的單獨(dú)"依賴性等級"620中的其自己的子鏈 612中。實(shí)際上,圖6B示出了兩個(gè)離散的依賴性等級,即依賴性等級#1 (618) 和依賴性等級#2 (620)。每一依賴性等級包含除了依賴于該依賴性等級內(nèi)的 子鏈中的支持公式之外僅依賴于先前的依賴性等級中的ENT的ENT。這一實(shí) 施例中的安排允許一個(gè)或多個(gè)處理器在不必等待未計(jì)算的支持ENT被計(jì)算的 情況下以連續(xù)的方式處理整個(gè)依賴性等級中的ENT。
分開的依賴性等級的好處可以在計(jì)算鏈600的示例性實(shí)施例中展示,其中 C3是A3的子,而A3進(jìn)而是A2和Al的子。如圖400所示,C3依賴于A3 和B3中的公式的和。C3因此依賴于A3和B3。如果B3在計(jì)算代碼試圖對子 鏈604中的C3求值之前被計(jì)算,則當(dāng)計(jì)算代碼到達(dá)C3時(shí)沒有延遲(即,計(jì) 算代碼能夠立即計(jì)算C3,因?yàn)锳3和B3都己被計(jì)算)。因此,這一實(shí)施例中 的C3可以作為子鏈604的一部分保留。然而,在B3未在計(jì)算代碼對C3求值
11之前計(jì)算的情況下,計(jì)算代碼將不能夠計(jì)算C3。因此,只要B3保持未計(jì)算, C3就保持未計(jì)算。由此,基于C3對B3的依賴性,對子鏈604的處理被暫停、 或停止。這一依賴性可能會造成重計(jì)算處理中的低效。 一個(gè)實(shí)施例因而將C3 (612)從依賴性等級#1 (618)移至依賴性等級#2 (620),如圖6B中的統(tǒng)一 計(jì)算鏈606所示。
在其中有多個(gè)處理器可用的一個(gè)實(shí)施例中,將C3移至新依賴性等級允許 第二處理器對子鏈610操作以完成該子鏈的處理并在第一處理器繼續(xù)對子鏈 608的處理的同時(shí)移至對依賴性等級#1中的另一ENT或子鏈的處理。這多個(gè) 處理器被示為圖6B中的重計(jì)算引擎M和弁2 (分別為614和616),因?yàn)槊恳?處理器包括在其上運(yùn)行的一重計(jì)算引擎。盡管根據(jù)本發(fā)明的一個(gè)實(shí)施例在圖6B 中示出了兩個(gè)重計(jì)算引擎,但是如圖l中的省略號104所示,可以對計(jì)算和重 計(jì)算操作采用任意數(shù)量"N"的處理器。
圖6C示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于執(zhí)行對ENT及其向下一依賴 性等級的移動(如果有)的重新排序的過程622。開始操作624響應(yīng)于將單元 格加載到電子表格程序400中以及對重新計(jì)算的調(diào)用而啟動。從開始操作624, 過程622前進(jìn)到排序操作626,在排序操作中,如上所述,ENT基于其輸入到 電子表格程序400中的順序被排序成單計(jì)算鏈。接著,求值操作628試圖對單 計(jì)算鏈中的第一個(gè)公式求值。在試圖對第一個(gè)公式求值之后,過程622前進(jìn)到 查詢操作630,該操作確定第一個(gè)公式是否依賴于支持公式。如果該第一個(gè)公 式依賴于一支持公式,則流程通過"是"分支到移動操作634,后者將第一個(gè) 依賴公式移至支持公式的子部分。如果第一個(gè)公式不依賴于支持公式,則流程 通過"否"分支到求值操作632并對第一個(gè)公式求值。
從移動操作634,過程622前進(jìn)到查詢操作636,后者確定第一個(gè)公式是 否還依賴于第二個(gè)未計(jì)算的公式。如果查詢操作636確定第一個(gè)公式依賴于第 二個(gè)未計(jì)算的公式,則流程通過"是"分支到移動操作642,后者將第一個(gè)依 賴公式移至下一依賴性等級。接著,查詢操作644確定在該計(jì)算鏈中是否有任 何其它公式要求值,并且如果是,則通過"是"分支到求值操作628。如果查 詢操作644確定沒有其它公式要求值,則流程通過"否"分支到結(jié)束過程622 的終止操作646。如果查詢操作636確定第一個(gè)依賴公式不依賴于第二個(gè)未計(jì)算的支持公式,則流程通過"否"分支到查詢操作638,后者確定第一個(gè)支持 公式是否還有第二個(gè)依賴公式。如果査詢操作確定第一個(gè)支持公式?jīng)]有第二個(gè)
依賴公式,則流程通過"否"分支到求值操作632。另一方面,如果査詢操作 638確定第一個(gè)支持公式還有第二個(gè)依賴公式,則流程通過"是"分支到移動 操作640,在移動操作640中,將第一個(gè)和第二個(gè)依賴公式移至下一依賴性等 級。從移動操作640,過程622前進(jìn)到查詢操作644以確定是否有任何其它公 式需要求值,并且該過程如上所述地繼續(xù)。
盡管圖6A、 6B和6C中討論的對ENT的重新排序與一般不考慮處理器的 個(gè)數(shù)(即,使用一個(gè)或多個(gè)處理器)的重新排序有關(guān),但是圖7具體地示出了 通過使用多個(gè)重計(jì)算引擎和異步線程對來自電子表格400的單計(jì)算鏈的重新排 序700。采用控制線程702來同步各線程和重計(jì)算引擎。在系統(tǒng)700的示例性 實(shí)施例中,采用了兩個(gè)重計(jì)算引擎704和712;然而,其它實(shí)施例可涉及任意 數(shù)量的重計(jì)算引擎和相應(yīng)的多線程處理操作。
根據(jù)圖7所描繪的示例性實(shí)施例,來自重計(jì)算引擎1 (704)的處理線程 試圖對單計(jì)算鏈708中的C3求值。由于C3依賴于尚未計(jì)算的A3和B3,因 此C3還不能被計(jì)算。因此,重計(jì)算引擎1將C3移至其依賴和支持公式的隊(duì) 列706。 C3作為依賴公式列出,而A3作為.C3的支持公式列出。接著,重計(jì) 算引擎2 (712)的程序線程試圖對B3求值。當(dāng)無法對該依賴公式求值時(shí),重 計(jì)算引擎2將依賴B3及其支持公式B2移至其自己的依賴和支持公式隊(duì)列710。 該過程繼續(xù),直到重計(jì)算引擎嘗試對單計(jì)算鏈708中的每一ENT求值為止。
一旦鏈708中的每一 ENT被求值或試圖被求值,即由控制線程702基于 其依賴/支持關(guān)系將隊(duì)列706和710重新排序成子鏈。類似于以上討論的子鏈 604,圖8示出了具有ENT Al、 A2、 A3和C3的子鏈804。子鏈802示出了 ENTB1、 B2禾t!B3。這些子鏈最初都被示為位于圖8的依賴性等級#1 (806) 中。在一個(gè)實(shí)施例中,重計(jì)算引擎l (704)處理由B1、 B2和B3構(gòu)成的子鏈 802。然后,當(dāng)重計(jì)算引擎1開始處理子鏈802時(shí),重計(jì)算引擎2開始處理子 鏈804。在該示例性實(shí)施例中,假定重計(jì)算引擎1在重計(jì)算引擎2到達(dá)子鏈804 的C3之前完成對子鏈802中的B3的處理。在這一情況下,C3可被求值,因 為支持公式A3和B3都已被計(jì)算。在該實(shí)施例中,C3被示為位于依賴性等級#1 (806)中,并且依賴性等級#2 (808)在圖8中被示為空。然而,在另一實(shí) 施例中,(出于多種原因)有可能重計(jì)算引擎1在重計(jì)算引擎2試圖對C3求 值之前不能對B3求值。在這一情況下,C3將保持未計(jì)算,并且重計(jì)算引擎2 保持停止,同時(shí)等待重計(jì)算引擎1完成其對B3的處理。這一停止阻止重計(jì)算 引擎2處理可能存在于第一依賴性等級中的其它ENT和子鏈(盡管這些額外 子鏈沒有在圖8的示例性實(shí)施例中示出)。停止的重計(jì)算引擎是對多處理器系 統(tǒng)的多線程化處理能力的低效使用(即,其中重計(jì)算引擎2的所請求的重計(jì)算 操作依賴于單個(gè)重計(jì)算引擎l的處理速度)。由此,圖8所示的實(shí)施例并不是 單元格的最優(yōu)重新排序。相反,最優(yōu)重新排序?qū)⒈憩F(xiàn)為圖6B所示并在以上參 考其討論的示例性實(shí)施例。
盡管圖8示出了對ENT的非最優(yōu)重新排序800,其中C3保留在依賴性等 級#1 (806)中,但其它實(shí)施例(其中B3在對C3求值時(shí)保持未計(jì)算)要求將 C3移至依賴性等級#2 (808)。在一個(gè)實(shí)施例中,支配ENT向下一依賴性等 級的移動的規(guī)則為
(1) 試圖使依賴公式成為支持公式的子。
(2) 如果依賴公式已經(jīng)是另一公式的子,則將該依賴公式對下一依賴性 等級排隊(duì);或者
如果依賴公式所依賴的支持公式已經(jīng)有一個(gè)子,則將該依賴公式對 下一依賴性等級排隊(duì)。
(3) 如果一公式包含必須在控制線程上求值的函數(shù),則該公式(稱為"控 制線程公式")被移至下一依賴性等級。僅作為示例,以下函數(shù)必須在控制線 程上求值.-
(a) INDIRECT函數(shù);
(b) GETPIVOTDATA函數(shù);
(c) INFO函數(shù);
(d) ADDRESS函數(shù);
(e) 用戶定義函數(shù)(UDF)。
現(xiàn)在轉(zhuǎn)向圖9,根據(jù)本發(fā)明的一個(gè)實(shí)施例示出了用于觸發(fā)和掛起圖7所示 的重計(jì)算引擎1和2的異步線程的程序代碼900的示例性實(shí)施例??刂凭€程902控制異步線程的觸發(fā)。最初,計(jì)數(shù)器906被設(shè)為從確定操作206確定的處理器 的個(gè)數(shù)。計(jì)數(shù)器906可以是任何類型的計(jì)數(shù)器。在一個(gè)示例性實(shí)施例中,計(jì)數(shù) 器906可被稱為ISpirming。不論所使用的計(jì)數(shù)器的期限或類型如何,控制線程 ("CT" ) 902中的計(jì)數(shù)器906都被設(shè)為被確定為對多線程處理可用的處理器 的個(gè)數(shù)。在圖9的示例性實(shí)施例中,計(jì)數(shù)器906因而對重計(jì)算引擎910和920 被設(shè)為值"2"。此外,控制線程索引904,例如intientNext被設(shè)為零("0"), 并且每一重計(jì)算引擎索引914和924, int正NT被設(shè)為"0"。這些索引如下所 述控制ENT 912和922的指針。索引值"0"是對單計(jì)算鏈918的左邊的第一 個(gè)單元格,即C3的索引。
圖IOA和IOB示出了觸發(fā)和掛起重計(jì)算引擎1 (910)和2 (920)的異步 線程操作以對單計(jì)算鏈918求值的操作步驟1000。圖10A的開始計(jì)算操作1002 響應(yīng)于對如圖4所示的電子表格400等電子表格求值的加載或調(diào)用而啟動。在 設(shè)置操作1004中,將計(jì)數(shù)器906設(shè)為重計(jì)算引擎的個(gè)數(shù)。接著,在分配操作 1006中,控制線程902將重計(jì)算引擎1和2的索引914和924分別設(shè)為"0", 使得每一線程被分配為在第一個(gè)ENT處開始求值??刂凭€程卯2然后在觸發(fā) 操作1009中觸發(fā)每一重計(jì)算引擎上的事件916和926以喚醒用于處理的線程。 應(yīng)用程序的調(diào)用或加載是其中控制線程902可觸發(fā)重計(jì)算引擎事件的事件的一 個(gè)示例。在被觸發(fā)之后,每一重計(jì)算引擎執(zhí)行線程安全互鎖遞增操作1010。例 如,重計(jì)算引擎910通過對控制線程索引904加"1"并作為返回從控制線程 902接收先前一索引值904,即本實(shí)施例中的"O"來開始該互鎖遞增操作1010。 第一個(gè)重計(jì)算引擎的索引值914和從控制線程902返回的控制線程索引904的 值之差是重計(jì)算引擎1應(yīng)沿著單計(jì)算鏈918向下迭代的值。在該示例性實(shí)施例 中,重計(jì)算引擎l (910)將控制線程索引904的值從值"0"遞增到值"1"。 由于"O"是控制線程索引904的前一值,因此重計(jì)算引擎1 (910)接收值"0", 將其與其自己的索引914的值,即根據(jù)該示例性實(shí)施例的"0"進(jìn)行比較,以 確定這兩個(gè)值之差,即"0"減"0"等于"0",并接收值"0"。值"0"要 求重計(jì)算引擎l (910)對計(jì)算鏈918中的第一個(gè)ENT (即,C3)求值。
類似地,重計(jì)算引擎2 (920)執(zhí)行線程安全互鎖遞增操作,其中它將控 制線程索引卯4從"1"遞增到"2",并作為返回接收控制線程索引904的先前值,即該示例性實(shí)施例中的"1"。重計(jì)算引擎2 (920)然后將該從控制線 程索引904返回的值"1"與其自己的索引值,即本示例性實(shí)施例中的"0"進(jìn) 行比較,并計(jì)算兩個(gè)值之差"1"。值"1"由此要求重計(jì)算引擎2 (920)對計(jì) 算鏈918中的第二個(gè)ENT (即,B3)求值。
在一個(gè)實(shí)施例中,該線程安全互鎖遞增繼續(xù),直到依賴性鏈的末尾。在執(zhí) 行了互鎖遞增操作1010之后,每一重計(jì)算引擎在操作1012中開始對所分配的 ENT的求值。在觸發(fā)了異步線程以對鏈918求值之后,控制線程902在步驟 1014掛起其自己的操作并等待其自己的事件908被觸發(fā)。過程1000然后轉(zhuǎn)移 到返回操作1016。
在一個(gè)實(shí)施例中,重計(jì)算引擎的操作可以由重計(jì)算引擎本身單獨(dú)掛起。在 另一實(shí)施例中,重計(jì)算弓I擎可要求所有異步線程都被掛起。在第一個(gè)實(shí)施例中, 當(dāng)?shù)竭_(dá)依賴性等級的末尾時(shí)異步線程掛起其自身。在另一實(shí)施例中,異步線程 可在該線程的隊(duì)列或緩沖區(qū)因依賴和支持公式變滿時(shí)掛起。其它實(shí)施例可涉及 掛起異步線程的其它原因。此處給出的示例旨在僅用作示例性實(shí)施例。在另一 實(shí)施例中,異步線程可要求所有線程被暫停(例如,在異步線程檢測到控制線 程公式的情況下)。
在如以上圖10A所述地觸發(fā)了線程操作之后,根據(jù)一個(gè)示例性實(shí)施例在 圖10B中描述了用于掛起或暫停個(gè)別異步線程操作的"掛起"過程1018。根 據(jù)本發(fā)明的一個(gè)實(shí)施例,圖IOB所描繪的流程圖示出了兩個(gè)線程之間的操作的 發(fā)生。在另一實(shí)施例中,線程可同時(shí)操作。圖IOB所描繪的流程圖旨在僅用作 示例性實(shí)施例,并且決不應(yīng)被解釋為限制線程的操作。轉(zhuǎn)向圖IOB,如上所述, 線程可在其檢測到其達(dá)到了依賴性等級的末尾時(shí)掛起其操作。在另一實(shí)施例
中,線程可在其檢測到其隊(duì)列或緩沖區(qū)滿時(shí)暫停其操作。因此,從開始操作 1020,流程前進(jìn)到查詢操作1024,該操作確定是否達(dá)到了依賴性等級的末尾, 或者重計(jì)算引擎#1的緩沖區(qū)是否滿。如果查詢操作1024確定尚未達(dá)到依賴性 等級額末尾并且該線程的緩沖區(qū)未滿,則流程通過"NO"到繼續(xù)操作1026, 在該操作中,線程繼續(xù)對ENT求值并沿著計(jì)算鏈向下迭代。另一方面,如果 查詢操作1024確定已經(jīng)到達(dá)依賴性等級的末尾或者線程的緩沖區(qū)滿,則流程 通過"是"到遞減計(jì)數(shù)器操作1028。遞減計(jì)數(shù)器操作遞減控制線程的計(jì)數(shù)器
16906。在掛起其操作時(shí),重計(jì)算引擎將特別地遞減控制線程906的計(jì)數(shù)器。如 果計(jì)數(shù)器906具有大于"0"的值,則線程必定在操作或仍蘇醒?然而,當(dāng)計(jì) 數(shù)器的值為"0"時(shí),所有線程被掛起并且觸發(fā)控制線程902的事件908。在遞 減了控制線程計(jì)數(shù)器906之后,在睡眠操作1030中掛起重計(jì)算引擎#1,換言 之,將其置于睡眠模式。接著,查詢操作1032確定控制線程計(jì)數(shù)器906是否 等于"0"。如果計(jì)數(shù)器906的值為"0",則流程通過"是"分支到操作1034 處的觸發(fā)控制線程事件操作908,因?yàn)橹?O"指示所有異步線程被掛起。如果 計(jì)數(shù)器的值不為"0",則流程通過"否"分支到傳遞操作1036,在該操作中 控制被傳遞到重計(jì)算引擎#2。重計(jì)算引擎#2通過步驟1038到1048繼續(xù),這些 步驟類似于以上對重計(jì)算引擎#1所討論的步驟。
根據(jù)本發(fā)明的一個(gè)實(shí)施例示出了用于迭代通過計(jì)算鏈來確定必要的重新 排序并檢測控制線程公式(如果有)的過程IIOO。如上所述,圖ll所示的本 發(fā)明的示例性實(shí)施例示出了兩個(gè)線程之間的操作的發(fā)生。在另一實(shí)施例中,線 程可同時(shí)操作。圖11所描繪的流程圖旨在僅用作示例性實(shí)施例,并且決不應(yīng) 被解釋為限制線程的操作。轉(zhuǎn)向圖ll,開始操作1102在觸發(fā)了每一重計(jì)算引 擎的事件1008之后啟動。從開始操作1102,操作流程前進(jìn)到重計(jì)算引擎#1的 互鎖遞增操作1104。接著,重計(jì)算引擎#1在迭代操作1106中沿著計(jì)算鏈向下 迭代到通過線程安全遞增操作1104分配的所計(jì)算的ENT值。在到達(dá)了所分配 的ENT之后,流程傳遞到查詢操作1112,后者確定是否到達(dá)依賴性等級的末 尾,或者異步線程的隊(duì)列(或緩沖區(qū))是否滿。如果檢測到依賴性等級的末尾, 或者如果異步線程的隊(duì)列被確定為滿,則異步線程在暫停操作1116中暫停其 自己的操作。如果要求暫停的這些項(xiàng)中沒有一個(gè)存在,則過程1100前進(jìn)到確 定公式是否為控制線程公式的查詢操作1114。如果檢測到控制線程公式,則流 程通過"是"分支到排隊(duì)操作1115,后者將控制線程公式排隊(duì)成僅由這些公式 構(gòu)成的單獨(dú)的緩沖區(qū)或隊(duì)列。如果查詢操作114確定公式不是控制線程公式, 則流程通過"否"分支到查詢操作1120,后者確定所分配的ENT中的公式是 否依賴于未計(jì)算的ENT。如果查詢操作1120確定該公式依賴于未計(jì)算的ENT, 則流程在操作1122中通過"是"分支到隊(duì)列1,其中將依賴和支持公式置于適 當(dāng)?shù)年?duì)列中。如果查詢操作1120確定公式不依賴于未計(jì)算的ENT,則流程通過"否"分支在操作1118處對該公式求值,這返回一值。
在求值和排隊(duì)操作1118和/或1122之后,過程1100前進(jìn)到操作1124,在 該操作中操作被傳遞到重計(jì)算引擎#2。第二個(gè)重計(jì)算引擎執(zhí)行步驟1126到 1142,這些步驟類似于以上參考重計(jì)算引擎#1的操作1104到1124所描述的步驟。
現(xiàn)在轉(zhuǎn)向圖12,根據(jù)本發(fā)明的一個(gè)實(shí)施例示出了涉及用于將計(jì)算鏈重新 排序成統(tǒng)一的、經(jīng)重新排序的鏈的控制線程操作的過程1200。開始操作1202 響應(yīng)于對控制線程事件的觸發(fā)而啟動。從開始操作1202,流程前進(jìn)到重新顯示 電子表格400的單元格的重新顯示操作1203。在重新顯示操作1203之后,過 程1200前進(jìn)到查詢操作1204,該操作確定在重計(jì)算引擎的隊(duì)列中是否有任何 輸入項(xiàng)。如果查詢操作1204確定這些輸入項(xiàng)存在,則流程通過"是"分支到 重新排序操作1210。重新排序操作1210將依賴和支持公式重新排序成統(tǒng)一鏈 中的子鏈。 一旦完成了這一重新排序,查詢操作1218即確定是否形成任何子。 如果形成了子,則重計(jì)算操作必須再次通過包含這些新的子鏈的依賴性等級。 由此,如果形成了一個(gè)或多個(gè)子,則流程通過"是"分支到重置操作1224,該 操作重置重計(jì)算引擎的索引和指針以再次從該依賴性等級的開頭開始。從那 里,過程1200前進(jìn)到觸發(fā)異步線程的事件的喚醒操作1230。這些線程執(zhí)行經(jīng) 重新排序的鏈上的重計(jì)算操作。在觸發(fā)了重計(jì)算引擎之后,控制線程在睡眠操 作1232中掛起其自己的操作。
如果查詢操作1218確定在重新排序中沒有形成子,則隊(duì)列中的一個(gè)或多 個(gè)輸入項(xiàng)必定已被如操作1220所示地移至下一依賴性等級。如果沒有形成子, 則不必重計(jì)算當(dāng)前依賴性等級中的ENT。相反,對下一依賴性等級,在重置操 作1222中重置異步線程的索引和指針以及異步線程的控制索引。流程然后前 進(jìn)到查詢操作1226以確定在下一依賴性等級中是否有任何控制線程公式。如 果查詢操作1226確定在下一依賴性等級中有控制線程公式,則流程通過"是" 分支到允許控制線程對這些公式操作的執(zhí)行操作1228。 一旦對這些公式求值, 流程即前進(jìn)到觸發(fā)異步線程的事件的喚醒異步線程操作1230,并且如上所述處 理步驟1230和1232。如果查詢操作1226確定沒有這些公式,則流程通過"否" 分支到喚醒操作1230,并且過程1200如上所述前進(jìn)通過步驟1230和1232。如果查詢操作1204確定在重計(jì)算隊(duì)列中沒有輸入項(xiàng),則流程通過"否"
分支到查詢操作1206,后者確定在控制線程902的鏈表中是否有控制線程公 式。如上所述,控制線程公式是必須由控制線程而非由異步線程之一來求值的 公式。如果控制線程公式己被排隊(duì),則流程通過"是"分支到移動操作1212, 在移動操作1212中,將控制線程公式移至統(tǒng)一鏈中的下一依賴性等級。通過 將控制線程公式移至緊接在當(dāng)前依賴性等級之后的新依賴性等級,多線程處理 可在盡管存在對控制線程公式求值的需求的情況下繼續(xù)。從移動操作1212,流 程前進(jìn)到確定是否有任何其它控制線程公式的查詢操作1216。如果有其它排隊(duì) 的控制線程公式,則流程通過"是"分支到查詢操作1206并且重復(fù)以上步驟。 如果査詢操作1216確定沒有其它控制線程公式,則流程通過"否"分支到重 置操作1222,該操作將異步線程的索引和指針(以及相應(yīng)的控制線程的控制索 引)重置為下一依賴性等級。
在控制線程掛起其操作之前,它首先在查詢操作1226中確定在下一依賴 性等級中是否有任何控制線程公式,并且過程1200然后如上所述前進(jìn)通過步 驟1226到1232。
如果查詢操作1206確定沒有控制線程公式,則流程通過"否"分支到對 下一依賴性等級重置索引和指針的重置操作1222,并且過程1200如上所述前 進(jìn)通過步驟1222到1232。
盡管圖12中的步驟1206和1212涉及將控制線程公式移至緊接在當(dāng)前依 賴性等級之后的新依賴性等級,但是圖13示出了該移動的邏輯表示1300。圖 13示出了依賴性等級#1 (1302)和依賴性等級#2 (1310),其中C3 (1312) 位于依賴性等級#2中。此外,控制線程公式"CT" (1308)被示為在依賴性 等級#1中(還容納鏈1304和鏈1306)。如所討論的,為允許控制線程執(zhí)行僅 適用控制線程的公式,本發(fā)明的一個(gè)實(shí)施例將控制線程公式1308移至控制線 程隊(duì)列的鏈表。然后,當(dāng)控制線程被觸發(fā)并承擔(dān)了對操作和重新排序的控制時(shí), 控制線程將控制線程公式移至緊接在當(dāng)前依賴性等級之后的新依賴性等級。圖 13的示例性實(shí)施例因此示出控制線程公式1308被移動(1320)到依賴性等級 #2(1316),并且容納C3的依賴性等級現(xiàn)在變?yōu)閱为?dú)的依賴性等級#3 (1318)。 該實(shí)施例中僅示出了一個(gè)控制線程公式。在另一實(shí)施例中,多個(gè)控制線程公式可被移至新依賴性等級1316?;蛘撸恳豢刂凭€程公式可被移至依賴性等級#1
(1314)之后并且位于依賴性等級#3 (1318)之前的其自己的新依賴性等級。 在各實(shí)施例中,控制線程公式被移至下一依賴性等級,因?yàn)樵摽刂凭€程將 是在該依賴性等級末尾工作的線程。在觸發(fā)異步線程以開始下一依賴性等級中 的求值之前,控制線程可在觸發(fā)異步線程之前首先確定是否有需要被執(zhí)行的任 何控制線程公式。將控制線程公式移至單獨(dú)的依賴性等級允許多線程處理在同 時(shí)允許僅適用控制線程的操作的同時(shí)繼續(xù)。盡管圖13示出了三個(gè)依賴性等級, 但是可以存在任何數(shù)量的此類等級,并且此處所示的實(shí)施例的示例性本質(zhì)并不 旨在以任何方式限制這些可能的依賴性等級的數(shù)量。
如圖14A中邏輯地表示的本發(fā)明的一個(gè)實(shí)施例還允許具有多處理能力的 電子表格應(yīng)用程序在統(tǒng)一計(jì)算鏈的多線程處理中執(zhí)行循環(huán)引用計(jì)算(即,依賴 于彼此的計(jì)算)。電子表格1402示出了具有循環(huán)引用可能性的單元格Al到 A3。換言之,單元格Al中的公式依賴于A3, A3依賴于公式A2,而A2進(jìn)而 依賴于A1本身。為解決這一循環(huán)引用問題,本發(fā)明的一個(gè)實(shí)施例允許循環(huán)引 用單元格從統(tǒng)一鏈中取出或從其斷開,并置于單個(gè)鏈計(jì)算,即沒有子鏈或依賴 性等級的計(jì)算鏈中,以使用單個(gè)線程來計(jì)算。采用單鏈計(jì)算而非涉及子關(guān)系和 /或依賴性等級的統(tǒng)一鏈,迭代函數(shù)可對該鏈執(zhí)行迭代計(jì)算以在最終值上收斂。 IterativeCalc 1410是這一函數(shù)的一個(gè)示例;然而,根據(jù)本發(fā)明的各實(shí)施例可以 使用任何類型的用于計(jì)算循環(huán)依賴性的迭代函數(shù)。
為創(chuàng)建用于迭代循環(huán)計(jì)算的單鏈計(jì)算,單元格首先如上所述(即,基于其 向電子表格1402的輸入)置于單計(jì)算鏈1404中。在該示例性實(shí)施例中,Bl 首先被求值并被確定為不依賴于任何其它公式。接著,沿著鏈向下操作,A3 被確定為依賴于A2并被標(biāo)記為"進(jìn)行中",且從計(jì)算鏈移除以稱為支持公式 A2的子。沿著鏈1404向下到ENT A2,發(fā)現(xiàn)A2依賴于Al。 A2因此被標(biāo)記 為"進(jìn)行中",并從計(jì)算鏈1404移除到支持公式A1的子位置。在將A2移至 Al的子位置時(shí),A2將A3帶上。接著,沿著鏈1404向下到Al,試圖對Al 求值。然而,發(fā)現(xiàn)A1依賴于A3,使得在1406處標(biāo)識一循環(huán)依賴性。Al被標(biāo) 記為"進(jìn)行中"并從計(jì)算鏈1404中移除。結(jié)果,Al、 A2和A3現(xiàn)在如經(jīng)重新 排序的鏈1406所示完全從計(jì)算鏈1404斷開。因此,在迭代通過鏈的過程中,Al、 A2和A3將不被處理。因此,在完成通過鏈的迭代時(shí),Al、 A2禾卩A3將 仍被標(biāo)記為"進(jìn)行中"或臟。為了處理這些項(xiàng),系統(tǒng)跟蹤在當(dāng)前重新計(jì)算過程 期間成為另一公式的子的每一公式。接著,檢查在該過程中成為子的所有公式 來查看其中的任何公式是否被標(biāo)記為臟。如果是,則該公式及其所有子被移至 扁平計(jì)算鏈1408,即沒有子鏈或依賴性等級的計(jì)算鏈。圖14A的1408處所示 的該扁平計(jì)算鏈然后使用單個(gè)線程來計(jì)算。如果在單線程化計(jì)算期間,檢測到 真正的循環(huán)引用,則該計(jì)算可迭代地,例如通過迭代計(jì)算函數(shù)1410來完成。
現(xiàn)在轉(zhuǎn)向圖14B,根據(jù)本發(fā)明的一個(gè)實(shí)施例示出了用于將計(jì)算鏈重新排序 成扁平計(jì)算鏈以便進(jìn)行可能的循環(huán)引用檢測和求值的過程1411。開始操作1412 在創(chuàng)建單計(jì)算鏈1404時(shí)啟動。從開始操作1412,流程前進(jìn)到獲得計(jì)算鏈1404 中的第一個(gè)公式的獲得操作1414。求值操作1416然后對該公式求值。査詢操 作1418確定該公式是否是支持公式的子。如果該公式是一支持公式的子,則 流程通過"是"分支到跟蹤操作1420,并且該子公式被標(biāo)記為"進(jìn)行中"且被 系統(tǒng)跟蹤。如果該公式不是支持公式的子,則流程通過"否"分支到確定在計(jì) 算鏈1404中是否有任何其它公式要處理的查詢操作1422。如果有更多公式, 則流程通過"是"分支到移至計(jì)算鏈1404中的下一公式來求值的獲得操作 1414。如果有其它公式,則流程通過"否"分支到獲得被跟蹤公式操作1424, 該操作檢索從跟蹤操作1402跟蹤的第一個(gè)(或下一個(gè))公式。接著,查詢操 作1426確定所檢索的被跟蹤公式是否仍被標(biāo)記為臟。如果該公式仍被標(biāo)記為 臟,則流程通過"是"分支到扁平計(jì)算鏈操作1428,該操作根據(jù)本發(fā)明的一個(gè) 示例性實(shí)施例將該公式及其所有子添加到如扁平計(jì)算鏈1408所示的扁平計(jì)算 鏈。如果查詢操作1426確定被跟蹤公式不為臟,則流程通過"否"分支到查 詢操作1430,該操作確定是否有被跟蹤(或標(biāo)記為"進(jìn)行中")的任何其它公 式。如果有其它被跟蹤公式,則流程通過"是"分支到獲得第一個(gè)/下一個(gè)被跟 蹤公式操作1424,并且重復(fù)步驟1426到1430。如果查詢操作1430確定沒有 其它被跟蹤公式,則流程通過"否"分支到返回操作1432。 一旦通過過程1411 創(chuàng)建了扁平計(jì)算鏈,該扁平計(jì)算鏈(如在步驟1428中創(chuàng)建并示為扁平計(jì)算鏈 1408)可使用單個(gè)線程來計(jì)算。如果在單線程計(jì)算期間檢測到真正的循環(huán)引用, 則該公式可被迭代地計(jì)算。盡管在該示例性實(shí)施例中(并在描述圖14A時(shí))使
21用了 "進(jìn)行中"的跟蹤語言,但是根據(jù)本發(fā)明的各實(shí)施例可以使用任何標(biāo)記或 跟蹤機(jī)制。
圖15示出了其上可以實(shí)現(xiàn)本發(fā)明的示例性計(jì)算系統(tǒng)1500。圖2中示出了 具有至少一個(gè)處理器1502和在其上操作的至少一個(gè)重計(jì)算引擎1518的計(jì)算機(jī) 系統(tǒng)1500。系統(tǒng)1500具有電子表格應(yīng)用程序1520位于其中的存儲器1504。 在其最基本的配置中,計(jì)算系統(tǒng)1500在圖15中由虛線1506示出。另外,系 統(tǒng)1500還可包括另外的存儲(可移動和/或不可移動),其中包括但不限于磁 盤、光盤或磁帶。這樣的另外的存儲在圖15中由可移動存儲1508和不可移動 存儲1510示出。計(jì)算機(jī)存儲介質(zhì)包括以用于存儲諸如計(jì)算機(jī)可讀指令、數(shù)據(jù) 結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任何方法或技術(shù)來實(shí)現(xiàn)的易失性和非易失 性、可移動和不可移動介質(zhì)。存儲器1504、可移動存儲1508和不可移動存儲 1510都是計(jì)算機(jī)存儲介質(zhì)的示例。計(jì)算機(jī)存儲介質(zhì)包括,但不限于,RAM、 ROM、 EEPROM、閃存或其它存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD) 或其它光盤存儲、磁帶盒、磁帶、磁盤存儲或其它磁性存儲設(shè)備、或能用于存 儲例如所需電子表格計(jì)算信息且可以由系統(tǒng)1500訪問的任何其它介質(zhì)。任何 這樣的計(jì)算機(jī)存儲介質(zhì)都可以是系統(tǒng)1500的一部分。取決于計(jì)算設(shè)備的配置 和類型,存儲器1504可以是易失性的、非易失性的或兩者的某一組合。通信 介質(zhì)通常以諸如載波或其它傳輸機(jī)制等己調(diào)制數(shù)據(jù)信號來體現(xiàn)計(jì)算機(jī)可讀指 令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并包括任意信息傳送介質(zhì)。術(shù)語"已調(diào) 制數(shù)據(jù)信號"指的是其一個(gè)或多個(gè)特征以在信號中編碼信息的方式被設(shè)定或更 改的信號。作為示例而非限制,通信介質(zhì)包括有線介質(zhì),諸如有線網(wǎng)絡(luò)或直接 線連接,以及無線介質(zhì),諸如聲學(xué)、RF、紅外線和其它無線介質(zhì)。以上的任何 組合也應(yīng)包括在計(jì)算機(jī)可讀介質(zhì)的范圍內(nèi)。
系統(tǒng)1500還可包含允許該設(shè)備與其它設(shè)備通信的通信連接1512。另外, 為將內(nèi)容輸入到根據(jù)本發(fā)明的一個(gè)實(shí)施例的電子表格400的單元格中,系統(tǒng) 1500可具有輸入設(shè)備1514,諸如鍵盤、鼠標(biāo)、筆、語音輸入設(shè)備、觸摸輸入 設(shè)備等等。也可包括諸如顯示器、揚(yáng)聲器、打印機(jī)等輸出設(shè)備1516,其中這些 設(shè)備可用于向用戶顯示根據(jù)本發(fā)明的各實(shí)施例的電子表格400。所有這些設(shè)備 在本領(lǐng)域中是公知的并且不必在此詳細(xì)討論。以上參考附圖描述了本發(fā)明的各實(shí)施例,可以理解,可以對本發(fā)明做出本 領(lǐng)域技術(shù)人員易于想到且被包含在所公開并如所附權(quán)利要求書所定義的本發(fā) 明的精神和范圍內(nèi)的眾多修改。實(shí)際上,盡管出于公開的目的描述了目前優(yōu)選 的實(shí)施例,但可以做出落入本發(fā)明的范圍的各種改變和修改。
同樣地,雖然本發(fā)明使用了對結(jié)構(gòu)特征、方法動作和含有這些動作的計(jì)算 機(jī)可讀介質(zhì)專用的語言,但是應(yīng)該理解,在所附權(quán)利要求書中定義的本發(fā)明不 必限于此處描述的具體結(jié)構(gòu)、動作、特征或介質(zhì)。相反,上述具體特征和動作 是作為實(shí)現(xiàn)權(quán)利要求的示例形式公開的。例如,盡管在某些示例性實(shí)施例中示 出并討論了兩個(gè)重計(jì)算引擎,但是可使用任意數(shù)量"N"的處理器以及重計(jì)算 引擎。本領(lǐng)域技術(shù)人員將認(rèn)識到本發(fā)明精神和范圍中的其它實(shí)施例或改進(jìn)。因 此,這些具體結(jié)構(gòu)、動作、或介質(zhì)是作為實(shí)現(xiàn)所要求保護(hù)的本發(fā)明的示例性實(shí) 施例而公開的。本發(fā)明由所附權(quán)利要求書來定義。
權(quán)利要求
1. 一種處理電子表格程序(1520,500)中的公式的方法,包括將所述公式排序成單計(jì)算鏈(500,626);試圖對所述單計(jì)算鏈中的第一個(gè)公式求值(500,628);如果所述第一個(gè)公式依賴于所述單計(jì)算鏈中的支持公式,則將所述第一個(gè)公式移至所述支持公式的子位置(604、630、634);以及繼續(xù)對所述單計(jì)算鏈中的所有公式排序,直到每一依賴公式都成為其各自的支持公式的子并且得到具有一個(gè)或多個(gè)公式子鏈的統(tǒng)一鏈(602、604、644);。
2. 如權(quán)利要求1所述的方法,其特征在于,所述方法還包括 將所述統(tǒng)一鏈(602、 604)劃分成多個(gè)依賴性等級(618、 620),其中每一依賴性等級包括僅依賴于來自前一依賴性等級(618)的公式或其自己的子 鏈內(nèi)的公式(608、 610、 640、 642)的公式(608、 610、 612、 642、 640)。
3. 如權(quán)利要求2所述的方法,其特征在于,如果一依賴公式(612)是第 一個(gè)支持公式(610)的子并且依賴于未計(jì)算的第二個(gè)支持公式(608、 636、 642),則所述依賴公式被移至下一依賴性等級。
4. 如權(quán)利要求2所述的方法,其特征在于, 一支持公式具有第一個(gè)依賴 公式和第二個(gè)依賴公式,并且所述第一個(gè)和第二個(gè)依賴公式被移至下一依賴性 等級(638、 640)。
5. —種可由計(jì)算機(jī)系統(tǒng)(1500)讀取并且有形地包含可由所述計(jì)算機(jī)系 統(tǒng)執(zhí)行來執(zhí)行如權(quán)利要求1所述的方法的指令的程序的計(jì)算機(jī)程序產(chǎn)品(1508、 1520)。
6. —種使用多個(gè)處理器來計(jì)算電子表格程序中的公式的方法(200、1000), 包括確定處理器的個(gè)數(shù)(206); 將重新結(jié)算引擎分配給每一處理器(209);維護(hù)一控制線程以同步所述重新計(jì)算引擎的處理(1004);將所述公式排序成單計(jì)算鏈(700、 626);試圖用第一重新計(jì)算引擎對所述單計(jì)算鏈中的第一個(gè)公式求值(708、628、1120);如果所述第一個(gè)公式依賴于第一個(gè)支持公式,則將所述第一個(gè)依賴公式和第一個(gè)支持公式移至所述第一重新計(jì)算引擎的隊(duì)列(706、 636、 1122);試圖用第二重新計(jì)算引擎對所述單計(jì)算鏈中的第二個(gè)公式求值(708、 1124、 1138);如果所述第二個(gè)公式依賴于第二個(gè)支持公式,則將所述第二個(gè)依賴公式和 第二個(gè)支持公式移至所述第二重新計(jì)算引擎的隊(duì)列(710、 1138、 1140);以 及繼續(xù)沿著所述單計(jì)算鏈向下迭代,直到到達(dá)所述鏈的末尾(708、 706、 710、 1142、 644)。
7. 如權(quán)利要求6所述的方法,其特征在于,所述方法還包括清空每一重新計(jì)算引擎的隊(duì)列以便重新排序(1122、 1140),其中所述第 一個(gè)依賴公式成為所述第一個(gè)支持公式的子,并且其中所述第二個(gè)依賴公式成 為所述第二個(gè)支持公式的子(802、 804、 630、 634)。
8. 如權(quán)利要求7所述的方法,其特征在于,所述第二個(gè)支持公式本身是 第三個(gè)支持公式的子(804)。
9. 如權(quán)利要求6所述的方法,其特征在于,所述方法還包括 如果所述第一個(gè)公式依賴于第一個(gè)支持公式,則標(biāo)記所述第一個(gè)依賴公式以跟蹤它(1420);確定所述第一個(gè)支持公式是否依賴于所述第一個(gè)依賴公式(1414、 1418);如果所述第一個(gè)支持公式依賴于所述第一個(gè)依賴公式,則標(biāo)記所述第一個(gè) 支持公式以跟蹤它(1420);在完成通過所述單計(jì)算鏈的迭代后,檢索被跟蹤公式(1422、 1424);確定所述被跟蹤公式中的任一個(gè)是否為臟(1426);如果所述被跟蹤公式中的任一個(gè)為臟,則將所述被跟蹤公式及其一個(gè)或多 個(gè)子移至沒有任何子鏈或依賴性等級的扁平計(jì)算鏈(1428);以及使用單個(gè)線程來計(jì)算所述扁平計(jì)算鏈(1432)。
10. 如權(quán)利要求6所述的方法,其特征在于,所述方法還包括 確定所述第一個(gè)依賴公式是否依賴于未計(jì)算的第二個(gè)支持公式(802、804、(612、 636);以及如果所述第一個(gè)依賴公式依賴于所述第一個(gè)支持公式且依賴于所述未計(jì) 算的第二個(gè)支持公式,則將所述第一個(gè)依賴公式移至單獨(dú)的依賴性等級(610、 612、 618、 620、 636、 642)。
11. 如權(quán)利要求6所述的方法,其特征在于,所述方法還包括-確定所述第一個(gè)支持公式是否同時(shí)具有第一個(gè)依賴公式和第二個(gè)依賴公式(1132、 638);以及如果所述第一個(gè)支持公式同時(shí)具有第一個(gè)依賴公式和第二個(gè)依賴公式,則 將所述第一個(gè)和第二個(gè)依賴公式移至單獨(dú)的依賴性等級(612、 620、 638、 640)。
12. 如權(quán)利要求6所述的方法,其特征在于,所述方法還包括-確定在所述計(jì)算鏈中是否有任何公式要僅由所述控制線程來執(zhí)行(1206);以及將僅適用控制線程的公式移至單獨(dú)的依賴性等級(1212)。
13. 如權(quán)利要求6所述的方法,其特征在于,僅適用控制線程的公式被移 至緊接在當(dāng)前依賴性等級之后的依賴性等級(1130)。
14. 如權(quán)利要求6所述的方法,其特征在于,第一重新計(jì)算引擎的線程操 作在所述線程到達(dá)依賴性等級的末尾時(shí)被掛起(1132、 1134)。
15. 如權(quán)利要求6所述的方法,其特征在于,第一重新計(jì)算引擎的線程操 作在所述第一重新計(jì)算引擎的隊(duì)列滿時(shí)被掛起(1132、 1134)。
16. 如權(quán)利要求6所述的方法,其特征在于,.僅適用控制線程的公式被置 于針對這些公式的隊(duì)列中(1132、 1130)。
17. —種可由計(jì)算機(jī)系統(tǒng)讀取并有形地包含了可由計(jì)算機(jī)系統(tǒng)(1500)執(zhí) 行來執(zhí)行如權(quán)利要求6所述的方法的指令的程序的計(jì)算機(jī)程序產(chǎn)品(1508、 1520)。
18. —種通過使用依賴性等級對電子表格應(yīng)用程序中的計(jì)算鏈重新排序的方法,包括創(chuàng)建包括第一子鏈和第二子鏈的第一依賴性等級(618、 608、 610、 642、 640);試圖對所述第一子鏈中的每一公式求值(608、 628);試圖對所述第二子鏈中的每一公式求值(608、 628); 如果一公式不能被求值,則確定所述公式是否依賴于其自己的子鏈中的第 一個(gè)支持公式以及依賴于同一依賴性等級內(nèi)的另一子鏈中的第二個(gè)支持公式 (612、 620、 630、 636);確定所述第二個(gè)支持公式是否未計(jì)算(612、 620、 636); 如果所述第二個(gè)支持公式未計(jì)算,則將所述依賴公式移至下一依賴性等級 (612、 642);以及如果所述第二個(gè)支持公式已計(jì)算,則對當(dāng)前依賴性等級中的所述依賴公式 求值(604、 632)。
19. 如權(quán)利要求18所述的方法,其特征在于,所述方法還包括 確定第一個(gè)依賴公式所依賴的所述第一個(gè)支持公式是否已經(jīng)具有第二個(gè)依賴公式作為子(630、 638);以及如果所述第一個(gè)支持公式已經(jīng)具有子,則將所述第一個(gè)和第二個(gè)依賴公式 移至下一依賴性等級(638、 640)。
20. 如權(quán)利要求18所述的方法,其特征在于,所述方法還包括 確定是否有任何僅適用控制線程的公式(1206);以及 如果有僅適用控制線程的公式,則將這些項(xiàng)移至下一依賴性等級(1206、1212)。
全文摘要
本發(fā)明涉及利用各自具有單獨(dú)的重新計(jì)算引擎的多個(gè)處理器來處理電子表格應(yīng)用程序中的鏈計(jì)算的方法和系統(tǒng)。單計(jì)算鏈可被重新排序成其中支持和依賴公式被組織成子鏈的樹分層結(jié)構(gòu)的統(tǒng)一鏈。該統(tǒng)一鏈被進(jìn)一步劃分成依賴性等級,其中每一依賴性等級中的輸入項(xiàng)可在重新排序期間被移至下一依賴性等級。如果一個(gè)依賴性等級內(nèi)的輸入項(xiàng)依賴于未在其自己的子鏈中找到的另一輸入項(xiàng),則對該統(tǒng)一鏈排序以使得一輸入項(xiàng)僅依賴于前一依賴性等級中的輸入項(xiàng)。此外,依賴性等級允許控制線程在維持多線程處理能力的同時(shí)執(zhí)行僅適用控制線程的操作。
文檔編號G06F17/21GK101438276SQ200780016503
公開日2009年5月20日 申請日期2007年5月8日 優(yōu)先權(quán)日2006年5月8日
發(fā)明者A·貝克, D·坎貝爾, J·J·杜扎克, M·J·安德羅斯奇 申請人:微軟公司