第十一章 數據庫管理類的實現

                                                              第十一章      數據庫管理類的實現


           文件目錄系統是一個類;它的方法表只有一個,而屬性表較爲特殊,可以包含很多類的對象;並是可以動態增長的;可以說文件目錄系統是一個多類的對象集。數據庫是文件目錄系統中的一個子目錄;從某種角度看,我們也可以將文件目錄系統看是一個數據庫。其實,很多資源管理都具有數據庫的特徵;如內存、磁盤空間,進程,一個進程中的線程、對象、類、打開的文件號、消息等等的管理。我們把這些等等、都看作是系統對象,那麼如何管理這些系統對象?它們的抽象點是什麼?無論如何,對象都是由表、從而數據變量、子表構成;而數據都是位的容器;只是大小和保存方式不一樣吧。表由一些變量組成,而變量也可能是另一個表或動態表;動態表的成員也可能是一個表;這樣會有2種基本形式:
1、表中表、表再表…樹狀結構,典型的就是文件目錄系統。
2、動態變化的表,即是成員數變化的表;如果動態表的成員都具有相同的類型,稱爲線性表。

          2種形式都有,典型的是我們常用的數據庫;數據庫作爲一個目錄節點,而子節點就是目錄下的一堆表文件。文件表通常是由文件頭屬性表和文件體屬性表構成;如果我們把一個表的基本不變部分的屬性放在文件頭,而線性表作爲文件體;那就是表文件。這時,線性表的成員通常叫爲記錄。目錄就可以看作是一個線性表;它的成員記錄就是文件。


          理論上,動態表是不可窮盡的;但資源是有限的。在APO中,一個卷下的文件和目錄數、也即是i節點數是不能超過4G個的。一個目錄下的文件和子目錄數不能超過4G個。一個動態表的成員數大小不能超過4G個;動態表的成員也可以是一個表。所以,一個線性表的記錄如超過4G個;你可放到另一個表文件。理論上,一個數據庫可以16E個記錄,實際上不行;因爲不能超過一個卷的磁盤空間4G個數據塊 = 8PB。


         動態表有2種模式:大模式,成員數大小不超過4G個;小模式,成員數大小不超過64K個。對資源的管理,2種模式都可能使用到。比如,本地內存的管理:本地內存有64K個塊,以連續塊分配、釋放的管理模式就是小模式。每個數據塊有64K個行,以連續行分配、釋放的管理模式就是大模式。又比如通常的數據庫:線性表文件數、線性表中的記錄數是使用大模式;而一個表的字段數則是用小模式。又比如一個卷的磁盤空間4G個數據塊的管理:一個單元是64K個數據塊,一個卷有64K個單元。一個頁域有64個頁區,一個頁區有64K個頁;一個頁是256行,即256E。所以,以連續單元、連續頁區分配、釋放的管理模式就是小模式。以連續數據塊、連續頁分配、釋放的管理模式就是大模式。不管如何,對錶中的成員進行操作的基本方法有4種:增加、刪除、修改、查詢。後2種方法通常是不同的應用程序去實現的,前2種方法是可以抽象爲普式的方法。從另一個角度看,增加、刪除可以看作是對資源的分配、釋放。如果我們用一個二進制位來表示一個資源單位;資源單位可能是一段連續行、或一段連續數據塊、或一條記錄、或一個文件、或一個進程、或一個進程中的一個線程、或一段連續頁、或一段連續頁區、或一段連續單元、或一個i節點、或進程中的一個打開的文件號、或線性表中的一個字段、或進程中的一個類號、或進程中的一個對象號、或一個消息號、或一個過程號等等。這樣,對應於小模式,需要64K個位來表示;也即BU64K A;  64K位的位圖變量A就對應一個小模式。而大模式則需要64K個64K位的位圖變量來描述。一個64K位的位圖變量只是佔存儲空間256E,並不多;但大模式需要佔存儲空間256個數據塊,就比較多了。爲減少空間的浪費;對於大模式,我們通常是動態生成的。最初只是分配一個位圖變量數據塊,該塊有256個64K位的位圖變量;可以管理大模式中的16M個單位。如果還不能滿足時,再申請分配一個位圖變量數據塊。。。最終會生成有n個(n <= 256)位圖變量數據塊。只要我們編寫了大、小模式的分配、釋放方法放於系統方法表內;那麼,所有的程序類都將受益;無須重複的代碼。增加、刪除數據庫表中的一條記錄,或目錄下的一個文件,或磁盤空間中的一段連續數據塊,或數據庫下的一個表文件,或磁盤空間中的一段連續頁,或磁盤空間中的一個i節點,或本地內存中的一段連續行等等;都是調用大模式下的分配、釋放方法。增加、刪除數據庫表中的一個字段,或一個進程中的一個對象號或類號或線程號或過程號或消息號或打開的文件號,或磁盤空間中的一段連續單元,或一個進程,或磁盤空間中頁域下的一段連續頁區,或本地內存中的一段連續數據塊等等;都是調用小模式下的分配、釋放方法。APO中的位圖是位爲1,表示空閒;位爲0表示佔用。增加、刪除只是對位圖變量的操作,而不是對對象的具體內容進行。比如,刪除一個文件;只是對代表文件所佔磁盤空間的位圖變量中的一些位做釋放;如果,這些空間沒有被其它文件佔用;那麼空間還是原來文件的內容。

         單位是指空間的劃分單位。一個單位,如果是表示xx號,就很好辦;它對應大、小模式中的一個位;結果就是位序號。無論如何,一個單位就是一種規定的位容器。內存、磁盤空間的位容器規格是固定的,有:行E、數據塊64KH、頁256E、頁區64K頁、單元64K個數據塊、頁域64K個頁區、卷64K個單元。不過,似數據庫表中的一條記錄等;單位就不一定是固定的。一條記錄或許是600E,或許是一頁,或許是10個數據塊等等。不管如何,它們最終都是需要磁盤空間、內存空間的固定位容器來裝載。一條記錄的單位大小,第0號記錄在內存空間的開始地址會在表文件頭表現、第0號記錄在磁盤空間的開始地址會在表文件的目錄項體現。爲何要用連續單位分配、釋放?目的是要取消低速的鏈表方式。如果一個表文件大小是1G個數據塊,如果用鏈表方式;你大約要1G次I/O及磁道定位,才能找到最後的記錄;差不多用3000小時。就算你把鏈表頭指針放在公共文件來提高速度,也要多佔4GB的空間。使用連續單位分配,空間、時間都要省得多;1G個數據塊可以分配連續16K個單元;即使是逐步生成的,也不會有多少段;鏈表可以很小。爲何文件的磁盤空間定位、大小放在目錄項?假如要刪除一個具有1G個文件或子目錄的目錄;那麼只是對一個目錄文件進行I/O及釋放;否則,3000小時都算是快的了。


對應小模式:
     數據庫表中的一個字段,或一個進程中的一個對象號或類號或線程號或過程號或消息號或打開的文件號,或磁盤空間中的一段連續單元,或一個進程,或磁盤空間中頁域下的一段連續頁區,或本地內存中的一段連續數據塊。將空間劃分成一個單位是1/64K。


對應大模式:
     數據庫表中的一條記錄,或目錄下的一個文件,或磁盤空間中的一段連續數據塊,或磁盤空間中的一段連續頁,或磁盤空間中的一個文件i節點,或本地內存中的一段連續行。將空間劃分成一個單位是1/4G。


1、小模式管理
 
        APO的內核中,集成有64K位的多功能輔助硬件模塊;分配、釋放都在一個方法內執行。請求分配、或釋放一段連續單位;我們需要先把64K位的位圖變量拷貝進硬件模塊,之後執行分配、或釋放命令;完了再把64K位的位圖變量回傳。儘管,硬件模塊的執行時間只是10ns;但來回拷貝整個位圖256行卻需要256ns。所以,我們需要考慮;只是拷貝需要的那一行(只需1ns)進硬件模塊,來增加速度。爲此,增加一個變量BU32 A1; A1的高16位表示位圖中的最大連續爲1的數值,而低16位表示該數值所在的行序號。這樣,我們一開始先判斷A1H是否滿足要求;是,我們只拷貝A1L這行開始的相關行來進行分配;否,拷貝256行的整個位圖,來進行分配;A1重新設定。釋放相對來說要簡單,只是需要拷貝相關的行。對於非連續單位,即一個位的管理;就簡單多了。我們先拷貝16行,SS1;如成功才耗36ns,失敗拷貝下16行;最多循環16次。

小模式屬性表:
XMUB{                // 256E + 3W。
  BU64K XMUWT;     // 小模式管理位圖變量;256E。
  BU1W  MAXLX1;    // 位圖變量中的最大的連續爲1的位數及起始位號所屬的行號。
  BU1W  KSXYU;     // 位圖變量管理的空閒單位數。
  BU1W  UIJIU;     // 位圖變量管理的實際單位數。
}

分配:入口,申請的連續單位數或說是位數;出口,返回連續單位數的開始單位號、和位圖的最大連續單位數的開始單位號。失敗,狀態寄存器PSR的標誌,PSR.YJ = 0。
釋放:入口,釋放的連續單位數和開始單位號;出口,返回位圖的最大連續單位數的開始單位號。

管理員方法:GKLIYK( 命令參數變量B2,  參數變量B3,  XMUWT位圖變量地址,  MAXLX1 );
方法中的參數總是對應壓入R0-R3寄存器的。
硬件模塊YJMK有3個參數與控制寄存器B2、B3、B4。執行指令:SS1; 所以,你調用GKLIYK方法時,需要傳入這3個相關參數。
BU64K  YJMK; // 64K位的硬件模塊YJMK變量,分爲256行,每行256位。

與位操作相關:
B2H: 高8位爲指令屬性,低8位是指令碼。 最高位爲SS1啓動位;完成時,B2H.15 = 0。
B2L: 低16位是你要COPY進去的位圖行數 (也就是你的位圖大小)。
B3H: 高16位是你的申請或釋放的連續1位數。
B3L: 低16位是申請的連續1位數的返回結果開始位地址,或釋放的連續1位數的開始位地址。
B4:  返回結果:是位圖的最大連續1位數及開始位所屬的行號。
    爲保存B4返回結果,還需傳入位圖的最大連續1位數及開始位所屬的行號的變量地址到R3。
保存B4的返回結果,可以使得你下次時,一開始就知道如何判斷;也無須整個位圖放進去,只需一行;速度會加快很多。

硬件模塊YJMK的指令碼最多有16個,8位命令碼中只是低4位有效。跟位圖有關的常用的有5個:0—5號指令碼。
allot(分配指令),release(釋放指令)= Set(位置1),clr(位清0),CMP(比較)
compress(壓縮),insert(插入), replace(替換)三合一CIR指令。

指令功能:
SS1指令啓動後,需約6-10ns完成;期間用戶CPU空轉,直到SS1完成;才執行下一條指令。

allot(分配指令):搜索位圖滿足B3H個連續1位數的開始位地址到B3L;成功PSR.YJ = 1、還將B3H個連續1位數的1全部取反(變爲0,表示佔用)。等同搜索成功後,執行爲部分清0的clr指令。已經搜索完位圖、失敗,位圖內容不變,PSR.YJ = 0;B2H.15 = 0。

release(釋放指令):將你請求釋放的連續位數的開始位地址起的B3H個連續位0全部置爲1,釋放定成功;等同部分位置1的Set指令。 返回結果(R3) = B4是位圖的最大連續1位數及開始位所屬的行號。

CMP(無符號比較指令):最多隻是比較256行中的值;位圖內容不變。
B2H: 高8位的低4位是CMP屬性: 字/字符比較、關係/求值、關係有:等於/不等於,等於:小於等於/大於等於;不等於:大於/小於;如是求值有:最大值/最小值。0000x1xx,0000x0x0
B3:  32位是你需要與n行中的32位值比較的數值。n <= 256
B3H: 16位是你需要與n行中的16位值比較的數值。
B4L: 返回結果:R0 = B4L是第一個符合條件的字或字符開始地址;B4H不變,可作記錄號高半字
已經搜索完位圖、失敗; PSR.YJ = 0;B2H.15 = 0。

     一次比較只得到第一個符合條件的字或字符開始地址;可以保存B4,再SS1,直到搜索完位圖;PSR.YJ = 0爲止。這樣,多次SS1;就可得到256行中符合條件的多個記錄。可以自己編寫對多功能硬件模塊操作的方法,不一定非要調用GKLIYK()。

CMP指令對於數據庫查詢非常高效;如果一個字段是映射到字符或字數值,需要做數值條件查詢。那麼,我們可以一次拷貝256E = 2KW = 4KZ的數據段進硬件模塊來進行比較,如果平均一個數據段可查詢到1-8條符合條件的記錄;那麼,在內存中的數據庫表查找速度對字方式約是:
2K/0.27us ~= 7G條記錄/秒,對字符方式約是:14G條記錄/秒;即約爲150億條記錄/秒。

CIR指令:compress(壓縮),insert(插入), replace(替換)。
壓縮:可對1-256E中的指定字符或字進行清除,並壓縮存放。
插入:可對1-256E中的指定字符或字位置插入一個字符或字。
替換:可對1-256E中的指定字符或字進行替換,或指定位置的字符或字進行替換。

 
詳細以後用到再介紹;排序另文敘述。

    系統中的方法都可看作是“原子”的;你不必擔心調用方法時,中斷造成的同步競爭問題;即使是內核也不能搶佔。系統中的方法運行時間小於0.3us,通常小於0.1us。
    
GKLIYK(){ // 佔空間24W,3E;耗時:256行時,276ns ;佔用R31、R0、R2。 R1、R3不變
    B3 = R1; B2 = R0; //  R0 = 指令屬性.指令.行數n,
    R0H = &0x000F;
    COPY.H( YJMK,  XMUB, R0L ); // 傳送;B5+、B6+直到R0L- = 0。
    SS1;           // 開始執行,時間10ns。PSR.YJ = 0。    
    Switch(R0H){  // 4位一項的跳轉表;據R0H的值跳轉;PPCL = (PPCL + 1).R0H。
    Allot; release; clr; CMP; CIR; RET(保留); RET; …. 共11個RET。
}
Allot:
     BT0 PSR.YJ, UIBT;   // 失敗返回;不該回傳。
ALL1:
     R0L = B2L;
     COPY.H( XMUB, YJMK, R0L ); // 成功則回傳;B5-、B6-直到R0L- = 0。
     R0 = B3; (R3) = B4;         // 返回結果
UIBT:
     RET
release:  clr:
     JMP ALL1;    // 釋放或set對1位或連續位置1是必定成功的,跳回傳。
                    // clr對1位或連續位清0是必定成功的,跳回傳。
CMP:  CIR:
     R0 = B4;     // 無論失敗、成功都返回;在你的代碼中判斷PSR.YJ;不回傳。
     RET          // 17+H/2 ns,16行時爲25ns。

}

這是一個共用的方法;在之前,你還應落實具體的是那一行開始,是多少行。
比如向本地內存申請連續3個數據塊。
Allot1( 0.Allot.0.1, 3.0, mem_XMUB, mem_XMUB.MAXLX1 );

Allot1:
    CMPZ (R3).H, R1H;  // 最大連續1的值能滿足要求?
    JNN   ALT1;         // 是跳
    R0 = 0.Allot.1.0;   // 否,需要拷貝整個位圖256行。        
    GKLIYK();
    BT0 PSR.YJ, UIBTIL; // 失敗,跳錯誤處理。
    RET
ALT1:
    R2 = +(R3).L;       // 只拷貝一行;總耗時25ns。
    JMP GKLIYK();
UIBTIL:                 // 錯誤處理。。。
    ….
    RET

又比如向本地內存釋放一個對象,它佔連續300個數據塊;塊號開始地址1000。因爲釋放時,位圖中的最大連續1的數值和開始地址都會變化。最好,還是整個位圖拷貝進去;時間要多花點;也不到0.3us。所以,調用就是:
GKLIYK( 0.release.1.0, 300.1000, mem_XMUB, mem_XMUB.MAXLX1 );

又比如在一個進程裏,代碼需要請求一個打開的文件號。如果想簡單,就:
GKLIYK( 0.Allot.1.0, 1.0, ji_fs_no_XMUB, ji_fs_no_XMUB.MAXLX1 );
但要花約0.28us的時間;想省時間,我們先拷貝16行,SS1;如成功才耗36ns,失敗拷貝下16行;最多循環16次。

 
2、大模式管理

      本地內存空間本來就有限,如果代碼中聲明一個字變量,也要分配一個頁(4KB);那就很不合理,很扯蛋了;現代操作系統內存分配的粒度還是比較粗的。APO中,對於本地內存用連續行分配方式較之其它更爲合理,可以說無碎片問題,粒度可小到1H(32B、1W)。對於磁盤空間的粒度是1頁256H(8KB),好像是大了點;但文件小於2KB的都放在i節點了,而無須磁盤空間分配;所以,還是很合理的。


     在一個本地數據塊內的連續行分配,在一個頁區內的連續頁分配,在一個單元內的連續數據塊分配;i節點號分配,數據塊記錄號分配等等。這些項目的分配方法是需要使用到線性表的;因爲分配是在4G的空間進行,要使用到64K個64K位的位圖變量;是大模式。本來,連續行或連續頁分配就挺複雜的;感覺再用鏈表就更復雜了。分配與釋放是需要分成2個方法;newH和releaseH。


      一個作爲大模式分配的64K個資源單位的單位數據塊,需要一個指向該單位塊的指針,和一個64K位的位圖變量;每位對於一個單位。可能會有很多個的這種連續資源單位分配的單位塊;一個數據塊可以裝256個64K位的位圖變量,對應着256個連續資源單位分配的單位塊。理論上,64K個單位塊需要256塊位圖變量數據塊來管理。實際上,位圖變量數據塊是動態的,按需增長。最初,只是一個位圖變量數據塊;而位圖變量數據塊中的256個位圖變量,也並非全部使用。比如,文件目錄系統中;一個單位是指代表一個文件或目錄的i節點。新建一個文件或目錄,就是在大模式中請求分配一個空閒位,也就是分配一個i節點。類似的還有在一個數據庫表中增加一條記錄、爲文件分配連續n頁等等。大模式的單位序號是1W表示,連續單位數最大是半字1Z表示。因爲最多有256個位圖變量數據塊、每個位圖變量數據塊最多有256個位圖變量;所以單位序號的高16位的高8位是位圖變量數據塊序號,低8位是位圖變量數據塊中的位圖變量序號;而低16位是相應位圖變量的位序號。


大模式屬性表:在磁盤空間中會有單元號,但在內存中只是塊號。
DMUB{                // 4KE + 48E + 1W
  BU1Z [256] WTKP;  // 256個位圖變量/塊,本地內存的塊號指針數組;不用或未分配的爲0
  BU1Z [256] WTKXU; // 每塊256個位圖變量中,空閒的位圖變量數的數組。
  BU1Z [256] MMLX1; // 每塊256個位圖變量中,最大連續爲1的數值之最大值數組。
  BU16H [256] MLYXUW1;// 256個位圖變量塊中256個最大連續爲1的16位最大值數組的數組。
  BU1W MAXLX1;     // 位圖變量中的最大的連續爲1的位數及起始位號所屬的行號。
  }


    每塊256個位圖變量中,可能有些位圖變量還沒使用;未使用的位圖變量,其對應的最大連續爲1的16位最大值爲0;但位圖變量的所有位都初始化爲1。空閒的位圖變量數的16位是空閒數,最多爲256。沒有使用到的位圖塊,其塊號指針爲0;其對應的位圖變量最大連續爲1的數值之最大值數爲0;其對應的空閒的位圖變量數爲:0x0100。

      newH分配方法:第一步,在最大連續爲1的數值之最大值數組尋找是否有滿足要求的位圖變量塊序號;有,拷貝相應塊序號的256個最大連續爲1的16位最大值數組(16E),比較得到滿足要求的位圖變量序號;將對應的位圖變量拷貝進硬件模塊進行分配。返回結果:32位的單位序號;耗時378ns。否,第二步,在空閒的位圖變量數的數組中尋找大於等於1的第一個位圖變量塊的序號;失敗跳錯誤處理;成功,用空閒的位圖變量拷貝進硬件模塊進行分配,空閒的位圖變量數-1。

newH{ // 大模式分配方法:數據庫記錄、內存連續行、磁盤的連續數據塊、連續頁分配。
// 入口:R0-R4,返回R0:申請的連續行數或連續數據塊或連續頁數等及開始地址。
// R0-R4 = ( 7.CMP.0.16, 申請的連續1位數.0, DMUB, DMUB.MAXLX1, 變量)
// 佔用:44W, 6H。 耗時:非新位圖變量,378ns。否,411ns、32.418us
     R27 = R2; R28 = R2 + 16; R29 = R2 +32; R30 = R2 + 48;// R27-R30指向DUMB成員
     R2 = R29;  R24 = R1;    // R2 = &DMUB.MMLX1;保存R1。
     GKLIYK();  // 返回R0 = 第一個符合條件的字符開始地址(位圖變量塊號的序號)。25ns
     BT0 PSR.YJ, #ne3;  // 失敗跳、尋找還沒分配的位圖變量。到此,33ns
     R26H = R0L;        // 保存塊序號到R26H,
     R0 = 7.CMP.0.16;  // 求滿足要求的位圖變量最大值的位圖變量序號
ne1:                     // 這段耗時:343ns
     R2 = R30 + R0L<<4; // R2指向塊序號的塊的256個位圖變量最大值數組成員。
                         // DMUB.MLYXUW1.塊序號成員(R0L<<4,每個成員佔16行)。
     R25 = R2;          // 保存到R25。
     GKLIYK();         // 返回R0L = 第一個符合條件的字符開始地址(位圖變量序號)。
     R26L = R0L;
ne2:                   // 這段耗時:314ns
     R2 = R27.R26H + R0L<<8;// R2指向符合條件的位圖變量。.WTKP.塊序號 + 變量行號。
     R0 = 0.allot.1.0;  R1 = R24;  // 分配指令,恢復R1。
     GKLIYK();           // 分配、拷貝相應位圖變量的256行。
     R25.R26L = (R3).H;  //保存最大值到位圖變量最大值數組。
     R23L = R0L;         //  保存16位在變量位圖中的序號。
     R2 = R25;
     R0 = 4.CMP.0.16;    // 求256個位圖變量最大值數組中的最大值。
     GKLIYK();           // 返回R0L = 第一個符合條件的字符開始地址(最大值的序號)。
    R29.R26H = R25.R0L;// 保存最大值之最大值。DMUB.MMLX1.R26H
     R0H = R26L + R26H <<8; // 返回R0H爲單位塊序號、塊中的位圖變量序號。
     R0L = R23L;         // 返回R0爲單位序號。
     RET
ne3:
     R2 = R28;           // R2 = &DMUB.WTKXU。
     R1H = 1;
     R0 = 7.CMP.0.16;   // 求256個空閒的位圖變量數大於1的塊序號。
     GKLIYK();          // 返回R0L = 第一個符合條件的字符開始地址(塊序號)。
     R26H = R0L;
     CMPZ R28.R0L, #0X0100;// 是空閒塊?
     JZ  ne4;          // 是、跳申請1個位圖變量數據塊。
     R28.R0L-;          //空閒位圖變量數減1
     R1 = 0;  R0 = 6.CMP.0.16;   
     JMP  ne1;         // 求第一個爲0的變量序號、並分配。本段耗時35ns
ne4:
     Allot1( 0.Allot.0.1, 1.0,&mem_XMUB, &mem_XMUB.MAXLX1 );
     R27.R26H = R0L;  // 保存塊號
     KY_init(); // 塊初始化爲全1;DMUB.MLYXUW1.R0L<<4的16行初始化爲0。耗時,32.01us
     R26L = 0;  R28.R26H = 0X00FF;
     JMP  ne2;         // 本段耗時32.071us
 }

releaseH{
// 入口:R0-R4,返回R0:位圖的最大連續單位數的開始單位號。
// R0-R4 = ( 0.release.1.0, 釋放的連續1位數, &DMUB,&DMUB.MAXLX1, 單位序號 )
// 佔用:12W, 2H。 耗時:  ns
   R1H = R1L;  R1L = R4L;  R30L = R4H;
   R30L = >>8; R30H = R4H <<8; // R30L爲塊序號,R30H爲位圖變量序號
   R2 = R2.R30L + R30H;        // R2指向對應的位圖變量
   GKLIYK();  // 釋放,如果整個位圖釋放了,最大值變爲0;位圖變量空閒數+1,如爲0x0100
// 就要塊釋放。否,保存最大值、最大值判斷、最大之最大值判斷並保存。
   。。。

}

    暈了,費那麼大力;這樣複雜的內容、代碼量才10E,還要不斷修改。離目標代碼量512E還很遙遠,系統核心的核心只是2條指令2W;即使是進程、線程調度也就幾行代碼;如何是好?看來,要把應用程序的90%的代碼量由系統來完成,各種框架、模式都集成到系統裏去。

 

3、數據庫連接

    對於連接這種資源,可以看成是大模式;理論上,數據庫服務進程就可以支持到4G個連接了。可以構建一個可管理64K個連接的動態線程類,成爲模式框架集成到系統裏去。連接資源,歸類到進程、線程類。數據庫應用程序還有:事務日誌、顯示管理、消息處理、事件過程等內容。前2項基本是集成到系統裏;說實在,看起來複雜,什麼窗口、按鍵類等等;編寫出來總的也就10E的代碼量。後2項,最少一大半是集成到系統裏。編寫操作系統,秒秒鐘要考慮線程間通訊的同步問題;我會盡可能高效和簡單。很多傳統的同步方法我可能會放棄,用戶是基本上無須考慮同步問題的。數據庫應用程序的事務日誌,解決了一些數據同步問題。同步問題是放在進程、線程類,還是另文;還在考慮。本章就囉嗦到此,誒、口水多過米。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章