天天看點

系統設計---分層,分級,分塊

在設計一個可用的系統時,往往第一步是設計結構。縱觀計算機的發展史,橫貫計算機科學的不同領域,有三個方法是很重要的,那就是:分層,分級,分塊的思想方法。

記得上高中的時候,我們的實體老師老隔就給我們傳授動态的測試方法,當時我們設計一個電路,老隔就給我們講,要想知道設計方案如何,最好的方法就是“讓電 流流一流”,現在工作了,終于明白了這是真的,為了說明問題,關鍵時刻就讓“資料流一流”吧。另外說一下政策和機制,機制說明了事情發生的可能性,而政策描述了事物如何發生。

三個方法有個共同點,就是要達到各司其職,高内聚低耦合的目的,最終友善管理,友善更新,友善替換。但是也有不同的地方。

首先,分層是一個縱向的概念,它承接地将一個過程分為了不同的子過程,每個層次使用下層提供的服務,并且對這些服務進行重新組合和過程分發,為上層提供一個統一的接口,進而屏蔽掉下層的異構體,每一層為上一層提供機制,而政策由上一層提供。注意,分層不是功能意義上的,也就是說,如果某個層次缺失或出錯的 話,整個過程将失敗。作為例子,我們來看一下TCP/IP模型和現代宏核心作業系統模型。

在TCP/IP模型中,協定族把一個傳輸過程的路徑分為5個層次,分别為實體層,鍊路層,網絡層,傳輸層,網絡層,從前到後,前面的為後面的屏蔽更前面 的,為後面提供傳輸機制和統一的接口,資料發送時從後到前經過每個層次都要打标記,政策通過填寫協定字段來注冊,接收是個相反的過程。如果說某一層比如網絡層出錯了,那麼資料流就會在該層斷裂,無法繼續傳輸下去了。這麼個設計方法很好,比如應用程式員隻用寫好應用程式并且提供好具體的政策(比如是tcp還 是udp,優先級情況等等)就可以了,同樣的,協定棧實作者也不用管底層是銅線還是光纖,網絡層實作者不用管下面是X.25還是以太網,而隻需要提供政策 并調用下層的接口就可以了。

另外一個例子,宏核心作業系統,但為什麼是宏核心作業系統而不提微核心呢,其實微核心恰恰是我們讨論的另一個問題的例子--分塊。作為宏核心系統,系統本 身就是一個分層的大結構,應用程式進行系統調用,比如write,調用sys_write,然後資料到了系統調用層,接着就到了虛拟檔案系統層,實際上虛 拟檔案系統也是一個分層結構,為了向上提供一個統一的檔案操作接口,再往下到了裝置無關驅動(gendisk)層,然後到達硬體驅動,最終寫入硬體,一層 一層往下,下層提供了機制使得上層的政策得以實施。作為一個補充,使用者程式庫的實作也是這個道理,它屏蔽了不同作業系統的實作細節,提供了使用者操作的基本機制,而最終的政策都是應用程式員通過代碼傳往下層的。

分層的思想很博大精深,遠遠不止上面這些,但重點基本都說到了。機制和政策的思想和分層的想法實際上是兩個獨立的思想,我覺得事實上可以這麼幹,就将它們結合了。

現在說一下分級的思想,它在本質上也是一個縱向的概念,也是将一個過程分為不同的子過程,但是它卻不是承接的,也就是說每個過程都是獨立的,可有可無的,這就是全部的機制,具體政策就看什麼應用,怎麼配置,以及怎麼實施了。作為例子我就說一下linux的流量控制系統和solaris的排程類。

linux的流控做的真的不錯,它将流控分為了3個要素,一個是排隊規則,一個是過濾器,一個是類,其中的類中可以實作新的排隊規則,然後是過濾器,依次 類推,這就使得一個要素按照尺度和目前上下文情況實作多重受控,比如說可以設計一個裝置相關的排程器,一個裝置無關的排程器,後者規定入隊包的個數而不管具體屬于哪個裝置,而前者在裝置間競争或協作,作為更現實的例子,考慮縣裡給了本縣100個生育名額,而本縣有10個村,縣裡隻給了100個,100個名額怎麼在村裡配置設定是縣裡的決策,比如王村最優先給50個,霍家莊給15個...,但是王村的50個名額怎麼在村内配置設定,縣裡就不管了,而交給了村支部,這是一個現實中分級排程的一個例子。

現在考慮一下solaris的排程類,實際上了解了上面那個縣裡發生育名額的例子後就不用看了,道理是一樣的。線程先按優先級分到特定排程類裡,然後按照排程類的規則進行排程(為了支援容器和區域,好幾個排程類的全局優先級是重合的,這裡僅講基本思想,應用請查文檔),現在linux的新核心也支援排程類了。

好了,最後一個是分塊,所謂分塊就是将不同功能區分開來,獨立成子產品,這個是純粹政策意義上的概念,因為沒有什麼統一機制可言,怎麼分塊全看個人,人就是機制,而且分塊比分層和分級更加抽象。作為例子,考慮一下微核心作業系統和面向對象系統。

微核心的核心僅僅提供最基本的機制,而所有政策和非最重要機制都留給程序子產品,也就是說,宏核心是像棧一樣的一摞子的話,微核心就是把這一摞子豎起來的的一排。面向對象的理論也是這樣,當然它更複雜,涉及到了系統設計中的另外的概念,比如抽象,封裝之類的,可是那隻是過程,作為抽象封裝的結果,一個子產品建 立了,它是高度獨立内聚的,隻能通過消息傳遞來互相通信。

這三個思想就是這麼回事,如果讀一下linux和minix的代碼,我相信比什麼都強!

作為結束,其實還遠遠沒有結束

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274178

繼續閱讀