搞基礎系列-Linux系統-內存篇

前言

做爲一個Android開發者,可能大部分時間都放在了上層的代碼編寫和學習上,對於一些基礎的東西像操做系統、網絡、數據結構與算法還有設計模式可能瞭解很少,搞基礎系列準備以我的的經驗爲出發,整理一些我的認爲比較重要的,對工做有幫助的一些基礎知識點,雖不能面面俱到,但力求包含重點常見知識,這不只是一個分享,也是我的學習的記錄和總結。android

Linux學習路線

(這個路線圖只是從本身的經驗和實際出發得出的,我的以爲在平時能夠用到和須要瞭解的知識,不求面面俱到,只要重點記憶突破。)

什麼是操做系統

先看一下電腦是由什麼組成的,按照馮諾依曼結構運算器,控制器,內存儲器,以及輸入輸出設備,這些對應着CPU、內存和硬盤以及鼠標鍵盤顯示器,這些是實打實的硬件,當你想要調用這些硬件爲你服務,你須要熟悉這些硬件接口,幾百頁的接口文檔那可不是鬧着玩的,那麼你就須要一種叫作 驅動 的軟件來和硬件交互,操做系統實際上就集成了不少驅動,能夠看出,操做系統的一大做用就是屏蔽底層硬件的差別,統一管理硬件。第二點,用戶實際使用的是應用程序,應用程序其實是和操做系統直接打交道的,因此操做系統的第二個目的就是爲應用程序提供易讀、可靠和高效的API,這樣上層應用就不用直接面對硬件,節省開發時間。 因此總結下來操做系統就是用來統一管理硬件資源的,爲上層應用提供高效、易讀API接口的軟件集合。 操做系統有不少像window,macos、android、ios等等,爲何我要選擇Linux學習,由於Android是基於Linux內核的,Android開發又是我吃飯的傢伙,還有什麼比洽飯更重要呢?ios

內存

1什麼是內存:

內存就比如一個個箱子,箱子上有着編號,就是上圖中的地址,裏面裝着咱們須要的數據,而cpu的管腳經過總線與內存相連,當cpu須要數據進行計算時,就經過總線將內存中的數據加載進來,計算完成後再經過總線將結果寫入到內存,同時內存也是和硬盤鏈接,能夠將一些數據寫入硬盤,由於內存的數據再斷電後就會消失,想永久保存就須要寫入到硬盤。

2CPU的地址總線、數據總線和內存的關係

前面說了,cpu經過總線與內存相連,總線又分爲地址總線、數據總線和控制總線三種。 數據總線: 能夠將數據傳給內存,也能夠將內存數據傳給cpu,若是數據總線長度爲8位,那麼每一個時鐘週期傳遞的數據就是1B 地址總線: 前面說了,內存能夠當作一個個箱子,箱子裏的是數據,每一個箱子上都有編號,cpu經過找到箱子的編號,打開箱子,取走裏面的數據,或者寫入數據,地址總線就是用來肯定和找到箱子編號的,好比我們常說的32位cpu,它的可尋址範圍就是2^32也就是4G,那麼他的地址總線範圍就是0x00000000-0xFFFFFFFF,這就是內存箱子的編號。這裏的4G其實也對應了咱們的最大內存大小,通常狀況下每一個箱子存儲的數據大小爲1B。 控制總線: 用來和設備間相互傳遞控制信號的。算法

3虛擬內存

虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它一般是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在須要時進行數據交換。macos

(1)虛擬內存地址

上圖中物理內存中的地址咱們定義爲物理地址,可是在Linux中應用程序不能直接訪問物理內存地址,只能經過虛擬內存地址進行內存訪問,每一個進程都有本身的一套虛擬內存地址,用來給本身的進程空間編號。進程空間的數據一樣以字節爲單位,依次增長。從功能上說,虛擬內存地址和物理內存地址相似,都是爲數據提供位置索引。進程的虛擬內存地址相互獨立。所以,兩個進程空間能夠有相同的虛擬內存地址,如0x10001000。虛擬內存地址和物理內存地址又有必定的對應關係,以下圖所示。對進程某個虛擬內存地址的操做,會被CPU翻譯成對某個具體內存地址的操做。設計模式

這麼作有兩個好處:1是內存的分配管理統一交由操做系統處理和校驗2是爲進程間共享內存提供方便網絡

(4)內存分頁

前面說到,虛擬內存地址和物理地址是有映射關係的,這種映射關係是須要有個表來維護的,若是每一個物理地址對應一個虛擬內存地址,那麼拿4G內存舉例,維護這個表須要8G內存,這傢伙比內存還大,分頁就是用來解決這個問題的。數據結構

分頁就是一更大的粒度來存儲映射關係,分頁機制的操做對象是固定大小的內存塊,稱爲頁,通常狀況下大小爲4K。與頁的概念相對應,頁框是對物理內存的最小操做單位,頁框大小和頁的大小是同樣的,也是4K。這樣咱們須要維護的就是虛擬頁和物理頁框的對應關係了,一個頁爲4K,那麼4G內存須要的用來維護對應關係的內存大小爲1M。不管頁仍是頁框,一頁以內的內存地址都是連續的,因此頁和頁框的最後位數是相同的,以4K頁爲例,每一頁有4096個字節。因爲4096是2的12次方,因此地址最後12位的對應關係自然成立。咱們把地址的這一部分稱爲偏移量(offset)。偏移量實際上表達了該字節在頁內的位置。地址的前一部分則是頁編號。操做系統只須要記錄頁編號的對應關係。學習

由圖可知: 虛擬地址=頁編碼+偏移量 物理地址=頁框頁編碼+偏移量編碼

參考

《鳥哥的Linux私房菜》操作系統

《現代操做系統》

《深刻理解Android內核設計思想》

www.cnblogs.com/vamei

關注個人公衆號

相關文章
相關標籤/搜索