Rumah  >  Artikel  >  Tutorial sistem  >  Memori maya Linux, adakah anda memahaminya dengan baik?

Memori maya Linux, adakah anda memahaminya dengan baik?

WBOY
WBOYke hadapan
2024-02-05 12:42:14930semak imbas

Kata Pengantar

Baru-baru ini, terdapat satu topik perkongsian dalam kumpulan yang saya nantikan: "Memori Maya dalam Linux". Pada suatu malam ketika kami bekerja lebih masa, kami membincangkan konsep ingatan maya Ketua kami mendapati beberapa rakan sekerja tidak memahami ingatan maya dengan cukup jelas, jadi dia memilih topik ini khas untuk rakan sekerja ini (ketawa).

Sebelum ini, saya mempunyai sedikit pemahaman tentang konsep sistem pengendalian, tetapi selepas tamat pengajian, saya berasa sedikit kesal dengan pembaziran jurusan sains komputer saya selama empat tahun di kolej. Oleh itu, selepas bekerja, saya meluangkan masa untuk menonton kelas terbuka sistem pengendalian Institut Teknologi Harbin di Bilik Darjah Awan NetEase, dan juga membaca buku "Reka Bentuk dan Pelaksanaan Kernel Linux" yang menerangkan konsep asas sistem pengendalian. Di samping itu, tahun lepas, saya menulis pelayan mudah menggunakan bahasa C dan mengetahui lebih lanjut mengenai sistem asas. Pengetahuan ini memberi saya pemahaman yang lebih baik tentang lapisan aplikasi dan banyak membantu saya semasa penyelesaian masalah baru-baru ini.

Beberapa hari yang lalu, seorang lagi rakan sekerja bertanya kepada saya soalan lain yang berkaitan dengan ingatan maya, dan saya menyedari bahawa pemahaman saya tentang ingatan maya tidak cukup mendalam, malah beberapa konsep bercanggah. Oleh itu, saya melalui beberapa maklumat dan menyusun semula pengetahuan ini, dengan harapan untuk menjadi lebih fasih dalam aplikasi praktikal pada masa akan datang.

Asal usul


Memori Maya

Tidak dinafikan bahawa memori maya pastinya merupakan salah satu konsep terpenting dalam sistem pengendalian. Saya fikir ia adalah terutamanya kerana kepentingan memori dalam keseluruhan sistem. CPU sangat pantas, tetapi mempunyai kapasiti terhad dan satu fungsi perkakasan I/O lain menyokong pelbagai fungsi mewah, tetapi ia lebih perlahan daripada CPU. Oleh itu, mereka memerlukan pelincir untuk bertindak sebagai penampan di antara mereka, dan di sinilah memori dimainkan.

Dalam sistem pengendalian moden, multitasking telah menjadi standard. Keselarian berbilang tugas meningkatkan penggunaan CPU, tetapi ia juga membawa konflik dalam operasi memori antara pelbagai proses Konsep ingatan maya adalah untuk menyelesaikan masalah ini.

Memori maya Linux, adakah anda memahaminya dengan baik?

Gambar di atas adalah penjelasan paling mudah dan intuitif tentang ingatan maya.

Sistem pengendalian mempunyai sekeping memori fizikal (bahagian tengah) dan dua proses (sebenarnya lebih banyak) P1 dan P2 Sistem pengendalian secara rahsia memberitahu P1 dan P2 bahawa keseluruhan ingatan saya adalah milik anda, gunakannya sesuka hati dan uruskannya. . Tetapi sebenarnya, sistem operasi hanya menarik pai besar untuk mereka kenangan ini dikatakan diberikan kepada P1 dan P2, tetapi sebenarnya mereka hanya diberi nombor siri. Hanya apabila P1 dan P2 benar-benar mula menggunakan ingatan ini, sistem mula bergerak dan menggabungkan pelbagai blok untuk proses itu P2 berfikir bahawa ia menggunakan memori A, tetapi sebenarnya ia telah dialihkan secara senyap ke B sebenar oleh sistem walaupun apabila P1 dan P2 berkongsi memori C, mereka tidak mengetahuinya.

Kaedah sistem pengendalian ini untuk menipu proses ialah ingatan maya. Untuk proses seperti P1 dan P2, mereka semua berfikir bahawa mereka menduduki keseluruhan memori, dan mereka tidak tahu dan tidak perlu mengambil berat tentang alamat memori fizikal yang mereka gunakan.

Penomboran dan jadual halaman

Memori maya ialah konsep dalam sistem pengendalian Bagi sistem pengendalian, memori maya ialah jadual perbandingan Apabila P1 memperoleh data dalam memori A, ia harus pergi ke alamat A memori fizikal untuk mencari data dalam memori B. . Ia harus pergi ke alamat C memori fizikal.

Kami tahu bahawa unit asas dalam sistem ialah Byte Jika setiap Byte memori maya dipetakan ke alamat memori fizikal, setiap entri memerlukan sekurang-kurangnya 8 bait (alamat maya 32-bit -> alamat fizikal 32-bit). dalam kes memori 4G, ruang 32GB diperlukan untuk menyimpan jadual perbandingan, jadi jadual ini terlalu besar untuk memuatkan walaupun alamat fizikal sebenar, jadi sistem pengendalian memperkenalkan konsep 页(Page).

Apabila sistem dimulakan, sistem pengendalian membahagikan keseluruhan memori fizikal kepada halaman dalam unit 4K. Apabila memori diperuntukkan pada masa hadapan, unit adalah halaman, jadi jadual pemetaan halaman memori maya yang sepadan dengan halaman memori fizikal sangat berkurangan hanya memerlukan jadual pemetaan 8M. Tidak ada perlu menyelamatkan hubungan pemetaan, dan Linux juga telah mereka bentuk jadual halaman berbilang peringkat untuk memori yang besar, yang boleh memajukan halaman untuk mengurangkan penggunaan memori. Jadual pemetaan antara memori maya sistem pengendalian dan memori fizikal dipanggil 页表.

Pengalamatan memori dan peruntukan

Kami tahu bahawa melalui mekanisme memori maya, setiap proses berfikir bahawa ia menduduki semua memori Apabila proses mengakses memori, sistem pengendalian akan menukar alamat memori maya yang disediakan oleh proses kepada alamat fizikal, dan kemudian mendapatkan data. di alamat fizikal yang sepadan. Terdapat sekeping perkakasan dalam CPU yang digunakan khusus untuk menterjemah alamat memori maya. CPU juga menetapkan strategi cache untuk pengalamatan jadual halaman Disebabkan lokaliti program, kadar hit cachenya boleh mencapai 98%. 内存管理单元 MMU(Memory Management Unit)

Situasi di atas ialah pemetaan alamat maya ke alamat fizikal dalam memori jadual halaman Jika alamat fizikal yang diakses oleh proses tidak diperuntukkan, sistem akan menghasilkan

Semasa pemprosesan gangguan, sistem bertukar kepada keadaan kernel untuk memperuntukkan alamat maya untuk proses tersebut. 缺页中断

Fungsi


Memori maya bukan sahaja menyelesaikan masalah konflik capaian memori antara pelbagai proses melalui terjemahan alamat memori, tetapi juga membawa lebih banyak faedah.

Proses pengurusan ingatan

Ia membantu proses mengurus ingatan, terutamanya ditunjukkan dalam:

  • Integriti ingatan: Disebabkan oleh "penipuan" memori maya pada proses, setiap proses berpendapat bahawa memori yang diperolehinya adalah alamat berterusan. Apabila kami menulis aplikasi, kami tidak perlu mempertimbangkan peruntukan blok alamat yang besar Kami sentiasa berfikir bahawa sistem mempunyai blok memori yang cukup besar.
  • Keselamatan: Memandangkan apabila proses mengakses memori, ia mesti ditangani melalui jadual halaman Sistem pengendalian boleh melaksanakan kawalan kebenaran memori dengan menambahkan pelbagai bendera kebenaran akses kepada setiap item dalam jadual halaman.

Perkongsian data

Lebih mudah untuk berkongsi memori dan data melalui ingatan maya.

Apabila proses memuatkan perpustakaan sistem, ia sentiasa memperuntukkan sekeping memori terlebih dahulu dan memuatkan fail perpustakaan pada cakera ke dalam memori ini Apabila menggunakan memori fizikal secara langsung, kerana alamat memori fizikal adalah unik, walaupun sistem mendapati bahawa perpustakaan yang sama ada dalam sistem Ia dimuatkan dua kali, tetapi memori pemuatan yang ditentukan oleh setiap proses adalah berbeza, dan sistem tidak dapat melakukan apa-apa.

Apabila menggunakan memori maya, sistem hanya perlu menghalakan alamat memori maya proses ke alamat memori fizikal di mana fail perpustakaan berada. Seperti yang ditunjukkan dalam rajah di atas, alamat B bagi proses P1 dan P2 kedua-duanya menunjuk ke alamat fizikal C.

Ia juga sangat mudah untuk menggunakan memori yang dikongsi dengan menggunakan memori maya Sistem hanya perlu menghalakan alamat memori maya setiap proses ke alamat memori yang dikongsi yang diperuntukkan oleh sistem.

TUKAR

Memori maya membenarkan proses untuk "mengembangkan" ingatan.

Kami menyatakan sebelum ini bahawa memori maya memperuntukkan memori fizikal kepada proses melalui gangguan halaman Memori sentiasa terhad.

Linux mencadangkan konsep partition SWAP boleh digunakan dalam Linux Apabila memori fizikal diperuntukkan tetapi memori yang tersedia tidak mencukupi, data memori yang tidak digunakan buat sementara waktu akan diletakkan pada cakera terlebih dahulu, membenarkan proses yang memerlukan untuk menggunakannya terlebih dahulu. dan kemudian proses itu perlu menggunakannya semula Data ini kemudiannya dimuatkan ke dalam memori Melalui teknologi "swapping" ini, Linux boleh membenarkan proses menggunakan lebih banyak memori.

Soalan Lazim


Saya juga mempunyai banyak soalan apabila memahami ingatan maya.

32-bit dan 64-bit

Masalah yang paling biasa ialah 32-bit dan 64-bit.

CPU mengakses memori melalui bas fizikal, jadi julat alamat akses dihadkan oleh bilangan bas mesin Pada mesin 32-bit, terdapat 32 bas Setiap bas mempunyai dua potensi, tinggi dan rendah, mewakili bit 1 dan 0 masing-masing. Kemudian Alamat maksimum yang boleh diakses ialah 2^32bit = 4GB, jadi adalah tidak sah untuk memasukkan memori yang lebih besar daripada 4G pada mesin 32-bit, dan CPU tidak boleh mengakses memori yang lebih besar daripada 4G.

Tetapi mesin 64-bit tidak mempunyai bas 64-bit, dan memori maksimumnya dihadkan oleh sistem pengendalian Linux pada masa ini menyokong maksimum memori 256G.

Mengikut konsep ingatan maya, tidak mengapa untuk menjalankan perisian 64-bit pada sistem 32-bit Namun, disebabkan reka bentuk struktur alamat memori maya, alamat maya 64-bit tidak boleh digunakan dalam 32-bit. sistem.

Mengendalikan memori fizikal secara langsung

Sistem pengendalian menggunakan memori maya Apakah yang perlu kita lakukan jika kita ingin mengendalikan memori secara terus?

Linux akan memetakan setiap peranti kepada /dev/ 目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。在 Linux 中,内存设置被映射为 /dev/mem, dan pengguna root boleh mengendalikan memori secara terus dengan membaca dan menulis fail ini.

Proses JVM menduduki terlalu banyak memori maya

Apabila menggunakan TOP untuk melihat prestasi sistem, kita akan mendapati bahawa dalam lajur VIRT, proses Java akan menduduki sejumlah besar memori maya.

Memori maya Linux, adakah anda memahaminya dengan baik?

Sebab masalah ini ialah Java menggunakan kolam memori Arena Glibc untuk memperuntukkan sejumlah besar memori maya dan tidak menggunakannya. Di samping itu, fail yang dibaca oleh Java juga akan dipetakan ke dalam memori maya Di bawah konfigurasi lalai mesin maya, setiap timbunan benang Java akan menduduki 1M memori maya. Untuk butiran, anda boleh menyemak sebab program berbilang benang di bawah Linux menggunakan memori maya yang begitu banyak.

Memori fizikal sebenar yang diduduki bergantung pada lajur RES (penduduk) Nilai lajur ini ialah saiz yang sebenarnya dipetakan kepada memori fizikal.

Arahan pengurusan yang biasa digunakan


Kami juga boleh menguruskan memori maya Linux sendiri.

Lihat status memori sistem

Terdapat banyak cara untuk menyemak status memori sistem freevmstat dan arahan lain boleh mengeluarkan status memori sistem semasa Perlu diingatkan bahawa memori yang tersedia bukan hanya lajur yang bebas sejumlah besar buffer/cache akan digunakan apabila proses tidak berjalan Selepas digunakan semula, ia tidak akan dibersihkan dengan serta-merta.

Selain itu, melalui cat /proc/meminfo anda boleh melihat butiran penggunaan memori sistem, termasuk status halaman kotor, dsb. Butiran boleh didapati di: /PROC/MEMINFO Misteri.

pmap

Jika anda ingin melihat pengedaran memori maya bagi proses tertentu secara individu, anda boleh menggunakan arahan pmap pid, yang akan menyenaraikan penghunian setiap segmen memori maya daripada alamat rendah ke alamat tinggi.

Anda boleh menambah -XX parameter untuk mengeluarkan maklumat yang lebih terperinci.

Ubah suai konfigurasi memori

Kami juga boleh mengubah suai konfigurasi sistem Linux dan menggunakan fail dalam direktori sysctl vm [-options] CONFIG 或 直接读写 /proc/sys/vm/ untuk melihat dan mengubah suai konfigurasi.

Operasi SWAP

Ciri SWAP memori maya tidak selalunya bermanfaat Membenarkan proses untuk terus menukar jumlah data yang besar antara memori dan cakera akan sangat menduduki CPU dan mengurangkan kecekapan pengendalian sistem, jadi kadangkala kami tidak mahu menggunakan swap.

Kami boleh mengubah suai arahan vm.swappiness=0 来设置内存尽量少使用 swap,或者干脆使用 swapoff untuk melumpuhkan SWAP.

Ringkasan


Konsep ingatan maya sangat mudah difahami, tetapi ia akan memperoleh satu siri pengetahuan yang sangat kompleks. Artikel ini hanya membincangkan beberapa prinsip asas dan melangkau banyak butiran, seperti penggunaan daftar segmen pertengahan dalam pengalamatan memori maya, penggunaan memori maya sistem pengendalian untuk meningkatkan aplikasi cache dan penimbal, dsb. Jika ada peluang, saya akan membincangkannya secara berasingan.

Atas ialah kandungan terperinci Memori maya Linux, adakah anda memahaminya dengan baik?. 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