misalnya, ketika proses swapped-out dimulai ulang, semua halamannya ada di disk, dan masing-
masing harus dibawa oleh kesalahan halamannya sendiri. Prepaging adalah upaya untuk
mencegah paging awal tingkat tinggi ini. Strateginya adalah membawa ke dalam memori pada
satu waktu semua halaman yang akan dibutuhkan. Beberapa sistem operasi—terutama Solaris—
mempersiapkan bingkai halaman untuk file kecil.
Dalam sistem yang menggunakan model working-set, misalnya, kita dapat menyimpan
daftar halaman dalam working set-nya dengan setiap proses. Jika kita harus menangguhkan
suatu proses (karena menunggu I/O atau kurangnya frame kosong), kita mengingat working set
untuk proses tersebut. Ketika proses akan dilanjutkan (karena I/O telah selesai atau tersedia
cukup banyak frame kosong), kita secara otomatis membawa kembali seluruh rangkaian kerjanya
ke dalam memori sebelum memulai kembali proses.
Prepaging mungkin menawarkan keuntungan dalam beberapa kasus. Pertanyaannya adalah
apakah biaya penggunaan pra-halaman lebih kecil dari biaya servis kesalahan halaman yang
terkait. Mungkin saja banyak halaman yang dibawa kembali ke memori dengan pra-halaman
tidak akan digunakan.
Asumsikan bahwa halaman s sudah dibuat sebelumnya dan sebagian kecil # dari halaman
s ini benar-benar digunakan (0 # 1). Pertanyaannya adalah apakah biaya kesalahan halaman
yang disimpan s* # lebih besar atau lebih kecil dari biaya pra-halaman s* (1 #) halaman yang
tidak perlu. Jika # mendekati 0, pra-halaman akan kalah; jika # mendekati 1, pra-halaman menang.
Bagaimana cara memilih ukuran halaman? Salah satu perhatian adalah ukuran tabel
halaman. Untuk ruang memori virtual yang diberikan, penurunan ukuran halaman meningkatkan
jumlah halaman dan karenanya ukuran tabel halaman. Untuk memori virtual 4 MB (222), misalnya,
akan ada 4.096 halaman 1.024 byte tetapi hanya 512 halaman 8.192 byte. Karena setiap proses
aktif harus memiliki salinan tabel halamannya sendiri, ukuran halaman yang besar diinginkan.
Memori lebih baik digunakan dengan halaman yang lebih kecil, namun. Jika suatu proses
mengalokasikan memori mulai dari lokasi 00000 dan berlanjut sampai memiliki sebanyak yang
dibutuhkan, mungkin tidak akan berakhir tepat pada batas halaman. Dengan demikian, bagian
dari halaman akhir harus dialokasikan (karena halaman adalah unit alokasi) tetapi tidak akan
digunakan (menciptakan fragmentasi internal). Dengan asumsi independensi ukuran proses dan
ukuran halaman, kita dapat mengharapkan bahwa, rata-rata, setengah dari halaman akhir dari
setiap proses akan terbuang sia-sia. Kerugian ini hanya 256 byte untuk halaman 512 byte tetapi
4.096 byte untuk halaman 8.192 byte. Untuk meminimalkan fragmentasi internal, maka, kita
membutuhkan ukuran halaman yang kecil.
Masalah lainnya adalah waktu yang dibutuhkan untuk membaca atau menulis sebuah
halaman. Waktu I/O terdiri dari seek, latency, dan transfer time. Waktu transfer sebanding dengan
jumlah yang ditransfer (yaitu, ukuran halaman)—fakta yang tampaknya bertentangan dengan
ukuran halaman yang kecil. Namun, seperti yang akan kita lihat di Bagian 10.1.1, waktu latency
dan seek time biasanya mengerdilkan waktu transfer. Pada kecepatan transfer 2 MB per detik,
hanya dibutuhkan 0,2 milidetik untuk mentransfer 512 byte. Waktu latency, meskipun, mungkin 8
milidetik, dan mencari waktu 20 milidetik. Dari total waktu I/O
Machine Translated by Google
(28,2 milidetik), oleh karena itu, hanya 1 persen yang disebabkan oleh transfer aktual.
Menggandakan ukuran halaman meningkatkan waktu I/O menjadi hanya 28,4 milidetik. Dibutuhkan
28,4 milidetik untuk membaca satu halaman 1.024 byte tetapi 56,4 milidetik untuk membaca jumlah
yang sama dengan dua halaman masing-masing 512 byte. Jadi, keinginan untuk meminimalkan
waktu I/O menuntut ukuran halaman yang lebih besar.
Namun, dengan ukuran halaman yang lebih kecil, total I/O harus dikurangi, karena lokalitas
akan ditingkatkan. Ukuran halaman yang lebih kecil memungkinkan setiap halaman untuk
mencocokkan lokalitas program dengan lebih akurat. Misalnya, pertimbangkan proses berukuran 200
KB , yang hanya setengahnya (100 KB) yang benar-benar digunakan dalam eksekusi. Jika kita hanya
memiliki satu halaman besar, kita harus membawa seluruh halaman, total 200 KB ditransfer dan
dialokasikan. Jika sebaliknya kami memiliki halaman hanya 1 byte, maka kami hanya dapat membawa
100 KB yang benar-benar digunakan, sehingga hanya 100 KB yang ditransfer dan dialokasikan.
Dengan ukuran halaman yang lebih kecil, maka, kami memiliki resolusi yang lebih baik,
memungkinkan kami untuk mengisolasi hanya memori yang benar-benar dibutuhkan. Dengan ukuran
halaman yang lebih besar, kita harus mengalokasikan dan mentransfer tidak hanya apa yang
dibutuhkan tetapi juga hal lain yang kebetulan ada di halaman, baik dibutuhkan atau tidak. Dengan
demikian, ukuran halaman yang lebih kecil akan menghasilkan lebih sedikit I/O dan lebih sedikit total memori yang d
Tetapi apakah Anda memperhatikan bahwa dengan ukuran halaman 1 byte, kami akan memiliki
kesalahan halaman untuk setiap byte? Proses 200 KB yang menggunakan hanya setengah dari
memori itu akan menghasilkan hanya satu kesalahan halaman dengan ukuran halaman 200 KB
tetapi 102.400 kesalahan halaman dengan ukuran halaman 1 byte. Setiap kesalahan halaman
menghasilkan sejumlah besar overhead yang diperlukan untuk memproses interupsi, menyimpan
register, mengganti halaman, antrian untuk perangkat paging, dan memperbarui tabel. Untuk
meminimalkan jumlah kesalahan halaman, kita perlu memiliki ukuran halaman yang besar.
Faktor lain juga harus dipertimbangkan (seperti hubungan antara ukuran halaman dan ukuran
sektor pada perangkat paging). Masalah tidak memiliki jawaban terbaik. Seperti yang telah kita lihat,
beberapa faktor (fragmentasi internal, lokalitas) mendukung ukuran halaman yang kecil, sedangkan
faktor lainnya (ukuran tabel, waktu I/O ) mendukung ukuran halaman yang besar. Namun demikian,
tren historisnya adalah menuju ukuran halaman yang lebih besar, bahkan untuk sistem seluler.
Memang, edisi pertama Konsep Sistem Operasi (1983) menggunakan 4.096 byte sebagai batas atas
pada ukuran halaman, dan nilai ini adalah ukuran halaman yang paling umum pada tahun 1990.
Sistem modern sekarang dapat menggunakan ukuran halaman yang jauh lebih besar, seperti yang
akan kita lihat di bagian berikut.
Di Bab 8, kami memperkenalkan rasio hit TLB. Ingat bahwa rasio hit untuk TLB mengacu pada
persentase terjemahan alamat virtual yang diselesaikan di TLB daripada tabel halaman. Jelas, rasio
hit terkait dengan jumlah entri di TLB, dan cara untuk meningkatkan rasio hit adalah dengan
meningkatkan jumlah entri di TLB. Namun, ini tidak murah, karena memori asosiatif yang digunakan
untuk membangun TLB mahal dan haus daya.
Terkait dengan rasio hit adalah metrik serupa: TLBreach. Jangkauan TLB mengacu pada
jumlah memori yang dapat diakses dari TLB dan hanya jumlah entri dikalikan dengan ukuran
halaman. Idealnya, set kerja untuk suatu proses disimpan di TLB. Jika tidak, proses akan
menghabiskan banyak waktu untuk menyelesaikan referensi memori di tabel halaman daripada TLB.
Jika kita menggandakan jumlah entri di TLB, kita menggandakan jangkauan TLB . Namun,
Machine Translated by Google
Karena mereka menyimpan informasi tentang halaman memori virtual mana yang disimpan di
setiap bingkai fisik, tabel halaman terbalik mengurangi jumlah memori fisik yang diperlukan untuk
menyimpan informasi ini. Namun, tabel halaman terbalik tidak lagi berisi informasi lengkap tentang
ruang alamat logis dari suatu proses, dan informasi itu diperlukan jika halaman yang direferensikan
saat ini tidak ada di memori. Permintaan paging memerlukan informasi ini untuk memproses
kesalahan halaman.
Agar informasi tersedia, tabel halaman eksternal (satu per proses) harus disimpan. Setiap tabel
tersebut terlihat seperti tabel halaman per-proses tradisional dan berisi informasi di mana setiap
halaman virtual berada.
Tetapi apakah tabel halaman eksternal meniadakan kegunaan tabel halaman terbalik? Karena
tabel ini direferensikan hanya ketika terjadi kesalahan halaman, tabel ini tidak perlu tersedia dengan
cepat. Sebaliknya, mereka sendiri masuk dan keluar dari memori seperlunya. Sayangnya, kesalahan
halaman sekarang dapat menyebabkan manajer memori virtual untuk menghasilkan kesalahan
halaman lain karena halaman di tabel halaman eksternal diperlukan untuk menemukan halaman
virtual di penyimpanan cadangan. Kasus khusus ini memerlukan penanganan yang hati-hati di kernel
dan penundaan dalam pemrosesan pencarian halaman.
permintaan dirancang agar transparan bagi program pengguna. Dalam banyak kasus, pengguna
sama sekali tidak menyadari sifat halaman memori. Di lain
Machine Translated by Google
kasus, bagaimanapun, kinerja sistem dapat ditingkatkan jika pengguna (atau kompiler) memiliki
kesadaran tentang paging permintaan yang mendasarinya.
Mari kita lihat contoh yang dibuat-buat tetapi informatif. Asumsikan bahwa halaman
berukuran 128 kata. Pertimbangkan program C yang fungsinya adalah untuk menginisialisasi
ke 0 setiap elemen dari array 128-kali-128. Kode berikut adalah tipikal:
int saya, j;
int[128][128] data;
Perhatikan bahwa array disimpan baris utama; yaitu, array menyimpan data[0][0], data[0][1],
···, data[0][127], data[1][0], data[1][1] , ···, data[127][127]. Untuk halaman 128 kata, setiap baris
membutuhkan satu halaman. Jadi, kode sebelumnya nol satu kata di setiap halaman, lalu kata
lain di setiap halaman, dan seterusnya. Jika sistem operasi mengalokasikan kurang dari 128
frame ke seluruh program, maka eksekusinya akan menghasilkan 128 × 128 = 16.384
kesalahan halaman.
Sebaliknya, misalkan kita mengubah kode menjadi
int saya, j;
int[128][128] data;
Kode ini meniadakan semua kata pada satu halaman sebelum memulai halaman berikutnya,
mengurangi jumlah kesalahan halaman menjadi 128.
Pemilihan struktur data dan struktur pemrograman yang cermat dapat meningkatkan
lokalitas dan karenanya menurunkan tingkat kesalahan halaman dan jumlah halaman dalam
set kerja. Misalnya, tumpukan memiliki lokalitas yang baik, karena akses selalu dibuat ke atas.
Tabel hash, sebaliknya, dirancang untuk menyebarkan referensi, menghasilkan lokalitas yang
buruk. Tentu saja, lokalitas referensi hanyalah salah satu ukuran efisiensi penggunaan struktur
data. Faktor berat lainnya termasuk kecepatan pencarian, jumlah referensi memori, dan jumlah
halaman yang disentuh.
Pada tahap selanjutnya, compiler dan loader dapat memiliki pengaruh yang signifikan
pada paging. Memisahkan kode dan data dan menghasilkan kode reentrant berarti bahwa
halaman kode hanya dapat dibaca dan karenanya tidak akan pernah dimodifikasi. Halaman
bersih tidak harus dicabut untuk diganti. Pemuat dapat menghindari penempatan rutinitas
melintasi batas halaman, menjaga setiap rutinitas sepenuhnya dalam satu halaman.
Rutinitas yang saling memanggil berkali-kali bisa dikemas dalam satu halaman yang sama.
Pengemasan ini adalah varian dari masalah pengepakan bin dari riset operasi: cobalah untuk
mengemas segmen beban berukuran variabel ke dalam halaman berukuran tetap sehingga
referensi antar halaman diminimalkan. Pendekatan seperti ini sangat berguna untuk ukuran
halaman yang besar.
Machine Translated by Google
penyangga
disk drive
Gambar 9.28 Alasan mengapa frame yang digunakan untuk I/O harus berada di memori.
Machine Translated by Google
Bit kunci digunakan dalam berbagai situasi. Seringkali, beberapa atau semua kernel sistem operasi
terkunci ke dalam memori. Banyak sistem operasi tidak dapat mentolerir kesalahan halaman yang
disebabkan oleh kernel atau modul kernel tertentu, termasuk yang melakukan manajemen memori. Proses
pengguna mungkin juga perlu mengunci halaman ke dalam memori. Sebuah proses database mungkin
ingin mengelola sepotong memori, misalnya, memindahkan blok antara disk dan memori itu sendiri karena
ia memiliki pengetahuan terbaik tentang bagaimana ia akan menggunakan datanya. Penyematan halaman
seperti itu dalam memori cukup umum, dan sebagian besar sistem operasi memiliki panggilan sistem yang
memungkinkan aplikasi meminta agar wilayah ruang alamat logisnya disematkan. Perhatikan bahwa fitur
ini dapat disalahgunakan dan dapat menyebabkan tekanan pada algoritme manajemen memori. Oleh
karena itu, sebuah aplikasi seringkali membutuhkan hak istimewa untuk membuat permintaan seperti itu.
Penggunaan lain untuk bit kunci melibatkan penggantian halaman normal. Pertimbangkan urutan
kejadian berikut: Kesalahan proses dengan prioritas rendah. Memilih frame pengganti, sistem paging
membaca halaman yang diperlukan ke dalam memori.
Siap untuk melanjutkan, proses dengan prioritas rendah memasuki antrian siap dan menunggu CPU.
Karena ini adalah proses berprioritas rendah, mungkin tidak dipilih oleh penjadwal CPU untuk sementara
waktu. Sementara proses berprioritas rendah menunggu, proses berprioritas tinggi mengalami kesalahan.
Mencari pengganti, sistem paging melihat halaman yang ada di memori tetapi belum direferensikan atau
dimodifikasi: ini adalah halaman yang baru saja dibawa oleh proses berprioritas rendah. Halaman ini terlihat
seperti pengganti yang sempurna: bersih dan akan tidak perlu ditulis, dan ternyata sudah lama tidak
digunakan.
Apakah proses berprioritas tinggi harus dapat menggantikan proses berprioritas rendah adalah
keputusan kebijakan. Bagaimanapun, kami hanya menunda proses dengan prioritas rendah untuk
kepentingan proses dengan prioritas tinggi. Namun, kami menyia-nyiakan upaya yang dihabiskan untuk
memasukkan halaman untuk proses berprioritas rendah. Jika kami memutuskan untuk mencegah
penggantian halaman yang baru dibawa sampai halaman tersebut dapat digunakan setidaknya sekali,
maka kami dapat menggunakan bit kunci untuk menerapkan mekanisme ini. Saat halaman dipilih untuk
diganti, bit kuncinya diaktifkan. Itu tetap menyala sampai proses kesalahan dikirim lagi.
Menggunakan mata kunci dapat berbahaya: mata kunci dapat dihidupkan tetapi tidak pernah
dimatikan. Jika situasi ini terjadi (karena bug di sistem operasi, misalnya), bingkai yang terkunci menjadi
tidak dapat digunakan. Pada sistem pengguna tunggal, penggunaan penguncian yang berlebihan hanya
akan merugikan pengguna yang melakukan penguncian.
Sistem multiuser harus kurang mempercayai pengguna. Misalnya, Solaris memungkinkan penguncian
"petunjuk", tetapi bebas untuk mengabaikan petunjuk ini jika kumpulan bingkai bebas menjadi terlalu kecil
atau jika proses individu meminta terlalu banyak halaman dikunci dalam memori.
9.10.1 Windows
Windows mengimplementasikan memori virtual menggunakan paging permintaan dengan pengelompokan.
Clustering menangani kesalahan halaman dengan membawa tidak hanya halaman yang salah tetapi juga
Machine Translated by Google
beberapa halaman setelah halaman yang salah. Ketika sebuah proses pertama kali dibuat,
proses tersebut diberikan minimum dan maksimum working-set. Minimum working-set
adalah jumlah halaman minimum yang dijamin oleh proses dalam memori.
Jika memori yang cukup tersedia, suatu proses dapat diberikan halaman sebanyak maksimum
working-setnya. (Dalam beberapa keadaan, suatu proses mungkin diizinkan untuk melebihi
batas maksimum kerja.) Manajer memori virtual memelihara daftar bingkai halaman gratis.
Terkait dengan daftar ini adalah nilai ambang batas yang digunakan untuk menunjukkan
apakah tersedia cukup memori bebas. Jika kesalahan halaman terjadi untuk proses yang
berada di bawah maksimum set kerja, manajer memori virtual mengalokasikan halaman dari
daftar halaman gratis ini. Jika proses yang bekerja pada set maksimumnya menyebabkan
kesalahan halaman, proses tersebut harus memilih halaman untuk penggantian menggunakan
kebijakan penggantian halaman LRU lokal .
Ketika jumlah memori bebas turun di bawah ambang batas, manajer memori virtual
menggunakan taktik yang dikenal sebagai pemangkasan set kerja otomatis untuk
mengembalikan nilai di atas ambang batas. Pemangkasan set kerja otomatis bekerja dengan
mengevaluasi jumlah halaman yang dialokasikan untuk proses. Jika suatu proses telah
mengalokasikan lebih banyak halaman daripada minimum working-set-nya, manajer memori
virtual menghapus halaman-halaman sampai proses mencapai minimum working-set-nya.
Sebuah proses yang berada pada working-set minimumnya dapat dialokasikan halaman dari
daftar free-page-frame setelah memori bebas yang cukup tersedia. Windows melakukan
pemangkasan set kerja pada mode pengguna dan proses sistem.
Memori virtual dibahas dengan sangat rinci dalam studi kasus Windows di Bab 19.
9.10.2 Solaris
Di Solaris, ketika sebuah utas menimbulkan kesalahan halaman, kernel memberikan halaman
ke utas yang salah dari daftar halaman gratis yang dikelolanya. Oleh karena itu, sangat penting
bahwa kernel menyimpan jumlah memori bebas yang cukup. Terkait dengan daftar halaman
gratis ini adalah parameter—lotsfree—yang mewakili ambang batas untuk memulai paging.
Parameter lotsfree biasanya diatur ke 1/64 ukuran memori fisik. Empat kali per detik, kernel
memeriksa apakah jumlah memori bebas kurang dari lotfree. Jika jumlah halaman gratis
berada di bawah lotfree, proses yang dikenal sebagai pageout dimulai. Proses keluar halaman
mirip dengan algoritma kesempatan kedua yang dijelaskan di Bagian 9.4.5.2, kecuali bahwa
menggunakan dua tangan saat memindai halaman, bukan satu.
Proses pageout bekerja sebagai berikut: Jarum depan jam memindai semua halaman
dalam memori, menyetel bit referensi ke 0. Kemudian, jarum belakang jam memeriksa bit
referensi untuk halaman dalam memori, menambahkan setiap halaman yang bit referensinya
masih diatur ke 0 ke daftar gratis dan menulis ke disk isinya jika dimodifikasi. Solaris
menyimpan daftar cache halaman yang telah "dibebaskan" tetapi belum ditimpa. Daftar gratis
berisi bingkai yang memiliki konten tidak valid. Halaman dapat diambil kembali dari daftar
cache jika diakses sebelum dipindahkan ke daftar gratis.
set ke nilai (total halaman fisik)/2 halaman per detik, dengan maksimum 8.192
halaman per detik. Ini ditunjukkan pada Gambar 9.29 (dengan fastscan diatur ke
maksimum).
Jarak (dalam halaman) antara jarum jam ditentukan oleh parameter sistem,
handspread. Jumlah waktu antara kliring tangan depan sedikit dan tangan
belakang menyelidiki nilainya tergantung pada scanrate dan handspread. Jika
scanrate adalah 100 halaman per detik dan handspread adalah 1.024 halaman,
10 detik dapat berlalu antara waktu bit yang diatur oleh tangan depan dan waktu
diperiksa oleh tangan belakang. Namun, karena tuntutan ditempatkan pada
sistem memori, scanrate beberapa ribu tidak jarang. Ini berarti bahwa jumlah
waktu antara kliring dan investigasi sedikit sering beberapa detik.
8192
pemindaian cepat
100
pemindaian lambat
9.11 Ringkasan
Diinginkan untuk dapat menjalankan proses yang ruang alamat logisnya lebih besar dari
ruang alamat fisik yang tersedia. Memori virtual adalah teknik yang memungkinkan kita
untuk memetakan ruang alamat logis yang besar ke memori fisik yang lebih kecil. Memori
virtual memungkinkan kita untuk menjalankan proses yang sangat besar dan untuk
meningkatkan derajat multiprogramming, meningkatkan pemanfaatan CPU . Lebih lanjut,
ini membebaskan pemrogram aplikasi dari kekhawatiran tentang ketersediaan memori.
Selain itu, dengan memori virtual, beberapa proses dapat berbagi perpustakaan dan
memori sistem. Dengan memori virtual, kita juga dapat menggunakan jenis pembuatan
proses yang efisien yang dikenal sebagai copy-on-write, di mana proses induk dan anak
berbagi halaman memori yang sebenarnya.
Memori virtual biasanya diimplementasikan oleh paging permintaan. Paging permintaan
murni tidak pernah membawa halaman sampai halaman itu direferensikan. Referensi
pertama menyebabkan kesalahan halaman pada sistem operasi. Kernel sistem operasi
berkonsultasi dengan tabel internal untuk menentukan di mana halaman berada di
penyimpanan cadangan. Kemudian menemukan bingkai gratis dan membaca halaman
dari backing store. Tabel halaman diperbarui untuk mencerminkan perubahan ini, dan
instruksi yang menyebabkan kesalahan halaman dimulai ulang. Pendekatan ini
memungkinkan suatu proses untuk berjalan meskipun seluruh citra memorinya tidak
berada di memori utama sekaligus. Selama tingkat kesalahan halaman cukup rendah, kinerja dapat diterim
Kita dapat menggunakan paging permintaan untuk mengurangi jumlah frame yang
dialokasikan untuk suatu proses. Pengaturan ini dapat meningkatkan derajat
multiprogramming (memungkinkan lebih banyak proses tersedia untuk dieksekusi pada
satu waktu) dan—dalam teori, setidaknya—penggunaan CPU dari sistem. Hal ini juga
memungkinkan proses untuk dijalankan meskipun kebutuhan memori mereka melebihi
total memori fisik yang tersedia. Proses tersebut berjalan di memori virtual.
Jika kebutuhan memori total melebihi kapasitas memori fisik, maka mungkin perlu
untuk mengganti halaman dari memori ke bingkai bebas untuk halaman baru. Berbagai
algoritma penggantian halaman digunakan. Penggantian halaman FIFO mudah diprogram
tetapi mengalami anomali Belady. Penggantian halaman yang optimal membutuhkan
pengetahuan di masa mendatang. Penggantian LRU adalah perkiraan penggantian
halaman yang optimal, tetapi bahkan mungkin sulit untuk diterapkan.
Sebagian besar algoritme penggantian halaman, seperti algoritme peluang kedua, adalah
perkiraan penggantian LRU .
Selain algoritme penggantian halaman, diperlukan kebijakan alokasi bingkai. Alokasi
dapat diperbaiki, menyarankan penggantian halaman lokal, atau dinamis, menyarankan
penggantian global. Model working-set mengasumsikan bahwa proses dijalankan di
lokalitas. Set kerja adalah set halaman di lokalitas saat ini. Dengan demikian, setiap proses
harus dialokasikan frame yang cukup untuk set kerjanya saat ini. Jika suatu proses tidak
memiliki cukup memori untuk working set-nya, proses tersebut akan thrash. Menyediakan
frame yang cukup untuk setiap proses untuk menghindari thrashing mungkin memerlukan
proses swapping dan penjadwalan.
Sebagian besar sistem operasi menyediakan fitur untuk file pemetaan memori,
sehingga memungkinkan file I/O diperlakukan sebagai akses memori rutin. Win32 API
mengimplementasikan memori bersama melalui pemetaan memori file.