目錄
軟件分層
介紹
舉例?
類的繼承
虛擬文件系統
線程接口封裝
虛擬地址空間
總結
為什么是層狀的
軟件分層
網絡協議
原因
梳理協議順序
相連節點
協議分層
引入
示例
實際上
邏輯上
制定出協議
軟件分層
介紹
通過將軟件系統劃分為不同的層次,每一層都有特定的功能和職責,以實現模塊化,可維護和可擴展的軟件架構
這種分層設計有助于提高系統的可理解性,降低耦合度,并促進團隊協作
舉例?
類的繼承
- 子類和基類,兩者類型相互獨立
- 子類可以共享基類的功能,并在此基礎上添加、修改或擴展功能,從而建立出類之間的層次關系
虛擬文件系統
- 虛擬文件系統是一個抽象層,它提供了一個統一的接口,使得操作系統和應用程序能夠訪問不同種類的文件系統,而不需要關心底層文件系統的具體實現
- 通過struct file指針,指向不同的硬件:
線程接口封裝
- 我們之前模擬封裝c++的線程庫時,是使用回調的方式,在構造函數內部調用傳進來的函數指針線程庫接口模擬封裝(使用參數包接受參數,2種方法)-CSDN博客
- 這就將線程定義和其工作函數進行分層,二者耦合度很低,代碼僅通過回調的方式將兩者聯系在一起
虛擬地址空間
虛擬地址空間屬于更高層次的抽象,它隱藏了底層硬件的細節,為應用程序提供了一種獨立于實際物理硬件的地址空間
他內部存在著嵌套關系的分層結構:
除此之外,分層也可以是并列關系
- 每個程序都認為自己獨立擁有內存空間,從而在邏輯上將每個程序進行分層
- 同時,虛擬地址空間內部分出了不同區域,這也屬于軟件分層
總結
軟件分層可以在數據結構/軟件邏輯上進行分層,大多數是兩者都有
這樣分出了各個模塊,讓代碼的耦合度降低了,在維護時也更加容易
為什么是層狀的
軟件分層
可以將大項目分成多個小模塊,寫和維護都容易
- 如果需要修改或擴展系統的功能,只需關注特定層次,而不必涉及整個系統
高內聚,低耦合是代碼要實現的目標
- 模塊內的高內聚使得修改和維護變得更加容易,而低耦合減少了模塊之間的依賴,使得修改一個模塊時不會波及到其他模塊
網絡協議
原因
除了是因為整個網絡項目規模太大了,需要我們分模塊
還因為"協議是由問題產生的",問題是層狀的,協議自然也是
梳理協議順序
要運輸數據,首先面臨的最基礎的問題就是,如何將數據在兩個相連節點之間傳輸,有了這第一步,才會有在兩個相距甚遠的主機之間傳輸的可能性
相連節點
- 指在網絡拓撲結構中,這兩個節點之間直接通過一條物理鏈路或網絡連接相連
- 這種連接方式稱為點對點連接
- 點對點連接可以通過不同的物理介質和連接方式來實現
- 比如:以太網直連(比如通過網線),通過wifi連接,形成點對點鏈路(通過光纖,電纜等實現)等方式
有了這個可能性,我們還需要探討如何真正實現
- 可以跳轉的設備很多,怎么選擇路徑呢?而且如何知道自己已經到達目標主機了呢?
- 就需要一個唯一標識,來區分每一臺主機,也就是解決定位主機的問題
兩個問題都解決后,我們從技術層面上可以運輸到目標主機了
- 但怎么確保一定能做到呢,就來到可靠性的問題
- 也就是制定[傳輸數據時如果出錯]的預備方案,確保讓可靠的數據源發送成功
當我們可以可靠地運輸數據后,也就該思考下一步,數據到位后要干什么,總不能運到就不管了吧
- 也就有了應用層面上的設計,為傳輸的數據賦予實際意義
協議分層
引入
- 既然網絡協議是分層的,那么其他協議也可能會是分層設計
- 我們已經有了協議的認知,以及分層的好處,下面就來看看協議是如何實現分層的
- 我們以打電話為例(當然這里只是簡單的兩層,實際的網絡通信會更加復雜, 需要分更多的層次)
示例
下面是兩個人通過座機交流:
實際上
我們可以通過前面學習的知識分析出 -- 兩個人并沒有直接交流,是借助了電話這個設備才成功交流
- a的聲音被電話接收,電話通過壓縮,編碼,加密音頻等行為,最后轉換為光電信號
- 光電信號以電話之間的通信協議,傳輸給c的電話
- 然后c的電話進行一系列處理,將光電信號轉換為音頻并播放出來
邏輯上
- 但是在邏輯上我們認為,我們是直接和對方交流的(因為邏輯上人與電話無法交流,總不會出現c的電話直接來找a交流吧(癱))
- 所以人與人被劃分為同一層
- 而電話本身就要進行交流(將光電信號傳給對方),所以電話也分為一層
制定出協議
所以,我們針對劃分出的這兩層,制定對應的協議
- 人與人,規定用某種相同語言交流
- 電話之間,制定某種協議
而連接這兩層的,就是聽筒(相當于聽筒是接口),這就實現了高內聚,低耦合的要求
- 這樣進行分層后,一層有問題,不會影響上下層
- 即使換了說其他語言的人?/ 換了設備(也可以說是更換了協議)?,依然可以溝通
- 所以,分層可以讓維護成本大大降低