Linux系統記憶體管理及相關操作函式

2021-07-04 19:41:38 字數 2706 閱讀 5139

堆記憶體的管理(程式設計師全權負責)

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,提供了更簡潔的檢視系統...