前記:本周進入C++開發課程最后一門課:系統設計與實踐。董飛老師從實踐的角度講解了系統設計中的要點;系統設計中的七劍客以及一些系統設計實例。
進程與線程
在程序中見的最多的概念。兩個概念很像,但是有本質區別。進程是一個具有獨立功能的程序關于某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。而線程是作為獨立運行和獨立調度的基本單位。作用是為了更好的調配系統資源,即以更有效編程的目的進行的。
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。線程的劃分尺度小于進程,使得多線程程序的并發性高。從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。
系統設計七劍客
系統設計中七大要點元素:
同步(Concurrency)
進程與線程之間的區別造成了他們之間的通信與同步機制不同。在設計中考慮到不同的同步通信機制之間的關系。
網絡(Network)
網絡OSI有7個層級劃分: OSI的7層從上到下分別是 7 應用層,6 表示層,5 會話層,4 傳輸層,3 網絡層 ,2 數據鏈路層,1物理層。
其中高層(即7、6、5、4層)定義了應用程序的功能,下面3層(即3、2、1層)主要面向通過網絡的端到端的數據流。
數據庫(Datebase)
傳統的關系型數據庫(Relational DB):各個值關系密切,效率低,安全性高。
鍵值存儲(KV Store):靜態關聯,簡單但是訪問效率高。
Sharding:切分的基本思想就要把一個數據庫切分成多個部分放到不同的數據庫(server)上,從而緩解單一數據庫的性能問題。
Clustering:聚群,將相似的數據分為一組進行管理,具有學習型的性質,但是在面對大量數據時,易出現重者越重的情況。
分布式系統(Distribute System)
分布式系統是建立在網絡之上的軟件系統。正是因為軟件的特性,所以分布式系統具有高度的內聚性和透明性。分布式系統組件分布在網絡計算機上,組件之間僅僅通過消息傳遞來通信并協調行動。大大減輕服務器端壓力。
性能(Performance)
考慮性能相關的必須知道的要點速度效率。Cache是關鍵,越接近CPU級的效率越高,但是容量很小。反之,網絡級的效率最底下,但是數據容量最大。
估算(Estimation)
在系統設計中對數據的考慮估算。通過模型等要素估算個因素值,對較大系統一步步的簡化建模分析。
面向對象的設計模式(Design Pattern)
23中經典的設計模式中用的比較多的設計模式:
MVC(模型(model)-視圖(view)-控制器(controller)):用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。
Sigleton(單例模式):提供唯一實例和全局訪問點。
Factory(工廠模式):創建生成工廠,不同子類不同的繼承不同的工廠進行創建。
Iterator(迭代器):遍歷機制與聚合對象進行分離。
Decorator(裝飾器):使用裝飾器可以方便的對象添加額外的職責而不影響基類內容。
Facade(門面模式):對子系統提供統一的接口,解耦和的方式便于用戶使用和子系統的內部維護。