c專家程式設計 對記憶體的思考

2021-08-28 15:03:45 字數 1879 閱讀 1299

1、intel 80x86系列處理器的發展歷程

4008 —> 8008  —> 8080  —> 8085  —> 8086  —> 80186  —> 80286  —> 80386  —> 80486  —> pentium 32

2、記憶體模型以及它的工作原理

段的含義:一塊64kb的記憶體區域,有乙個段暫存器所指向。

記憶體位址的形成:取得暫存器的值,左移4位(相當於乘以16,左乘右除),或者把段暫存器值看成20位,在值得右邊擴充4個0,然後段暫存器值加上偏移的16位位址,得到最終的值。

3、虛擬記憶體

概念:只是對多層儲存進行擴充,使用磁碟而不是主存來儲存執行程序的映像。

虛擬記憶體通過「頁的形式組織。頁就是作業系統在磁碟和記憶體之間移來移去或進行保護的單位。,一般為幾k位元組。

程序只能操作位於物理記憶體的頁面中。

4、cache儲存器

cache位於cpu和記憶體之間,是一種極快的儲存緩衝區,是多層儲存概念的更深擴充套件。

cache包含乙個位址的列表以及他們的內容。

5、資料段和堆

資料段能夠根據需要自動增長的包含了乙個物件,這個物件就是堆。

堆區域用於動態分配的儲存且堆中的所有東西都是匿名的,不能按名字直接分配,只能通過指標間接訪問。

對記憶體的**不必與他所分配的順序一致。

堆的末端由乙個稱為break的指標來標識,但堆管理器需要更多的記憶體時,它可以通過系統呼叫brk和sbrk來移動break指標。

記憶體管理的呼叫:malloc和free:從堆中獲得記憶體以及吧記憶體返回給堆。brk和sbrk:調整資料段的大小至乙個絕對值(通過某個增量)。

6、記憶體洩漏

堆常會產生兩種記憶體的問題:釋放或改寫正在使用的記憶體(稱為記憶體毀壞);未釋放不再使用的記憶體(稱為記憶體洩漏)。

避免記憶體洩漏:每次呼叫malloc函式時,在以後都要呼叫相應的free來釋放它。

使用alloca來分配動態記憶體,當離開呼叫的alloca的函式時,他所分配的記憶體會自動釋放。

洩露的記憶體往往比忘記釋放的資料更大。

檢測記憶體洩漏的方法:使用swap命令來觀察還有多少可用的交換空間,用「ps-lu使用者名稱」命令來顯示所有程序的大小,確定可疑的程序。

7、匯流排錯誤和段錯誤

匯流排錯誤和段錯誤在不同的作業系統版本上各有不同。

匯流排錯誤:匯流排錯誤幾乎都是由於未對齊的讀或寫引起的。

8、段錯誤

段錯誤是由記憶體管理單元的異常所引起的,該異常通常由於解除引用乙個未初始化或非法值的和指標引起的。

如果未初始化的指標恰好具有未對齊的值,他將產生匯流排錯誤,而不是段錯誤。

導致段錯誤的原因

a、解除引用乙個包含非法值的指標。

b、解除引用乙個空指標(常常由於從系統程式中返回空指標,並未檢查就引用)。

c、在未得到正確的許可權是進行訪問。(例如試圖往乙個唯讀的文字段儲存值)

d、用完了堆疊或堆空間。

9、可能導致段錯誤的常見程式設計錯誤

壞指標值錯誤。

在指標賦值之前就用它來引用記憶體。

向庫函式傳送乙個壞指標。

對指標釋放之後在訪問它的內容。

改寫錯誤

越過陣列邊界寫入資料。

在動態分配的記憶體兩端之外寫入資料。

改寫一些堆管理資料結構。(在動態分配的記憶體之前的區域寫入資料)

指標釋放引起的錯誤

釋放同乙個記憶體塊兩次。

釋放一塊未曾使用malloc分配的記憶體。

釋放乃在使用中的記憶體。

釋放乙個無效指標。

C專家程式設計 讀書筆記七 對記憶體的思考

第七章 一 知識點 1 作為80x86記憶體模型最基本的形式,8086中的段是一塊64k的記憶體區域,由乙個段暫存器所指向。記憶體位址的形成經過是 取得段暫存器的值,左移4位 相當於乘上16 或者換中思路,把段暫存器的值看成是20位的,也就是在值得右邊擴充4個0。然後就是16位的偏移位址,它表示段內...

第7章 對記憶體的思考

今天,計算機系統結構的真正挑戰不在於記憶體的容量,而是記憶體的速度。在巨型位址空間的機器中,主存訪問時間的重要性將進一步凸現。當訪問海量資料時,它所耗費的記憶體訪問時間將左右軟體的效能。我們只能寄望cache以及相關技術。從理論上說,記憶體的每個位置都可以用暫存器來代替,但在實際上,這樣做的成本將是...

C語言中對記憶體的感悟

1 電腦程式 資料 就是函式,資料就是全域性變數 區域性變數。2 馮諾依曼結構 將 和資料存放在一起。哈弗結構 將資料和 分開存放。是不變的 存放在rom唯讀 資料是隨時可變的 存放在ram隨機儲存器 所以分開放的好處就可以方便資料管理,還可以避免 被無意識修改導致的系統崩潰。3 在微控制器中,程式...