Rumah  >  Artikel  >  Tutorial sistem  >  Mekanisme kitar semula memori kernel Linux: pemahaman mendalam tentang pengurusan memori

Mekanisme kitar semula memori kernel Linux: pemahaman mendalam tentang pengurusan memori

王林
王林ke hadapan
2024-02-14 19:51:19740semak imbas

Pernahkah anda menghadapi pelbagai masalah ingatan dalam sistem Linux? Seperti kebocoran memori, pemecahan memori, dll. Masalah ini boleh diselesaikan dengan pemahaman mendalam tentang mekanisme kitar semula memori kernel Linux.

Tidak kira berapa banyak memori yang terdapat pada komputer, ia tidak mencukupi, jadi kernel Linux perlu menuntut semula beberapa halaman memori yang jarang digunakan untuk memastikan sistem terus menggunakan memori. Terdapat tiga kaedah kitar semula halaman: tulis balik halaman, pertukaran halaman dan pembuangan halaman: Jika storan sandaran halaman yang jarang digunakan ialah peranti blok (seperti pemetaan fail), memori boleh disegerakkan terus ke peranti blok untuk membebaskan halaman itu boleh digunakan semula; jika halaman itu tidak mempunyai storan sandaran, ia boleh ditukar kepada partition swap tertentu, dan kemudian ditukar kembali ke memori apabila ia diakses semula jika storan sandaran halaman adalah fail, tetapi kandungan fail tidak boleh diubah suai dalam memori (seperti fail boleh laku), ia boleh dibuang terus jika ia tidak diperlukan pada masa ini.

1 Masa untuk kitar semula

Linux kernel内存回收机制:深入理解内存管理

2 Memori yang mana boleh dikitar semula

2.1 Kitar semula bingkai halaman
LRU (Paling Kurang Digunakan), senarai terpaut yang paling kurang digunakan baru-baru ini, disusun mengikut penggunaan terkini Yang paling kurang digunakan wujud di penghujung senarai terpaut, yang boleh dilihat melalui definisi makro berikut:
. #define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))
Setiap zon mempunyai 5 senarai terpaut LRU untuk menyimpan pelbagai halaman yang digunakan baru-baru ini.
enum lru_list {
LRU_INACTIVE_ANON = LRU_BASE,
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
Antaranya, halaman dalam empat senarai terpaut INACTIVE_ANON, ACTIVE_ANON, INACTIVE_FILE dan ACTIVE_FILE boleh dikitar semula. ANON mewakili pemetaan tanpa nama, tiada storan sandaran FAIL mewakili pemetaan fail.
Apabila halaman kitar semula, halaman TIDAK AKTIF akan dikitar semula dahulu Hanya apabila halaman TIDAK AKTIF sangat sedikit, halaman AKTIF akan dipertimbangkan untuk dikitar semula.
Untuk menilai aktiviti halaman, kernel memperkenalkan dua bendera, PG_referend dan PG_active. Mengapa kita memerlukan dua bit? Andaikan hanya satu PG_active digunakan untuk mengenal pasti sama ada halaman itu aktif Bit ini ditetapkan apabila halaman itu diakses, tetapi bilakah ia jelas? Melakukan ini memerlukan mengekalkan sejumlah besar pemasa kernel, dan pendekatan ini ditakdirkan untuk gagal.
Pendekatan yang lebih elegan boleh dilaksanakan menggunakan dua bendera Idea teras ialah: satu menunjukkan tahap aktiviti semasa dan satu menunjukkan sama ada ia telah dirujuk baru-baru ini. Rajah berikut menggambarkan algoritma asas.
Linux kernel内存回收机制:深入理解内存管理

Pada asasnya terdapat langkah-langkah berikut:
(1) Jika halaman aktif, tetapkan bit PG_aktif dan simpan dalam senarai LRU AKTIF jika tidak, tetapkan dalam TIDAK AKTIF
(2) Setiap kali halaman diakses, bit PG_referenced ditetapkan Fungsi mark_page_accessed bertanggungjawab untuk kerja ini
(3) PG_referenced dan maklumat yang diberikan oleh pemetaan terbalik digunakan untuk menentukan tahap aktiviti halaman Setiap kali bit ini dikosongkan, tahap aktiviti halaman akan dikesan
(4) Masukkan mark_page_accessed sekali lagi. Jika didapati PG_referenced telah ditetapkan, ini bermakna page_referenced tidak ditandakan, jadi mark_page_accessed dipanggil lebih kerap daripada page_referenced, yang bermaksud halaman itu kerap diakses. Jika halaman berada dalam senarai terpaut TIDAK AKTIF, alihkannya ke AKTIF Selain itu, bendera PG_active akan ditetapkan dan PG_referenced akan dikosongkan (5) Pemindahan terbalik juga mungkin Apabila aktiviti halaman berkurangan, page_referenced boleh dipanggil dua kali berturut-turut tanpa mark_page_accessed di antaranya.
Jika akses kepada halaman memori adalah stabil, maka panggilan ke page_referenced dan mark_page_accessed bersifat seimbang dan halaman tersebut kekal dalam senarai LRU semasa. Penyelesaian ini juga memastikan bahawa halaman memori tidak akan melompat dengan cepat antara senarai terpaut AKTIF dan TIDAK AKTIF.

2.2 papak**** kitar semula cache Kitar semula cache papak adalah agak fleksibel, dan semua kaedah yang didaftarkan dalam shrinker_list akan dilaksanakan.
Kernel mendaftarkan kaedah prune_super untuk setiap sistem fail secara lalai Fungsi ini digunakan untuk mengitar semula cache gigi dan inod yang tidak lagi digunakan dalam sistem fail
Mekanisme lowmemorykiller Android mendaftarkan kaedah untuk membunuh proses secara selektif dan menuntut semula memori yang digunakan oleh proses tersebut.

3****Cara mengitar semula bingkai halaman
Linux kernel内存回收机制:深入理解内存管理

Di mana shrink_page_list ialah proses kitar semula halaman sebenarnya
Linux kernel内存回收机制:深入理解内存管理

4 Kekerapan kitar semula berkala

4.1 kswapd
kswapd ialah benang kitar semula memori yang dicipta oleh kernel untuk setiap nod memori Mengapa ia memerlukan kitar semula berkala apabila terdapat kekurangan mekanisme kitar semula? Kerana beberapa peruntukan memori tidak dibenarkan untuk menyekat menunggu pemulihan, seperti peruntukan memori dalam pengendali gangguan dan pengecualian beberapa peruntukan memori tidak dibenarkan untuk mengaktifkan akses I/O. Hanya beberapa kes kekurangan ingatan boleh melaksanakan sepenuhnya proses kitar semula, jadi adalah sangat perlu untuk menggunakan masa terbiar sistem untuk menuntut semula memori.
Fungsi ini merekodkan susunan peruntukan yang digunakan dalam operasi pengimbangan terakhir Jika kswapd_max_order lebih besar daripada nilai terakhir, atau classzone_idx kurang daripada nilai terakhir, balance_pgdat dipanggil untuk mengimbangi domain memori sekali lagi. Masa tidur ialah HZ /10, untuk lengan (HZ=100), masa tidur ialah 1ms.
balance_pgdat mengimbangi operasi sehingga zone_wartermark_ok domain memori.
4.2 cache_reap
cache_reap digunakan untuk mengitar semula objek terbiar dalam papak Jika objek terbiar boleh dipulihkan ke halaman, ia dilepaskan kembali ke sistem buddy. Setiap kali cache_reap dipanggil, semua slab_cache akan dilalui dan kemudian tidur selama 2*HZ Untuk lengan (HZ=100), kitaran ialah 20ms.

Ringkasnya, mekanisme kitar semula memori kernel Linux ialah konsep yang sangat penting yang boleh membantu anda memahami pengurusan memori dengan lebih baik dalam sistem Linux. Jika anda ingin mengetahui lebih lanjut tentang konsep ini, anda boleh menyemak sumber yang disediakan dalam artikel ini.

5 Rujukan

(1)《memahami kernel linux》
(2)《seni bina kernel linux profesional》

Atas ialah kandungan terperinci Mekanisme kitar semula memori kernel Linux: pemahaman mendalam tentang pengurusan memori. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lxlinux.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam