堆記憶體的管理(程式設計師全權負責)
malloc()和free();
c程式設計師分配和**記憶體的工具;
malloc()在unix系統中一次對映33個記憶體頁,如果申請的記憶體比較大(達到32個記憶體頁),系統會對映出比使用者申請的記憶體稍大的記憶體頁數;犧牲空間換時間;
int *pi = malloc(4);//malloc(16);
free(pi);//free()如何知道釋放多少空間呢
malloc()函式除了分配記憶體之外還需要額外儲存一些附加資料(比如分配的大小),附加資料由底層的雙向鍊錶維護;中間還會有一些空;但附加資料的存在不會影響記憶體的正常使用,只是會占用一些記憶體空間罷了;
free()一定會釋放虛擬記憶體位址,但不一定解除對物理記憶體的對映,用了malloc()最後33個記憶體頁free()不會解除對映,等到程序結束才解除對映;
/*
* malloc()函式演示
*/#include #include //我的老師有乙個很富有的親戚;
int main()
學習跟打怪公升級是乙個道理,行動最重要;動手是關鍵;
沒有做過乙個完整的專案,就不是乙個程式設計師,最多是乙個準程式設計師;
結論malloc()負責分配堆記憶體,需要多少就申請多少,比較大的記憶體申請最好申請4k的整數倍;
malloc()分配的記憶體不要越界,否則會破壞附加資料;
malloc()和free()一定要配對使用;
sbrk()和brk()
unix的系統函式(依託於unix系統);
sbrk()和brk()依賴於底層維護的乙個位置addr來實現記憶體的管理;
void *sbrk(intptr_t increment);
引數increment是分配/**記憶體的大小(位元組);
如果是正數,就是分配記憶體;
如果是負數,就是**記憶體;
如果是0不分配也不**記憶體,取當前的位置;
返回改變(移動)之前的位置;負數的返回值是沒有實用意義的;
如sbrk(4)分配記憶體,返回分配之前的初始位置;
sbrk()函式對映記憶體時以頁為單位,按需對映記憶體頁;
**時立即釋放記憶體並解除對映;
/*
* sbrk()函式演示
*/#include #include int main()
sbrk()雖然同時具備分配和**記憶體的能力,但是**記憶體不方便;因此brk()負責**記憶體;
程式設計時一般使用sbrk()分配記憶體,使用brk()**記憶體;
int brk(void *newaddr); //直接把新的位置傳進來(引數);
成功返回0,失敗返回-1;可以使用perror();
brk()的使用離不開sbrk(),至少需要使用sbrk()取得當前位置;
/*
* brk()函式演示
*/#include #include #include int main()
練習參考brk.c的**,重新編寫乙個brksbrk.c,存入乙個 int/double/char*
但使用sbrk()分配記憶體,使用brk()**記憶體,思考如何更簡練;
/*
* sbrk()/brk()
* 使用sbrk()分配記憶體,brk()**記憶體
*/#include #include #include int main()
mmap()和munmap()用於記憶體對映/解除對映
mmap()可以對映物理記憶體/檔案,
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
100//讀許可權
010//寫許可權
001//執行許可權
二進位制的位運算:位與,位或,位反,位異或;
位或|運算可以拼接許可權;
1|1 = 1
1|0 = 1
0|1 = 1
0|0 = 0
位或運算可以用於拼接許可權/選項;
前提條件是選項/許可權做成只有乙個二進位制位是1,不會出現覆蓋的情況;
/*
* mmap()函式演示
*/#include #include #include int main()
int *pi = p;
*pi = 100;
//*(pi+100) = 200;printf("%d\n", *(pi+100));//說明記憶體對映一頁
munmap(p, 4); //解除對映
return 0;
}
如果考慮通用性,分配記憶體使用malloc()和free(),想自定義記憶體管理方式可以使用unix的系統函式;
系統呼叫(system call)
因為使用者層不能直接訪問核心層,而很多功能必須由核心提供和管理,所以必須有一種方式能進入核心層;
unix系統定義了一系列的函式用於進入核心層完成功能,這一系列函式統稱為系統呼叫;
系統呼叫可以被標準c函式使用,也可以被程式設計師直接呼叫;
比如malloc()是標c函式,sbrk()/mmap()就是系統呼叫函式;
Linux系統記憶體管理簡介
linux記憶體管理之物理空間 linux核心中有個全域性變數mem map,指向乙個page資料結構的陣列,每個page資料結構代表著乙個物理頁面,整個資料就代表著系統中的全部物理頁面。頁表項的高20位對於軟體和mmu硬體有著不同的意義。對於軟體,這是乙個物理頁面的序號,將這個序號用作下標就可以從...
Linux系統的記憶體管理
dos時代 同一時間只能有乙個程序在執行 也有一些特殊演算法可以支援多程序 windows9x 多個程序裝入記憶體存在問題 1 記憶體不夠用 2 互相打擾 1.解決記憶體撐爆問題 lru演算法 leetcode 146題 分頁 記憶體不夠用 記憶體中分成固定大小的頁框 4k 把程式 硬碟上 分成4k...
Linux系統的記憶體管理
drop caches 的值可以是 0 3 之間的數字,代表不同的含義 0 不釋放 系統預設值 1 釋放頁快取 2 釋放dentries和inode 3 釋放所有快取 修改 echo 1 proc sys vm drop caches 代表釋放頁快取 free命令相對於top,提供了更簡潔的檢視系統...