Anda di halaman 1dari 4

Machine Translated by Google

436 Bab 9 Memori Virtual


mengambil byte data dan kemudian menghapus bit dalam register kontrol untuk
memberi sinyal bahwa siap untuk byte berikutnya. Kemudian CPU dapat mentransfer
byte berikutnya. Jika CPU menggunakan polling untuk melihat bit kontrol, terus
mengulang untuk melihat apakah perangkat siap, metode operasi ini disebut I/O terprogram (PIO).
Jika CPU tidak melakukan polling pada bit kontrol, tetapi menerima interupsi ketika
perangkat siap untuk byte berikutnya, transfer data dikatakan sebagai interrupt driven.

9.8 Mengalokasikan Memori Kernel


Ketika proses yang berjalan dalam mode pengguna meminta memori tambahan,
halaman dialokasikan dari daftar bingkai halaman gratis yang dikelola oleh kernel.
Daftar ini biasanya diisi menggunakan algoritme penggantian halaman seperti yang
dibahas di Bagian 9.4 dan kemungkinan besar berisi halaman gratis yang tersebar di
seluruh memori fisik, seperti yang dijelaskan sebelumnya. Ingat juga, bahwa jika proses
pengguna meminta satu byte memori, fragmentasi internal akan terjadi, karena proses
akan diberikan seluruh bingkai halaman.
Memori kernel sering dialokasikan dari kumpulan memori bebas yang berbeda
dari daftar yang digunakan untuk memenuhi proses mode pengguna biasa. Ada dua
alasan utama untuk ini:

1. Kernel meminta memori untuk struktur data dengan berbagai ukuran, beberapa di
antaranya berukuran kurang dari satu halaman. Akibatnya, kernel harus
menggunakan memori secara konservatif dan berusaha meminimalkan
pemborosan karena fragmentasi. Ini sangat penting karena banyak sistem
operasi tidak memasukkan kode kernel atau data ke sistem paging.
2. Halaman yang dialokasikan untuk proses mode pengguna tidak harus berada
dalam memori fisik yang berdekatan. Namun, perangkat keras tertentu
berinteraksi langsung dengan memori fisik—tanpa manfaat antarmuka memori
virtual—dan akibatnya mungkin memerlukan memori yang berada di halaman
yang berdekatan secara fisik.

Di bagian berikut, kami memeriksa dua strategi untuk mengelola memori bebas yang
ditetapkan ke proses kernel: "sistem teman" dan alokasi slab.

9.8.1 Sistem Sobat


Sistem sobat mengalokasikan memori dari segmen ukuran tetap yang terdiri dari
halaman yang berdekatan secara fisik. Memori dialokasikan dari segmen ini
menggunakan pengalokasi power-of-2, yang memenuhi permintaan dalam satuan
berukuran kekuatan 2 (4 KB, 8 KB, 16 KB, dan seterusnya). Permintaan dalam satuan
yang tidak berukuran tepat dibulatkan ke pangkat tertinggi berikutnya 2. Misalnya,
permintaan untuk 11 KB dipenuhi dengan segmen 16 KB.
Mari kita pertimbangkan contoh sederhana. Asumsikan ukuran segmen memori
awalnya 256 KB dan kernel meminta 21 KB memori. Segmen ini awalnya dibagi
menjadi dua sobat—yang akan kita sebut AL dan AR—masing-masing berukuran 128
KB . Salah satu teman ini dibagi lagi menjadi dua teman 64- KB— BL dan BR. Namun,
kekuatan tertinggi berikutnya dari 2 dari 21 KB adalah 32 KB sehingga BL atau BR
dibagi lagi menjadi dua teman 32-KB, CL dan CR. Salah satu dari ini
Machine Translated by Google

9.8 Mengalokasikan Memori Kernel 437

halaman yang berdekatan secara fisik

256 KB

128 KB 128 KB
AL AR

64 KB 64 KB
BL BR

32 KB 32 KB
CL CR

Gambar 9.26 Alokasi sistem Buddy.

buddies digunakan untuk memenuhi permintaan 21-KB . Skema ini diilustrasikan pada Gambar
9.26, di mana CL adalah segmen yang dialokasikan untuk permintaan 21-KB .
Keuntungan dari sistem sobat adalah seberapa cepat sobat yang berdekatan dapat
digabungkan untuk membentuk segmen yang lebih besar menggunakan teknik yang dikenal
sebagai penggabungan. Pada Gambar 9.26, misalnya, ketika kernel melepaskan unit CL yang
dialokasikan, sistem dapat menggabungkan CL dan CR menjadi segmen 64-KB. Segmen ini, BL,
pada gilirannya dapat digabungkan dengan BR temannya untuk membentuk segmen 128-KB.
Pada akhirnya, kita dapat berakhir dengan segmen 256-KB asli.
Kelemahan yang jelas dari sistem sobat adalah bahwa pembulatan ke kekuatan tertinggi
berikutnya dari 2 sangat mungkin menyebabkan fragmentasi dalam segmen yang dialokasikan.
Misalnya, permintaan 33 KB hanya dapat dipenuhi dengan segmen 64 KB . Faktanya, kami tidak
dapat menjamin bahwa kurang dari 50 persen unit yang dialokasikan akan terbuang sia-sia karena
fragmentasi internal. Pada bagian berikut, kami mengeksplorasi skema alokasi memori di mana
tidak ada ruang yang hilang karena fragmentasi.

9.8.2 Alokasi Slab


Strategi kedua untuk mengalokasikan memori kernel dikenal sebagai alokasi slab. Slab terdiri
dari satu atau lebih halaman yang berdekatan secara fisik . Cache terdiri dari satu atau lebih slab.
Ada satu cache untuk setiap struktur data kernel yang unik —misalnya, cache terpisah untuk
struktur data yang mewakili deskriptor proses, cache terpisah untuk objek file, cache terpisah
untuk semaphore, dan seterusnya. Setiap cache diisi dengan objek yang merupakan instantiasi
dari struktur data kernel yang diwakili cache. Misalnya, cache yang mewakili semaphore
menyimpan instance objek semaphore, cache yang mewakili deskriptor proses menyimpan
instance objek deskriptor proses, dan seterusnya.

Hubungan antara slab, cache, dan objek ditunjukkan pada Gambar 9.27. Gambar menunjukkan
dua objek kernel berukuran 3 KB dan tiga objek berukuran 7 KB , masing-masing disimpan dalam
cache terpisah.
Machine Translated by Google

438
Bab 9 Memori Virtual
objek kernel cache lempengan

3-KB
objek

halaman yang
berdekatan
secara fisik

Objek 7-KB

Gambar 9.27 Alokasi pelat.

Algoritma slab-allocation menggunakan cache untuk menyimpan objek kernel. Saat


cache dibuat, sejumlah objek—yang awalnya ditandai sebagai bebas—dialokasikan ke
cache. Jumlah objek dalam cache tergantung pada ukuran pelat terkait. Misalnya, slab 12-
KB (terdiri dari tiga halaman 4-KB yang berurutan ) dapat menyimpan enam objek 2-KB .
Awalnya, semua objek dalam cache ditandai sebagai bebas. Ketika objek baru untuk
struktur data kernel diperlukan, pengalokasi dapat menetapkan objek bebas apa pun dari
cache untuk memenuhi permintaan. Objek yang ditetapkan dari cache ditandai sebagai
digunakan.
Mari kita pertimbangkan skenario di mana kernel meminta memori dari pengalokasi
slab untuk objek yang mewakili deskriptor proses. Dalam sistem Linux, deskriptor proses
bertipe struct task struct, yang membutuhkan sekitar 1,7 KB memori. Ketika kernel Linux
membuat tugas baru, ia meminta memori yang diperlukan untuk objek struct tugas struct
dari cache-nya. Cache akan memenuhi permintaan menggunakan objek struct tugas struct
yang telah dialokasikan dalam slab dan ditandai sebagai bebas.

Di Linux, slab mungkin berada di salah satu dari tiga kemungkinan status:

1. Penuh. Semua objek di slab ditandai sebagai digunakan.

2. Kosong. Semua benda di slab ditandai sebagai bebas.

3. Sebagian. Slab terdiri dari benda bekas dan benda bebas.

Pengalokasi slab pertama-tama mencoba memenuhi permintaan dengan objek bebas di


slab parsial. Jika tidak ada, objek bebas ditetapkan dari pelat kosong. Jika tidak ada slab
kosong yang tersedia, slab baru dialokasikan dari halaman fisik yang berdekatan dan
ditetapkan ke cache; memori untuk objek dialokasikan dari slab ini.

Pengalokasi pelat memberikan dua manfaat utama:

1. Tidak ada memori yang terbuang karena fragmentasi. Fragmentasi tidak menjadi
masalah karena setiap struktur data kernel yang unik memiliki cache yang terkait,
dan setiap cache terdiri dari satu atau lebih slab yang dibagi menjadi
Machine Translated by Google

9.9 Pertimbangan Lain 439

potongan ukuran objek yang diwakili. Jadi, ketika kernel meminta memori untuk
suatu objek, pengalokasi slab mengembalikan jumlah memori yang tepat yang
diperlukan untuk mewakili objek.
2. Permintaan memori dapat dipenuhi dengan cepat. Skema alokasi slab dengan
demikian sangat efektif untuk mengelola memori ketika objek sering dialokasikan
dan tidak dialokasikan, seperti yang sering terjadi dengan permintaan dari kernel.
Tindakan mengalokasikan—dan melepaskan—memori bisa menjadi proses yang
memakan waktu. Namun, objek dibuat terlebih dahulu dan dengan demikian dapat
dengan cepat dialokasikan dari cache. Selanjutnya, ketika kernel telah selesai
dengan suatu objek dan melepaskannya, itu ditandai sebagai bebas dan
dikembalikan ke cache-nya, sehingga membuatnya segera tersedia untuk
permintaan berikutnya dari kernel.

Pengalokasi slab pertama kali muncul di kernel Solaris 2.4. Karena sifatnya untuk
tujuan umum, pengalokasi ini sekarang juga digunakan untuk permintaan memori mode
pengguna tertentu di Solaris. Linux awalnya menggunakan sistem sobat; namun, dimulai
dengan Versi 2.2, kernel Linux mengadopsi pengalokasi slab.
Distribusi Linux terbaru sekarang menyertakan dua pengalokasi memori kernel lainnya—
pengalokasi SLOB dan SLUB . (Linux mengacu pada implementasi slabnya sebagai SLAB.)

Pengalokasi SLOB dirancang untuk sistem dengan jumlah memori terbatas, seperti
sistem tertanam. SLOB (singkatan dari Simple List of Blocks) bekerja dengan
mempertahankan tiga daftar objek: kecil (untuk objek kurang dari 256 byte), sedang
(untuk objek kurang dari 1.024 byte), dan besar (untuk objek kurang dari 1.024 byte).
Permintaan memori dialokasikan dari objek pada daftar berukuran tepat menggunakan
kebijakan first-fit.
Dimulai dengan Versi 2.6.24, pengalokasi SLUB menggantikan SLAB sebagai
pengalokasi default untuk kernel Linux. SLUB mengatasi masalah kinerja dengan alokasi
slab dengan mengurangi banyak overhead yang dibutuhkan oleh pengalokasi SLAB .
Satu perubahan adalah memindahkan metadata yang disimpan dengan setiap slab di
bawah alokasi SLAB ke struktur halaman yang digunakan kernel Linux untuk setiap
halaman. Selain itu, SLUB menghapus antrean per-CPU yang dipertahankan oleh
pengalokasi SLAB untuk objek di setiap cache. Untuk sistem dengan sejumlah besar
prosesor, jumlah memori yang dialokasikan untuk antrian ini tidak signifikan. Dengan
demikian, SLUB memberikan kinerja yang lebih baik karena jumlah prosesor pada suatu
sistem meningkat.

9.9 Pertimbangan Lain

Keputusan utama yang kita buat untuk sistem paging adalah pemilihan algoritme
pengganti dan kebijakan alokasi, yang telah kita bahas sebelumnya dalam bab ini. Ada
banyak pertimbangan lain juga, dan kami membahas beberapa di antaranya di sini.

9.9.1 Persiapan awal

Properti yang jelas dari paging permintaan murni adalah sejumlah besar kesalahan
halaman yang terjadi saat proses dimulai. Situasi ini hasil dari mencoba untuk
mendapatkan lokalitas awal ke dalam memori. Situasi yang sama mungkin muncul di lain waktu. Untu

Anda mungkin juga menyukai