Beberapa hari yang lalu, seorang lagi rakan sekerja datang untuk bertanya soalan lain berkaitan dengan ingatan maya, saya mendapati pemahaman saya tentang ingatan maya tidak cukup mendalam, dan beberapa konsep agak bercanggah. Jadi saya meneliti maklumat tersebut dan menyusun semula pengetahuan ini, dengan harapan dapat menggunakannya dengan lebih lancar pada masa akan datang.
Tidak lama dahulu, terdapat satu lagi perkongsian dalam kumpulan yang saya nantikan: "Memori Maya dalam Linux". Pada suatu malam ketika kami bekerja lebih masa, kami membincangkan konsep ingatan maya Selepas ketua mendapati beberapa rakan sekerja tidak memahami ingatan maya dengan jelas, beliau telah memilih topik untuk pelajar ini (ketawa).
Saya belajar beberapa konsep tentang sistem pengendalian sebelum ini, terutamanya kerana saya jengkel pada empat tahun kolej yang sia-sia selepas tamat pengajian, saya berasa sedikit kesal dengan latar belakang saya dalam sains komputer, jadi saya meluangkan masa selepas bekerja untuk menonton sistem pengendalian dibuka kelas Institut Teknologi Harbin di Bilik Darjah Awan NetEase , saya juga membaca buku yang agak cetek tentang sistem pengendalian, "Reka Bentuk dan Pelaksanaan Kernel Linux", dan apabila saya menulis pelayan ringkas dalam C tahun lepas, saya juga mengetahui lebih lanjut tentang asas. pengetahuan tentang sistem. Terima kasih kepada pengetahuan ini, saya berasa lebih mengawal pengetahuan lapisan aplikasi, dan ia juga membantu saya semasa menyelesaikan masalah kali terakhir.
Beberapa hari yang lalu, seorang lagi rakan sekerja datang untuk bertanya soalan lain berkaitan dengan ingatan maya, saya mendapati pemahaman saya tentang ingatan maya tidak cukup mendalam, dan beberapa konsep agak bercanggah. Jadi saya meneliti maklumat tersebut dan menyusun semula pengetahuan ini, dengan harapan dapat menggunakannya dengan lebih lancar pada masa akan datang.
Asal usul ingatan maya
Tidak dinafikan bahawa memori maya pastinya merupakan salah satu konsep terpenting dalam sistem pengendalian. Saya fikir ia disebabkan terutamanya oleh "kedudukan strategik" ingatan yang penting. CPU terlalu pantas, tetapi mempunyai kapasiti kecil dan satu fungsi Perkakasan I/O lain menyokong pelbagai fungsi mewah, tetapi ia terlalu perlahan berbanding dengan CPU. Jadi pelincir diperlukan sebagai penampan di antara mereka, dan di sinilah memori dimainkan.
Dalam sistem pengendalian moden, multitasking adalah standard. Keselarian berbilang tugas meningkatkan penggunaan CPU, tetapi ia juga membawa kepada konflik dalam operasi memori antara pelbagai proses Konsep memori maya dicadangkan untuk menyelesaikan masalah ini.
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 halaman (Halaman).
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 memori maya sistem pengendalian kepada memori fizikal dipanggil jadual halaman.
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, unit pengurusan memori MMU (Memory Management Unit), yang digunakan khas untuk menterjemah alamat memori maya. CPU juga menetapkan strategi cache untuk pengalamatan jadual halaman Disebabkan lokaliti program, kadar hit cachenya boleh mencapai 98%.
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 menjana gangguan halaman Semasa pemprosesan gangguan, sistem beralih ke keadaan kernel untuk virtualisasi proses Alamat memberikan alamat fizikal.
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 memori: Disebabkan oleh "penipuan" memori maya pada proses, setiap proses menganggap bahawa memori yang diperolehi 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 ke fail dalam direktori /dev/ Kami boleh mengendalikan perkakasan secara langsung melalui fail peranti ini, dan memori tidak terkecuali. Di Linux, tetapan memori dipetakan ke /dev/mem, dan pengguna root boleh terus mengendalikan memori 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.
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 (resident) Nilai lajur ini ialah saiz sebenar yang dipetakan ke 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 seperti percuma dan vmstat boleh mengeluarkan status memori sistem semasa Perlu diingatkan bahawa memori yang tersedia bukan hanya lajur yang malas sistem pengendalian, sebilangan besar penimbal/cache berada dalam Proses tidak akan dibersihkan serta-merta selepas ia tidak lagi digunakan Jika proses yang sebelum ini menggunakannya boleh terus digunakan semula, ia juga boleh dieksploitasi jika perlu.
Selain itu, anda boleh menggunakan cat /proc/meminfo untuk 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 proses secara individu, anda boleh menggunakan arahan pmap pid, yang akan menyenaraikan penghunian setiap segmen memori maya dari alamat rendah ke alamat tinggi.
Anda boleh menambah parameter -XX untuk mengeluarkan maklumat yang lebih terperinci.
Ubah suai konfigurasi memori
Kami juga boleh mengubah suai konfigurasi sistem Linux, menggunakan sysctl vm [-options] CONFIG atau terus membaca dan menulis fail dalam direktori /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 vm.swappiness=0 untuk menetapkan memori untuk menggunakan swap sesedikit mungkin, atau hanya menggunakan arahan 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 Analisis mendalam tentang prinsip ingatan maya Linux, ucapkan selamat tinggal kepada masalah ingatan yang tidak mencukupi!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!