Mengapa Linux menggunakan partisi swap ketika kernel mendukung paging / memori virtual?

23

Sejauh yang saya mengerti paging dan swapping, mereka konsep yang sama sekali berbeda. Sementara swapping berarti, bahwa suatu proses baik sepenuhnya dalam memori fisik atau pada hard drive, dengan bagian paging dari suatu proses dapat dalam memori fisik dan bagian lain dapat pada hard drive.

Tetapi mengapa linux membutuhkan partisi swap? Jika memori fisik penuh, beberapa proses akan di-outsource ke hard drive dan proses baru akan dipetakan dari memori virtual ke memori fisik.

Saya hanya tidak mengerti mengapa orang perlu partisi swap (atau bertukar secara umum)?

Atau ini hanya masalah terminologi dan swap partition == virtual memory?

JohnnyFromBF
sumber
5
Berhati-hatilah bahwa "memori virtual" dalam arsitektur komputer adalah teknik, sedangkan MS Windows (salah IMO) mendefinisikannya sebagai "Memori virtual adalah ruang penyimpanan pada hard disk komputer Anda yang digunakan Windows bersama dengan memori akses acak (RAM)." IE google windows "memori virtual"
serbuk kayu

Jawaban:

25

Ya itu hanya masalah terminologi, dalam banyak kasus partisi swap digunakan sebagai memori virtual.

Alasan sistem UNIX dan seperti UNIX lebih suka partisi swap ke file halaman adalah bahwa mereka dapat bersebelahan yang menghasilkan waktu pencarian yang lebih rendah dibandingkan dengan file halaman yang mungkin terfragmentasi.

Patuck
sumber
6
Dan dengan cara ini juga lebih mudah untuk berbagi partisi swap tunggal di antara instalasi Linux.
oktosi
3
biasanya pagefile sepenuhnya dibuat pada boot pertama, jadi itu tidak akan terfragmentasi (well .. masih ada beberapa kemungkinan ..)
AndreaCi
12
UNIX yang paling awal hanya bertukar, tidak paging, dan hanya bisa bertukar ke partisi khusus. Paging diimplementasikan segera setelah perangkat keras mendukungnya, tetapi nama "partisi swap" macet. Paging ke file lebih baru dan memiliki overhead OS yang lebih tinggi serta risiko fragmentasi, sehingga masih berkecil hati.
zwol
1
"Partisi swap digunakan sebagai memori virtual." - Hanya Microsoft Windows yang mendefinisikan penyimpanan sekunder (mis. File halaman pada disk) sebagai "memori virtual". Tetapi bahkan mereka berusaha untuk menjauh dari penggunaan ini. Coba googling windows "memori virtual" dan sinopsis untuk hasil pertama ("Memori virtual adalah ruang penyimpanan ...") tidak cocok dengan konten halaman. Pernyataan yang benar adalah "partisi swap digunakan oleh memori virtual."
serbuk kayu
14

Saya tidak tahu dari mana Anda mendapat anggapan bahwa "bertukar berarti, bahwa suatu proses sepenuhnya dalam memori fisik atau pada hard drive". Makna itu belum digunakan selama beberapa dekade. Mengutip Wikipedia :

Secara historis, swapping disebut memindahkan dari / ke penyimpanan sekunder seluruh program sekaligus, dalam skema yang dikenal sebagai roll-in / roll-out. Pada 1960-an, setelah konsep memori virtual diperkenalkan — dalam dua varian, baik menggunakan segmen atau halaman — istilah swapping diterapkan untuk memindahkan, masing-masing, baik segmen atau halaman, antara disk dan memori. Hari ini dengan memori virtual sebagian besar didasarkan pada halaman, bukan segmen, swapping menjadi sinonim yang cukup dekat paging, meskipun dengan satu perbedaan. [Meragukan - bahas]

Memang, dalam konteks apa pun yang melibatkan Linux (atau sistem unix lainnya), paging dan swapping cukup identik. Keduanya merujuk pada penggunaan memori virtual di mana data halaman dapat disimpan dalam RAM atau pada disk. (Halaman 4kB pada perangkat apa pun yang mungkin Anda temui.) Program menggunakan halaman memori tidak peduli atau bahkan tahu di mana data disimpan, itu hanya terus menggunakan alamat virtual. Kernel mentransfer data antara RAM dan disk dan memperbarui tabel MMU saat berjalan sehingga entri untuk alamat virtual menunjuk ke halaman fisik dalam memori, atau berisi nilai khusus yang menyebabkan prosesor menjalankan beberapa kode kernel yang akan memuat data yang sesuai dari disk.

Paging mengacu pada proses generik ini. Swapping mengacu pada kasus di mana data pada disk berada di area khusus: area swap (partisi swap atau file swap). Paging juga dapat dilakukan antara RAM dan file, dan dalam hal ini biasanya tidak disebut sebagai swapping . Misalnya, ketika Anda menjalankan suatu program, kode harus dimuat ke dalam memori untuk dieksekusi; jika halaman kode perlu diusir dari RAM untuk memberikan ruang bagi hal lain, maka tidak perlu menulis halaman ini ke area swap, karena dapat dimuat kembali dari file program. (Ini dapat dilakukan untuk semua data hanya baca, bukan hanya kode program.)

Jika memori fisik (hampir) penuh, kernel mencari halaman dalam RAM (bukan seluruh proses) yang belum digunakan baru-baru ini. Jika halaman itu mereproduksi konten file disk (ada tabel di kernel untuk menunjukkan ini), halaman tersebut dapat direklamasi. Jika tidak, halaman tersebut ditulis untuk ditukar, kemudian direklamasi. Baik kernel memperbarui entri dalam tabel memori virtual proses (yang menjadi tabel MMU saat proses dijalankan) untuk menandainya sebagai tidak dalam RAM dan kemudian dapat menggunakan kembali halaman fisik untuk sesuatu yang lain (program yang berbeda, atau halaman lain dari program yang sama).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Paragraf pertama jawaban Anda memberi tahu dia dari mana ia mendapatkan gagasan: dokumen - dokumen lama . (Saya ingat ketika ada perbedaan antara bertukar dan paging juga.)
RonJohn
9

Fasilitas paging / memori virtual memungkinkan kernel "memvirtualisasi" memori ke proses userspace. Kernel dapat mengambil halaman dari memori fisik, dan mengaturnya melalui paging sehingga tampak bersebelahan dengan proses userspace.

Batas dapat ditetapkan pada memori proses userspace dan jika proses melampaui itu "kesalahan halaman" terjadi, yang menyebabkan pengecualian CPU yang memantul kembali ke kernel. Ini mencegah program userspace dari mengacaukan memori yang dialokasikan ke kernel atau program lain, tanpa izin kernel.

Biasanya program userspace meminta kernel untuk memperpanjang batas ini melalui antarmuka yang terdefinisi dengan baik (disebut dengan fungsi C malloc()dan free()misalnya.). Kernel bertanggung jawab untuk melacak berapa banyak dan memori apa yang dialokasikan oleh suatu program.

Mekanisme "kesalahan halaman" ini juga dapat membuat kernel menukar halaman yang coba diakses oleh proses dengan satu dari disk, jika kernel dapat kelebihan memori (dan Windows dan Linux mendukung ini) maka mengapa disebut swapping. Jika akses memori memang tidak valid (yaitu proses mencoba mengakses memori yang tidak diminta terlebih dahulu) maka biasanya proses tersebut akan dimatikan dengan SIGSEGV.

Jadi "swapping" adalah fitur tambahan (di Linux Anda benar-benar dapat menonaktifkannya sepenuhnya jika Anda mau) yang tergantung pada memori virtual / paging, tetapi tidak diperlukan hanya karena CPU memiliki memori / paging virtual. Konsepnya tidak sama tetapi swapping tergantung pada paging / memori virtual yang ada.


Juga, setelah lebih dekat membaca pertanyaan Anda, "paging" kadang-kadang digunakan sebagai sinonim untuk "swapping" - tetapi saya belum pernah mendengar tentang "swapping" yang berarti memori seluruh proses ditukar vs "paging" yang berarti hanya sebagian dari itu ditukar.

Tetapi mengapa linux membutuhkan partisi swap? Jika memori fisik penuh, beberapa proses akan di-outsource ke hard drive dan proses baru akan dipetakan dari memori virtual ke memori fisik.

"Memori virtual" adalah memori fisik, hanya "dipetakan ulang." Perangkat keras MMU tidak dapat langsung memetakan ke perangkat penyimpanan apa pun. MMU dapat melempar kesalahan yang memberitahu kernel suatu proses mencoba mengakses memori yang seharusnya tidak - dan kernel dapat menggunakan mekanisme ini untuk melihat bahwa suatu proses menginginkan sesuatu dari disk yang ia pikir ada di memori dan kemudian melakukan " menukar". Intinya adalah sistem operasi yang memutuskan untuk menyimpan halaman ke disk sehingga dapat menggunakan halaman tersebut untuk proses lain, bukan perangkat keras.

LawrenceC
sumber
2

Secara umum partisi swap tidak sama dengan memori virtual.

Proses dapat membutuhkan lebih banyak memori daripada memori fisik yang sebenarnya, sehingga pengembang OS memutuskan untuk mengasumsikan ada lebih banyak memori dalam sistem yang disebut "memori virtual".

Memori virtual ini pada dasarnya adalah memori fisik dan bagian dari disk. Bagian disk ini disebut "swap" di Linux.

Pengembang juga mengusulkan agar penggunaan bagian dari memori virtual yang terletak pada hard disk harus serendah mungkin. Demi itu, semua memori virtual dibagi menjadi bagian-bagian kecil yang disebut "halaman". Banyak halaman yang digunakan dalam kecepatan rendah, halaman-halaman ini harus ditulis ke bagian memori virtual pada hard disk. Operasi ini disebut "swap out". OS harus melacak halaman mana yang tidak ada dalam memori fisik untuk menemukannya saat diperlukan. Kesalahan halaman terjadi ketika suatu program ingin menulis / membaca bagian dari memori yang ditukar.

Untuk menjawab pertanyaan Anda: Linux membutuhkan partisi swap untuk menukar beberapa halaman memori dan Anda dapat melihat statistik penggunaan memori virtual dengan vmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

Kolom 'swap' menunjukkan swap out dan dalam statistik. Juga tautan ini menjelaskan kehabisan memori virtual dan penggunaannya vmstat.

soroosh
sumber