C接口與實現---內存管理

內存管理

全部不平凡的程序都會運行在一個運行期分配的內存上。 ---匿名者java

c如此java已經是如此,只不過這些語言有一套強大額內存管理機制。c之強大也在於此,給你足夠的管理權限,讓你在程序的世界裏揮灑自如。倚天劍,屠龍刀你駕馭很差的話可能會傷到本身,閣下能夠當心。程序員

以爲這與當時的設計環境有關, 話說C語言和以後的Unix只是Thompson和Ritchie兩位大神在Bell Labs的side project,兩個項目交界期搞的一個東西,當時設計C語言的目的就是設計一門語言來時從新設計操做系統,設想的使用者應該是那些Bell的大牛們,並非爲大衆而設計的。固然後來他們沒想到這兩個項目是如此的成功,以致於對以後整個軟件開發產生如此深遠的影響,估計他們也是始料未及的。我等能在其上寫代碼,應該感謝前輩們的積累。算法

C裏面的內存管理

C語言的標準庫提供了四個函數:malloc, calloc, realloc, free來容許程序員本身管理內存單元。若是裸着使用這些函數的話可能會出不少問題,本章中咱們用一系列的宏從新包裝了這些函數,使其錯誤更好。C最多見的內存錯誤就是懸空指針了,相似下面的代碼:數組

p = malloc(nbytes);
 ....
 free(p)
 ....
 if (p)
     ....

這裏的p就是一個懸空指針,咱們釋放了p指向的內存空間,可是並無將其置爲NULL,
以後的代碼也作了NULL check,最終程序就會出現很奇怪的異常。這裏必須介紹一個工具valgrind, 一款強大的memory leak檢測工具。使用也很簡單ide

valgrind --tool=memcheck --leak-check=yes ./a.out

就能檢測出leak的大體代碼。函數

中間斷斷續續總算把第五章的內容看完了,後半部分主要講了一下first fit的內存分配算法。顧名思義,first fit就是在空閒的列表裏面找一個第一個合適空間然(不必定是最好的)後在其上面分配。首先所用的空間是用一個指針數組來管理。工具

static struct descriptor {
  struct descriptor *free;
  struct descriptor *link;
  const void *ptr;
  long size;
  const char *file;
  int line;
} *htab[2048];

這裏的htab是一個hash表,地址爲hash值, 將相同hash值的描述塊用link來連接起來,一樣的空閒鏈表也是經過free連接起來的。這裏free爲空就表示這個塊是被分配的,若是非NULL的他就是空閒列表中的一員,下次分配的時候就可使用。
memspa

這裏還有一點須要注意的就是每次找到合適的塊以後的處理方式,malloc須要分配一個50 bytes的空間,根據first fit咱們找到了一個100 bytes的空間,這裏咱們從100 bytes裏面分配了64(這裏須要考慮到對其),那麼剩下的36 bytes就須要添加描述符後從新添加到空閒列表裏面去。操作系統

後面翻了下K&R C第二版的8.7節也講了一個相似的例子,有時間能夠翻翻。設計

看到習題處真的要再次的誇下這本書,可是還在想每一個塊內存中確定會有16bytes的空間沒法釋放也沒法使用的時候,在習題中看到了這個思考題。

-END-

相關文章
相關標籤/搜索