Pemetaan memori video
Memori kimia secara kolektif dipanggil ingatan akses rawak (DRAM) boleh dialamatkan dan dinamik. Hanya kernel mempunyai akses terus kepada memori matematik.
Inti Linux menyediakan ruang alamat maya bebas untuk setiap proses, tetapi ruang alamat ini berterusan. Dengan cara ini, proses itu boleh mengakses memori video dengan mudah, atau lebih tepat lagi, memori video maya. Bahagian dalam ruang alamat maya dibahagikan kepada dua bahagian: ruang kernel dan ruang pengguna.
Apabila proses berada dalam mod pengguna, ia hanya boleh mengakses memori ruang pengguna hanya selepas memasuki mod kernel, ia boleh mengakses memori ruang kernel. Sebenarnya, ruang alamat setiap proses termasuk ruang kernel, tetapi ruang kernel ini dikaitkan dengan memori kimia yang sama, iaitu, perpustakaan pautan dinamik kongsi, memori grafik dikongsi, dsb. Apabila proses bertukar kepada keadaan kernel, ia boleh mengakses memori ruang kernel dengan mudah.
Tidak semua memori maya akan diperuntukkan memori kimia Hanya memori maya yang sebenarnya digunakan akan diperuntukkan memori kimia Walau bagaimanapun, memori kimia yang diperuntukkan diuruskan melalui pemetaan memori. Pemetaan memori video adalah untuk memetakan alamat memori video maya kepada alamat memori video kimia. Untuk melengkapkan pemetaan memori video, kernel mengekalkan jadual halaman untuk setiap proses untuk merekodkan hubungan pemetaan antara alamat maya dan alamat kimia.
Jadual halaman sebenarnya disimpan dalam unit pengurusan memori video CPU MMU Dengan cara ini, dalam keadaan biasa, pemproses boleh mengetahui secara langsung memori video untuk diakses melalui perkakasan. Apabila alamat maya yang diakses oleh proses tidak ditemui dalam jadual halaman, sistem akan membentuk pengecualian kesalahan halaman, masukkan ruang kernel untuk memperuntukkan memori kimia, mengemas kini jadual halaman proses, dan akhirnya kembali ke ruang pengguna untuk menyambung semula operasi proses.
TLB (TranslationLookasideBuffer, Translation Lookaside Buffer) dalam penukaran konteks CPU ialah cache jadual halaman dalam MMU. Oleh kerana ruang alamat maya proses adalah bebas daripada sistem Linux, dan kadar akses TLB adalah lebih pantas daripada MMU, oleh itu, dengan mengurangkan penukaran konteks proses dan bilangan penyegaran TLB, penggunaan cache TLB boleh dipertingkatkan. Dengan itu meningkatkan prestasi capaian memori CPU.
MMU menentukan unit terkecil pemetaan memori video, iaitu halaman, biasanya bersaiz 4KB. Dengan cara ini, setiap pemetaan memori video perlu dikaitkan dengan ruang memori video 4KB atau gandaan integral 4KB.
Halaman 4KB akan menyebabkan keseluruhan jadual halaman menjadi sangat besar Contohnya, 4GB/4KB = lebih daripada 1 juta entri jadual halaman dalam sistem 32-bit. Bagi menyelesaikan masalah kemasukan jadual halaman yang terlalu banyak, Linux menyediakan dua mekanisme, iaitu jadual halaman berbilang peringkat dan halaman besar (HugePage).
Jadual halaman berbilang peringkat adalah untuk membahagikan memori video kepada blok untuk pengurusan, dan menukar hubungan pemetaan asal untuk menyekat indeks dan condong dalam blok. Oleh kerana hanya sebahagian kecil ruang memori video maya yang digunakan secara amnya, jadual halaman berbilang peringkat hanya menyimpan blok yang sedang digunakan, yang boleh mengurangkan bilangan entri jadual halaman dengan banyak. Linux menggunakan jadual halaman empat peringkat untuk mengurus halaman memori video Alamat maya dibahagikan kepada 5 bahagian 4 entri pertama digunakan untuk memilih halaman, dan indeks terakhir menunjukkan pencongan dalam halaman.
Halaman besar ialah blok memori video yang lebih besar daripada halaman biasa Saiz biasa ialah 2MB dan 1GB. Halaman besar biasanya digunakan dalam proses yang menggunakan sejumlah besar memori video, seperti Oracle, DPDK, dsb.
Melalui mekanisme ini, di bawah pemetaan jadual halaman, proses boleh mengakses memori matematik melalui alamat maya.
Pengagihan ruang memori video maya
Atas ialah ruang kernel, bahagian bawah ialah memori ruang pengguna, dan ruang pengguna dibahagikan kepada beberapa segmen berbeza
Memori video ruang pengguna, terdapat 5 segmen memori video berbeza dari rendah ke tinggi
1. Bahagian baca sahaja, termasuk kod dan pemalar, dsb.
2 Segmen data, termasuk pembolehubah panorama, dll.
3 Timbunan, termasuk memori video yang diperuntukkan secara dinamik, bermula dari alamat rendah dan menurun ke bawah
4 Segmen pemetaan fail, termasuk perpustakaan dinamik, memori video kongsi, dll., bermula dari alamat tinggi dan menurun ke atas
5 Tindanan, termasuk pembolehubah setempat dan konteks panggilan fungsi, dsb. Saiz tindanan ditetapkan, biasanya 8M
Di antara 5 segmen memori video ini, memori video yang dipetakan timbunan dan fail diperuntukkan secara dinamik Contohnya, menggunakan malloc atau mmap() pustaka standard C, anda boleh memperuntukkan memori video secara dinamik dalam segmen yang dipetakan timbunan dan fail. Pengagihan memori video sistem 64-bit adalah serupa, tetapi ruang memori video lebih besar
Peruntukan memori video dan kitar semula
malloc() ialah fungsi peruntukan memori video yang disediakan oleh perpustakaan standard C Sepadan dengan panggilan sistem, terdapat dua kaedah pelaksanaan, iaitu brk() dan mmap().
Untuk blok kecil memori video (lebih besar daripada 128K), perpustakaan standard C menggunakan brk() untuk memperuntukkan, iaitu memori video diperuntukkan dengan menyambungkan kedudukan teratas timbunan. Memori video jenis ini tidak akan dikembalikan kepada sistem serta-merta selepas ia dikeluarkan, tetapi akan dicache supaya ia boleh digunakan semula.
Untuk blok memori video yang besar (kurang daripada 128K), gunakan terus pemetaan memori video mmap() untuk memperuntukkan, iaitu, cari sekeping memori video percuma dalam bahagian pemetaan fail dan peruntukkannya.
Persamaan dan perbezaan antara dua kaedah ini:
Caching kaedah brk() boleh mengurangkan berlakunya pengecualian kesalahan halaman dan meningkatkan kecekapan akses memori video. Walau bagaimanapun, kerana memori video jenis ini tidak dikembalikan ke sistem, peruntukan dan pelepasan memori video yang kerap akan menyebabkan pemecahan memori video apabila memori video sibuk.
Memori video yang diperuntukkan oleh kaedah mmap() akan dikembalikan terus ke sistem apabila dikeluarkan, jadi pengecualian kesalahan halaman akan berlaku setiap kali mmap berlaku. Apabila memori video sibuk, peruntukan memori video yang kerap akan menyebabkan sejumlah besar pengecualian kesalahan halaman, mengurangkan beban pengurusan kernel. Ini juga merupakan sebab mengapa malloc hanya menggunakan mmap untuk blok memori video yang besar.
Perlu diingat bahawa apabila kedua-dua panggilan ini berlaku, walaupun memori video sebenarnya tidak diperuntukkan. Memori video jenis ini hanya diperuntukkan apabila ia diakses buat kali pertama, iaitu, ia memasuki kernel melalui pengecualian kesalahan halaman, dan kemudian kernel memperuntukkan memori video.
Secara amnya, Linux menggunakan sistem buddy untuk menguruskan peruntukan memori video. Seperti yang kami nyatakan di atas, grafik jenis ini diuruskan dalam unit halaman dalam MMU Sistem rakan kongsi juga menguruskan memori grafik dalam unit halaman, dan akan mengurangkan pemecahan memori grafik melalui penggabungan halaman bersebelahan (contohnya,. Pemecahan memori video yang disebabkan oleh kaedah brk).
Tetapi dalam operasi sistem sebenar, akan terdapat sejumlah besar objek yang lebih kecil daripada halaman, seperti kurang daripada 1K Jika halaman berasingan diperuntukkan kepada mereka, sejumlah besar memori video akan dibazirkan.
Dalam ruang pengguna ruang yang diperuntukkan pengguna linux, memori video yang diperuntukkan oleh malloc melalui brk() tidak segera dikembalikan kepada sistem apabila dikeluarkan, tetapi dicache dan digunakan semula.
Dalam ruang kernel, Linux menguruskan memori video kecil melalui pengalokasi papak. Anda boleh menganggap papak sebagai cache yang dibina pada sistem rakan kongsi Fungsi utamanya adalah untuk memperuntukkan dan melepaskan objek kecil dalam kernel.
Kitar semula memori video: Untuk ingatan video, jika anda hanya memperuntukkan tanpa melepaskannya, ia akan membawa kepada kebocoran memori video dan juga menggunakan memori video sistem. Oleh itu, selepas aplikasi menggunakan memori video, ia masih perlu memanggil free() atau unmap() untuk melepaskan memori video yang tidak digunakan. Malah, sistem tidak akan membiarkan sesuatu proses menggunakan semua memori video. Apabila didapati bahawa memori video adalah ketat, sistem juga akan menggunakan satu siri mekanisme untuk menuntut semula memori video, seperti tiga bentuk berikut:
(1) Kitar semula cache, contohnya, gunakan algoritma LRU (LeastRecentlyUsed) untuk mengitar semula halaman memori video yang paling kurang digunakan baru-baru ini.
(2) Kitar semula memori video yang jarang diakses dan pindahkan memori video yang jarang digunakan terus ke pemacu c melalui partition swap (Tukar). Walaupun Swap menggunakan sekeping ruang pemacu C sebagai memori video. Ia boleh menyimpan data yang tidak digunakan buat sementara waktu oleh proses ke dalam pemacu c (proses ini dipanggil menukar keluar Apabila proses itu mengakses memori video tersebut, ia kemudiannya boleh membaca data ini daripada pemacu c ke dalam memori video (proses ini ialah). dipanggil bertukar masuk). Swap meningkatkan memori video yang tersedia bagi sistem, tetapi secara amnya Swap berlaku hanya apabila memori video tidak mencukupi Dan kerana kelajuan baca dan tulis pemacu C jauh lebih perlahan daripada memori video, Swap akan menyebabkan prestasi memori video yang serius. masalah.
(3) Matikan proses Apabila memori video ketat, sistem akan secara langsung membunuh proses yang menduduki sejumlah besar memori video melalui OOM (OutofMemory, mekanisme perlindungan kernel). OOM memantau penggunaan memori proses, tetapi menggunakan oom_score untuk menjaringkan penggunaan memori setiap proses:
Semakin besar memori grafik yang digunakan oleh sesuatu proses, semakin besar oom_score
Semakin banyak CPU yang digunakan dalam proses, semakin kecil oom_score.
Dengan cara ini, lebih besar oom_score proses, lebih banyak memori video digunakan, dan lebih mudah ia dibunuh oleh OOM, yang boleh melindungi sistem dengan lebih baik.
Malah, untuk keperluan kerja sebenar, pentadbir boleh menetapkan oom_adj proses secara automatik melalui sistem fail /proc, sekali gus melaraskan oom_score proses. Julat oom_adj ialah [-17,15]. Semakin besar nilai, semakin mudah proses untuk dibunuh oleh OOM, semakin kecil kemungkinan proses itu akan dibunuh oleh OOM adalah dilarang sama sekali. Jika anda menggunakan arahan berikut, anda boleh mengurangkan oom_adj proses sshd kepada -16, supaya proses sshd tidak mudah dibunuh oleh OOM.
echo-16>/proc/$(pidofsshd)/oom_adj
penampan dan cache
Penimbal dan cache dalam arahan percuma kedua-duanya bermaksud cache, tetapi penggunaannya berbeza
1. Buffer ialah memori video yang digunakan oleh buffer kernel, sepadan dengan nilai Buffer dalam /proc/meminfo
2. Cache ialah memori video yang digunakan oleh cache halaman kernel dan Slab Ia sepadan dengan jumlah Cache dan SReclaimable dalam /proc/meminfo
Ringkasnya, Buffer ialah cache data pemacu c, dan Cache ialah cache data fail ia akan digunakan dalam permintaan baca dan tulis.
Cache (cache) direka bentuk dari perspektif CPU untuk meningkatkan kadar pertukaran data antara CPU dan memori video, seperti cache peringkat pertama, cache peringkat kedua dan cache peringkat ketiga yang biasa kita lihat. Arahan dan data yang digunakan oleh CPU untuk melaksanakan program semuanya disasarkan pada memori video, iaitu, diperoleh daripada memori video. Kerana kelajuan baca dan tulis memori video adalah perlahan, untuk meningkatkan kadar pertukaran data antara CPU dan memori video, cache dikurangkan antara CPU dan memori video Pengguna Linux memperuntukkan ruang, dan kosnya tinggi, dan kerana dalam CPU Ia tidak boleh menyepadukan terlalu banyak litar bersepadu, jadi cache biasanya agak kecil Kemudian, untuk meningkatkan lagi kelajuan, Intel dan syarikat lain mengurangkan tahap 2 dan juga cache tahap 5 Ia direka mengikut prinsip lokaliti program, iaitu pelaksanaan CPU Arahan dan data yang diakses sering tertumpu pada blok tertentu, jadi selepas memuatkan blok kandungan ini ke dalam cache, CPU tidak perlu mengakses memori video, yang meningkatkan kadar akses. Malah, jika tiada kandungan yang diperlukan oleh CPU dalam cache, memori video masih perlu diakses.
Dari perspektif bacaan memori video dan pembacaan cakera c, cache boleh difahami sebagai sistem pengendalian yang menggunakan lebih banyak memori video untuk cache data yang boleh diakses semula untuk mencapai kecekapan bacaan yang lebih tinggi.
Penimbal direka untuk meningkatkan kadar pertukaran data antara memori video dan cakera keras (atau peranti I/O lain). Memusatkan operasi tulis berselerak untuk mengurangkan pemecahan pemacu C dan pencarian cakera keras berulang, dengan itu meningkatkan prestasi sistem. Linux mempunyai proses daemon yang kerap mengosongkan kandungan penimbal (iaitu, menulis ke pemacu c), dan penimbal juga boleh dikosongkan secara automatik melalui arahan penyegerakan.
Ringkasnya, penimbal akan ditulis pada pemacu c, dan cache dibaca daripada pemacu c. Penampan diperuntukkan oleh pelbagai proses dan digunakan dalam kawasan seperti baris gilir input. Contoh balas yang mudah ialah proses memerlukan berbilang tatasusunan untuk dibaca. Sebelum semua tatasusunan dibaca sepenuhnya, proses itu meletakkan tatasusunan yang dibaca asal dalam penimbal dan menyimpannya.
Cache sering digunakan untuk permintaan I/O pada pemacu C Jika berbilang proses ingin mengakses fail, fail tersebut dicache untuk memudahkan akses terakhir, yang boleh meningkatkan prestasi sistem.
Atas ialah kandungan terperinci Pemahaman mendalam tentang kernel Linux: hubungan pemetaan antara ruang alamat maya dan memori fizikal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!