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

2022-08-04 09:42:10 字數 2171 閱讀 5540

第七章

一、知識點

1、作為80x86記憶體模型最基本的形式,8086中的段是一塊64k的記憶體區域,由乙個段暫存器所指向。記憶體位址的形成經過是:取得段暫存器的值,左移4位(相當於乘上16),或者換中思路,把段暫存器的值看成是20位的,也就是在值得右邊擴充4個0。然後就是16位的偏移位址,它表示段內的位址。如果把段暫存器的值(經過移位)加上偏移位址,就得到最終的位址。不同的段位址加上偏移位址所形成的值可能指向同乙個記憶體位址。(p146)

2、討論數字概念時,需要注意所有的磁碟製造商都是使用十進位制數而不是二進位制數來表示的磁碟的容量。所以2gb的磁碟可以儲存2000000000個位元組的資料而不是2147483648個位元組。(p148)

3、虛擬記憶體的基本思路是使用廉價但緩慢的磁碟來擴充快速但昂貴的記憶體。記憶體管理硬體負責把虛擬位址翻譯為實體地址,並讓乙個程序始終執行於系統的真實記憶體中。應用程式程式設計師只看到虛擬位址,並不知道自己的程序在磁碟和記憶體之間來回切換。(p151)

4、虛擬記憶體通過「頁」的形式組織。頁就是作業系統在磁碟和記憶體之間移來移去或者進行保護的單位,一般為幾k位元組。程序只能操作位於物理記憶體中的頁面。(p152)

5、cache操作的速度與系統的週期時間相同,所以咯乙個50mhz的處理器,其cache的訪問週期為20ns。記憶體讀取的資料以行為單位i,在讀取的同時也裝入到cache中。(p154)

6、cache的組成:

8、堆區域用於動態分配的儲存,也就是通過malloc(記憶體分配)函式獲得的記憶體,並通過指標訪問。堆中的所有東西都是匿名的——不能按名字直接訪問,只能通過指標間接訪問。從堆中獲取記憶體的唯一辦法就是通過呼叫malloc庫函式。(p157)

9、每次當呼叫malloc分配記憶體時,注意在以後呼叫相應的free來釋放它。一種簡單的方法防止記憶體洩露就是在可能的時候使用alloca()來分配動態記憶體,當離開呼叫alloca()的函式時,它所分配的記憶體會被自動釋放。(p159)

10、檢測記憶體洩露的步驟:(p159)

(1)、首先使用swap命令觀察還有多少可用的交換空間:

/usr/sbin/swap -s

在一兩分鐘內鍵入該命令三到四次,看看可用的交換區是否在減少。如果發現不斷有記憶體被分配且從不釋放,乙個可能的解釋就是有個程序出現了記憶體洩露。

(2)、確定可疑的程序,看看它是否該為記憶體洩露負責。你可能已經知道哪個程序是罪魁禍首,不然可以實用「pa -lu使用者名稱」命令來顯示所有程序的大小。同樣數次重複這個命令,可疑發現任何動態分配記憶體的程序的大小都在增長。

11、匯流排錯誤幾乎都是由於未對齊的讀或寫引起的。它之所以稱為匯流排錯誤,是因為出現未對齊的記憶體訪問請求時,被堵塞的元件就是位址匯流排。對齊(alignment)的意思就是資料項只能儲存在位址時資料項大小的整數倍的記憶體位置上。(p163)

12、段錯誤(segmentation violation)通常是由於記憶體管理單元(負責支援虛擬記憶體的硬體)的異常所致,而該異常則通常是由於解除引用乙個未初始化或非法值的指標引起的。(p164)

13、通常導致段錯誤的幾個直接原因:(p166)

(1)、解除引用乙個包含非法值的指標;

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

(3)、在未得到正確的許可權時進行訪問。例如,試圖往乙個唯讀的文字段儲存值就會引起段錯誤。

(4)、用完了堆疊或者堆空間。

在絕大多數情況下,匯流排錯誤意味著cpu對程序引用記憶體的一些做法不滿,而段錯誤則是mmu對程序引用記憶體的一些情況發出抱怨。

14、最終可能導致段錯誤的常見程式設計錯誤是:(p166)

(1)、壞指標值錯誤:在指標賦值之前就用它來引用記憶體,或者向庫函式傳送乙個壞指標,或者對指標繼續擰釋放之後再訪問它的內容。

(2)、改寫錯誤:越過陣列邊界寫入資料,在動態分配的記憶體兩端之外寫入資料,或改寫一些堆管理資料結構。

(3)、指標釋放引起的錯誤:釋放同乙個記憶體塊兩次,或者釋放一塊未曾使用malloc分配的記憶體,或釋放仍在使用中的記憶體,或釋放乙個無效的指標。

二、問題

1、alloca()函式?(p159)

2、在pc上編寫乙個捕捉int 1b(ctrl-break)訊號的訊號處理程式,讓它列印一條友好的使用者資訊但並不退出程式。(p163)

3、編寫乙個訊號處理程式來捕捉匯流排錯誤和段錯誤訊號,讓它們列印一條對使用者更為友好的資訊,然後退出。(p165)

《C 專家程式設計》讀書筆記

前言 程式設計挑戰 計算機日期 第二章 這不是bug,而是語言特徵 switch的乙個bug break中斷了什麼 第三章 分析c語言宣告 程式設計挑戰 把c 語言的宣告翻譯成通俗的語言 include include include include define max len 100 enum ...

《C專家程式設計》讀書筆記

第一章 const float 表示乙個指向float型別常量的指標 第二章 1.在c語言中const並非真正表示 常量 在陣列定義與case中不可以使用 2.case的一些問題 2 3 main 15 這段 列印出來的是 3.函式可見性 void sb any where 2 extern voi...

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

1 intel 80x86系列處理器的發展歷程 4008 8008 8080 8085 8086 80186 80286 80386 80486 pentium 32 2 記憶體模型以及它的工作原理 段的含義 一塊64kb的記憶體區域,有乙個段暫存器所指向。記憶體位址的形成 取得暫存器的值,左移4位...