基礎知識
Linux 內存模型
MMU
MMU即內存管理單元,其主要作用是實現虛擬內存到物理內存的映射,其工作原理可以參考下圖:
MMU示意圖
在打開MMU之后,用戶空間和內核空間訪問內存使用的是虛擬地址,需要通過MMU轉換成物理地址后訪問,虛擬地址需要先經過MMU轉換成物理地址然后操作地址總線后訪問物理內存。
Linux虛地址空間劃分
Linux內核依賴MMU硬件,為每個進程提供獨立的地址空間,可以簡單的歸納如下:
- Linux(32位) 將4G地址空間劃分為兩部分、0-3G為用戶user space,3G-4G為kernel space。
- 每個進程有獨立的user space,kernel space為各個進程共享。
- 通常Kernel將其虛擬地址空間的前896M(3G-3G+896M)映射到物理內存前896M(0-896M)
- Kernel虛擬地址空間后120M不做固定映射,需要時將虛擬地址(以頁為單位)映射到物理地址(896M + 8M以上)
Linux內存映射的示意圖如下:
Linux內存映射
Linux IPC
在Binder之前Linux內核已經提供了一系列的IPC機制,和Binder相比,他們的特點如下:
類型 | 特點 |
---|---|
匿名管道 | 僅支持父子進程之間的IPC,兩次內存拷貝 |
命名管道 | 兩次內存拷貝 |
共享內存 | 無需內存拷貝,編碼難度大 |
Socket | 兩次內存拷貝,效率較低 |
Binder | 一次內存考本,效率較高 |
紅黑樹
了解紅黑樹之前需要先了解二叉搜索樹,二叉搜索樹的即樹中的任何節點的值大于它的左子節點,且小于它的右子節點。因此在通過二叉搜索樹搜索數據時,首先比較根節點,如果和根節點相等則搜索命中,如果查找的值比根節點大則查找其左子樹,否則在右子樹查找。二叉搜索樹最理想的情況及完全平衡,此時查找的時間復雜度為O(lgn),如下圖所示:
平衡二叉搜素樹
當數據插入的順序是從小到大或是從大到小時,二叉搜索樹退化成鏈表,查找時間負責度為O(n),如下圖:
二叉搜索樹最差
為了避免最差的情況發生,引入了紅黑樹的概念,紅黑樹本質上是一個二叉搜索樹,通過為每個節點著色,并在插入和刪除節點時通過旋轉重新著色等手段,保證了二叉搜索樹基本平衡。
序列化
什么是序列化
- 序列化是指將數據結構(結構體或對象)轉換成二進制流的過程
- 反序列化是指將二進制流轉換成數據結構
為什么要序列化
- 持久化對象 - 可以將對象輸出的磁盤等介質上
- 不同進程無法相互訪問對方的地址空間,需要將對象序列化,并通過IPC在不同進程間共享對象
- 通過網絡傳輸對象 - 將對象序列化后通過網絡傳輸,以實現客戶端和服務器之間共享對象