Konsep Memori
Konsep Memori Pada Linux - Alokasi memori pada Linux menggunakan
dua buah alokasi yang utama, yaitu algoritma buddy dan slab. Untuk
algoritma buddy, setiap routine pelaksanaan alokasi ini dipanggil, maka
blok memori berikutnya akan diperiksa. Jika ditemukan dia dialokasikan,
namun jika tidak maka daftar tingkat berikutnya akan diperiksa. Jika ada
blok bebas, maka akan dibagi jadi dua, yang satu dialokasikan dan yang
lain dipindahkan ke daftar yang dibawahnya. Sedangkan algoritma slab
menggunakanslab yang dibentuk dari halaman-halaman memori fisik yang
berdekatan dan digunakan terutama untuk kegiatan pengalokasian memori
fisik.
Linux juga menggunakan variasi dari algoritma clock. Thread dari kernel
Linux akan dijalankan secara periodik. Jika jumlah halaman yang bebas
lebih sedikit dari batas atas halaman bebas, maka thread tersebut akan
berusaha untuk membebaskan tiga halaman. Jika lebih sedikit dari batas
bawah halaman bebas, threadtersebut akan berusaha untuk membebaskan enam
halaman dan tidur untuk beberapa saat sebelum berjalan lagi.
Memori Fisik
Manajemen memori pada Linux mengandung dua komponen utama yang berkaitan dengan:
- Pembebasan dan pengalokasian halaman/blok pada main memori.
- Penanganan memori virtual.
Berdasarkan arsitektur Intel x86, Linux memisahkan memori fisik ke dalam
tiga zona berbeda, dimana tiap zona mengindentifikasikan blok (region)
yang berbeda pada memori fisik. Ketiga zona tersebut adalah:
- Zona DMA (Direct Memory Access). Tempat penanganan kegiatan yang berhubungan dengan transfer data antara CPU dengan M/K, dalam hal ini DMA akan menggantikan peran CPU sehingga CPU dapat mengerjakan instruksi lainnya.
- Zona NORMAL. Tempat di memori fisik dimana penanganan permintaan-permintaan yang berhubungan dengan pemanggilan routine untuk alokasi halaman/blok dalam menjalankan proses.
- Zona HIGHMEM. Tempat yang merujuk kepada memori fisik yang tidak dipetakan ke dalam ruang alamat kernel.
Memori manager di Linux berusaha untuk mengefisienkan ruang alamat pada
memori fisik, agar memungkinkan lebih banyak proses yang dapat bekerja
di memori dibandingkan dengan yang sudah ditentukan oleh kernel. Oleh
karena itu, digunakanlah dua macam teknik alokasi, yaitu alokasi halaman
yang ditangani oleh page allocator dan alokasi slab yang ditangani oleh
slab allocator.
Alokasi halaman menggunakan algoritma buddy yang bekerja sebagai
berikut. Pada saat kegiatan alokasi data di memori, blok di memori yang
disediakan oleh kernel kepada suatu proses akan dibagi menjadi dua blok
yang berukuran sama besar. Kejadian ini akan terus berlanjut hingga
didapat blok yang sesuai dengan ukuran data yang diperlukan oleh proses
tersebut. Dalam hal ini page allocator akan memanggil system call
kmalloc() yang kemudian akan memerintahkan kernel untuk melakukan
kegiatan pembagian blok tersebut
Contoh Alokasi Memori dengan Algoritma Buddy
Slab
Alokasi
slab bertujuan untuk mengalokasikan struktur data (obyek) kernel yang
dibutuhkan di memori fisik untuk menjalankan proses tertentu. Alokasi
slabmenggunakan algoritma slab. Slab dibentuk dari halaman-halaman
memori fisik yang berdekatan serta digunakan terutama untuk kegiatan
pengalokasian memori fisik. Sebuah cache pada disk terdiri dari satu
atau lebih slab, dan diisi oleh beberapa obyek. Obyek merupakan bentuk
instansiasi dari struktur data kernel yang direpresentasikan oleh cache
yang bersangkutan.
Ketika sebuah cache dibentuk, maka semua obyek di dalam cache tersebut
berstatus free, dan ketika terjadi sebuah permintaan dari suatu proses,
maka obyek-obyek yang dibutuhkan untuk memenuhi permintaan tersebut akan
diset berstatus used. Kemudian obyek-obyek yang berstatus used tersebut
yang telah dikelompokkan ke dalam slab-slab akan dipetakan dari cache
ke dalam memori fisik.
Sebuah slab dapat berstatus:
- Full. Semua obyek di dalam slab tersebut adalah used.
- Empty. Semua obyek di dalam slab tersebut adalah free.
- Partial. Ada obyek yang used dan ada pula yang free.
Keuntungan algoritma slab:
Tidak terdapatnya fragmentasi pada memori fisik, karena ukuran
obyek-obyek tersebut telah ditetapkan sesuai dengan yang dibutuhkan
proses dalam membantu melakukan kerjanya di memori fisik.
Permintaan oleh memori cepat terpenuhi dengan mendayagunakan kerja dari cache yang dibentuk pada disk.
Memori Virtual
Manajemen memori melakukan tugas penting dan kompleks berkaitan dengan:
- Memori utama sebagai sumber daya yang harus dialokasikan dan dipakai bersama diantara sejumlah proses yang aktif. Agar dapat memanfaatkan prosesor dan fasilitas M/K secara efisien, maka diinginkan memori yang dapat menampung sebanyak mungkin proses.
- Upaya agar programmer atau proses tidak dibatasi kapasitas memori fisik di sistem komputer.
Linux memanfaatkan memori virtual untuk mendukung kinerja sistem.
Sebagai sistem operasi multiprogramming, memori virtual dapat
meningkatkan efisiensi sistem. Sementara proses menunggu bagiannya di-
swap in ke memori, menunggu selesainya operasi M/K dan proses di-block,
jatah waktu prosesor dapat diberikan ke proses-proses lain.
Sistem memori virtual Linux berperan dalam mengatur beberapa hal:
- Mengatur ruang alamat supaya dapat dilihat oleh tiap proses.
- Membentuk halaman-halaman yang dibutuhkan.
- Mengatur lokasi halaman-halaman tersebut dari disk ke memori fisik atau sebaliknya, yang biasa disebut swapping.
Sistem memori virtual Linux juga mengatur dua view berkaitan dengan ruang alamat:
- Logical View. Mendeskripsikan instruksi-instruksi yang diterima oleh sistem memori virtual mengenai susunan ruang alamat.
- Physical View. Berupa entri-entri tabel halaman, dimana entri-entrinya akan menentukan apakah halaman itu berada di memori fisik yang sedang dipakai untuk proses atau masih berada di disk yang berarti belum dipakai.
Blok Memori Virtual
Berkaitan dengan blok memori virtual, maka memori virtual dalam Linux memiliki karakteristik:
- Backing Store untuk blok. Backing store mendeskripsikan tempat asal halaman pada disk. Kebanyakan blok dalam memori virtual berasal dari suatu berkas pada disk atau kosong (nothing). Blok dengan backing store yang kosong biasa disebut "demand zero memory" yang merupakan tipe paling sederhana dari memori virtual.
- Reaksi blok dalam melakukan write. Pemetaan dari suatu blok ke dalam ruang alamat proses dapat bersifat private atau shared. Jika ada proses yang akan menulis blok yang bersifat private, maka akan dilakukan mekanisme Copy-On-Write atau dengan menulis salinannya.
Umur Memori Virtual
Kernel berperan penting dalam manajemen memori virtual, dimana kernel
akan membentuk ruang alamat yang baru di memori virtual dalam dua
kondisi:
- Proses menjalankan suatu program dengan system call exec(). Ketika system call exec() dipanggil oleh proses untuk menjalankan suatu program, maka proses akan diberikan ruang alamat virtual yang masih kosong. Kemudian routine-routine akan bekerja me-load program dan mengisi ruang alamat ini.
- Pembentukan proses baru dengan system call fork(). Intinya menyalin secara keseluruhan ruang alamat virtual dari proses yang ada. Langkah-langkahnya adalah sebagai berikut:
- kernel menyalin descriptor vm_area_struct dari proses induk
- kernel membentuk tabel halaman untuk proses anak,
- kernel menyalin isi tabel halaman proses induk ke proses anak,
- setelah fork(), maka induk dan anak akan berbagi halaman fisik yang sama.
Di samping itu, ada kasus khusus yang harus diperhatikan, yaitu ketika
proses penyalinan dilakukan terhadap blok di memori virtual yang
bersifat private, dimana blok tersebut dipakai lebih dari satu proses
selain proses induk dan anak yang memang berbagi halaman yang sama dan
ada proses yang hendak menulis blok tersebut. Jika ini terjadi maka akan
dilakukan mekanisme Copy-On-Write, yang berarti mengubah dan memakai
salinannya.
Swap
Keterbatasan memori fisik mengharuskan Linux mengatur halaman-halaman
mana saja yang harus diletakkan di dalam memori fisik atau swap-in dan
juga halaman-halaman yang harus dikeluarkan dari memori fisik atau
swap-out. Paging system dari memori virtual dapat dibagi menjadi dua:
- The pageout-policy algorithm . Menentukan halaman-halaman mana saja yang di swap-out dari memori fisik. Pageout-policy algorithm menggunakan algoritma clock dalam menentukan halaman mana yang harus di swap-out. Dalam Linux, multipass clock digunakan, setiap satu kali pass dari clock, age dari suatu halaman akan disesuaikan. Makin sering suatu halaman di akses, makin tinggi age-nya, tapi age dari suatu halaman berkurang setiap satu kali pass.
- The paging mechanism. Menentukan halaman-halaman mana saja yang harus dibawa kembali ke dalam memori. Halaman-halaman ini pernah berada dalam memori sebelumnya.
Berikut adalah ilustrasi untuk algoritma clock. Di dalam memori virtual
terdapat page 1, 2 dan 3 dengan pointer last-used di page 3. Flag use
akan bernilai 1 jikapage tersebut digunakan, sedangkan use akan bernilai
0 jika page tersebut dilewati pointer namun tidak digunakan.
Ketika ada permintaan page 4, sedangkan tidak ada page 4 dalam memori
virtual sehingga terjadi page fault, maka page 4 akan dimasukkan ke
tempat yang masih kosong, pointer akan menunjuk ke page 4, dan use
diubah menjadi 1. Saat datang permintaan page 3, pointer akan mencari
page tersebut, sekaligus mengubahflag use menjadi 0 jika page tersebut
hanya dilewati, tetapi tidak digunakan.
Ketika ada permintaan untuk page 9, maka terjadi page fault karena page 9
tidak ada dalam memori virtual. Kemudian pointer akan mencari page yang
nilai use-nya = 0, yaitu page 2. Hal yang serupa terulang ketika ada
permintaan untuk page 5. Sehingga page 4 di swapped-out, dan nilai use
dari page 3 diubah menjadi 0.
Pemetaan Memori Program
Pada Linux, binary loader tidak perlu me-load berkas biner ke memori
fisik, melainkan dengan cara memetakan halaman dari binary file ke
region dari memori virtual. Sehingga hanya ketika program mengakses
halaman tertentu akan menyebabkan page fault yang mengakibatkan halaman
yang dibutuhkan di-load ke memori fisik.
Dalam pemetaan program ke memori juga terjadi proses load dan eksekusi.
Eksekusi dari kernel Linux dilakukan oleh panggilan terhadap system call
exec().System call exec() memerintahkan kernel untuk menjalankan
program baru di dalam proses yang sedang berlangsung atau current
process, dengan cara meng-overwrite current execution dengan initial
context dari program baru yang akan dijalankan. Untuk meng-overwrite dan
mengeksekusi, akan dilakukan dua kegiatan, yakni:
Memeriksa apakah proses baru yang dipanggil memiliki izin untuk
melakukan overwrite terhadap berkas yang sedang dieksekusi. Kernel
memanggil loader routine untuk memulai menjalankan program. Loader tidak
perlu untuk me-load isi dari berkas program ke memori fisik, tetapi
paling tidak mengatur pemetaan program ke memori virtual.
Executable and Linking Format
Linux menggunakan tabel loader untuk loading program baru. Dengan
menggunakan tabel tersebut, Linux memberikan kesempatan bagi setiap
fungsi untuk me-loadprogram ketika system call exec() dipanggil. Linux
menggunakan tabel loader, karena format standar berkas binary Linux
telah berubah antara kernel Linux 1.0 dan 1.2. Format Linux versi 1.0
menggunakan format a.out, sementara Linux baru (sejak 1.2) menggunakan
format ELF. Format ELF memiliki fleksibilitas dan ekstensibilitas
dibanding dengan a.out karena dapat menambahkan sections baru ke binary
ELF, contohnya dengan menambahkan informasi debugging, tanpa menyebabkan
loader routine menjadi bingung. Saat ini Linux mendukung pemakaian baik
format binary ELF dan a.out pada single running system karena
menggunakan registrasi dari multiple loader routine.
Link Statis dan Dinamis
Ketika program di-load dan sudah mulai dieksekusi, semua berkas biner
yang dibutuhkan telah di-load ke ruang alamat virtual. Meski pun
demikian, sebagian besar program juga butuh menjalankan fungsi yang
terdapat di sistem pustaka seperti algoritma sorting, fungsi-fungsi
aritmatika, dan lain-lain. Untuk itulah fungsi pustaka perlu untuk
di-load juga. Untuk mendapatkan fungsi-fungsi yang terdapat di sistem
pustaka, ada dua cara, yaitu:
- Link Statis. Aplikasi dikatakan dikompilasi statis apabila pustaka-pustaka yang dibutuhkan dikompilasi ke dalam binary apllication. Dengan demikian, aplikasi tidak lagi membutuhkan pustaka tambahan. Fungsi pustaka yang dibutuhkan diload langsung ke berkas biner yang dapat dijalankan (executable) program. Kerugian link statis adalah setiap program yang dibuat harus menggandakan fungsi-fungsi dari sistem pustaka, sehingga tidak efisien dalam penggunaan memori fisik dan pemakaian ruang disk.
- Link Dinamis. Pada dasarnya link dinamis merupakan suatu metode penghubungan antara program dengan suatu sistem pustaka secara dinamis dengan cara menghubungkan routine-routine yang ada ke dalam sistem pustaka. Hal ini sangat berguna pada program yang membutuhkan suatu pustaka. Bayangkan saja jika di dalam suatu sistem operasi tidak mempunyai metode penghubungan seperti ini. Setiap sistem program harus mempunyai salinan dari pustakanya agar program tersebut dapat berjalan dengan baik. Hal ini tentu saja akan membuang disk space dan memori utama untuk hal yang kurang perlu.
sumber: http://pelajaranilmukedokteran.blogspot.com/
Tidak ada komentar:
Posting Komentar