9. Manajemen Memori Utama
Materi Background Swapping Contiguous Memory Allocation Segmentation Paging Structure of the Page Table Example: The Intel 32 and 64-bit Architectures Example: ARM Architecture
Latar Belakang
• Sebelum masuk ke memori, suatu proses harus menunggu dalam antrian Manajemen Memori • Memori adalah salah satu pusat kegiatan pada sebuah komputer, karena setiap proses yang eksekusi, harus berada memori terlebih dahulu. • Sistem Operasi bertugas untuk mengatur penggunaan memori untuk banyak proses – Memori harus digunakan dengan baik, sehingga dapat memuat banyak proses dalam suatu waktu • Sebelum masuk ke memori, suatu proses harus menunggu dalam antrian • Antrian ini disebut Input Queue (Long term)
Tujuan Manajemen Memory Meningkatkan utilitas CPU : • Data dan instruksi dapat diakses lebih cepat oleh CPU • penting… Memori kapasitasnya terbatas, jadi harus efisien
Istilah dalam Manajemen Memori : • Main memory dan registers adalah satu-satunya storage yang dapat diakses secara langsung oleh CPU • Registers mengakses dalam satu CPU clock (atau kurang) Pengaksesan Main memory lama dari register • Cache berada diantara main memory dan CPU registers • Protection: diperlukan untuk menjamin operasi-operasi memory sesuai dan tepat • Relokasi: mengkonversi alamat logika program ke alamat fisik memori • Sharing: bagian dari memori logika dapat dipakai bersama-sama
Latar Belakang : Komponen Program Sebuah program terdiri dari beberapa komponen Variable data structure array, list, stack Fungsi Instruksi int total=0; int main(){ int ctr=1; int[] data; total = total + ctr; printf("Hasil"); }
Latar Belakang : Komponen Program Sebuah program terdiri dari beberapa komponen Variable data structure array, list, stack Fungsi Instruksi int total=0; int main(){ int ctr=1; int[] data; total = total + ctr; printf("Hasil"); }
Latar Belakang : Eksekusi Program Q : Apa yang harus dilakukan agar sebuah program dapat dieksekusi oleh CPU? A : Program harus dipindah dari disk ke memory sebelum dieksekusi Program menunggu di input queue sebelum dibawa ke memory Bagaimana detail langkahnya? int total=0; int main(){ int ctr=1; int[] data; total = total + ctr; printf("Hasil"); } OS Proses Free Memory Object Module Load Module 1000 Compiler Linkage Editor Loader 1100 Proses dialokasikan pada memory space tertentu e.x.1000-1100
Latar Belakang : Eksekusi Program (2) Ketika suatu proses mengambil/mengganti nilai suatu variabel, pada dasarnya dia mengakses alamat memori variabel tersebut OS Proses Free Memory int total=0; int main(){ int ctr=1; int[] data; total = total + ctr; printf("Hasil"); } 1000 1010 1100
Pertanyaan Mengapa program harus dibawa ke memory sebelum bisa dieksekusi CPU? Karena CPU hanya bisa mengakses langsung main memory dan register Akses langsung ke disk terlalu lama Register bisa diakses dalam satu cycle Memory butuh beberapa cycle sehingga butuh cache.
Masalah Bagaimana OS mengalokasikan memory untuk beberapa proses? Ada berapa jenis alamat data/instruksi pada sebuah proses? Bagaimana OS menentukan data/instruksi pada sebuah proses? Bagaimana jika alokasi memori tidak mencukupi?
Ilustrasi Penempatan Proses di Memory Setiap proses memiliki memory space terpisah Why? Proteksi dari proses lain How? Setiap proses dibatasi alamat Representasi alamat sebuah proses di memori base : alamat awal limit : jangkauan alamat
Bagaimana proteksi dilakukan? Process yang dieksekusi CPU meminta akses ke memory pada alamat tertentu Cek alamat tersebut Ijinkan jika alamat yang diakses adalah alamat proses tersebut Jika alamat >= base DAN alamat < base+limit
Address Binding • Adalah pemetaan alamat suatu variabel program ke alamat memory tertentu, yg dapat terjadi pada saat: – Compile Time: pada saat program di-compile, menggunakan absolute code. Biasanya terjadi pada pemrosesan bahasa assembly (.asm) – Load Time: pada saat program dipanggil / load, menggunakan relocatable code. Variable2 nya berada pada suatu stack yg sudah dipesan sebelumnya dengan pasti (statis) Menghasilkan object code - .obj – Execution Time: pada saat program dijalankan. • Binding akan ditunda sampai run time. Kode dapat dipindah antar segment dan page pada memory.
Pengikatan Alamat (Address Binding) Alamat dapat direpresentasikan dengan cara berbeda pada setiap fase program Source code addresses memakai alamat symbolic Contoh : int sum=0; Pada code yang sudah dicompile alamat symbolic diikat (binding) ke relocatable address Contoh : “14 bytes dari awal fungsi main()” Linker atau loader mengikat relocatable address ke absolute address Contoh : 74014 Setiap pengikatan (binding) memetakan dari satu jenis alamat ke jenis alamat lain
Address Binding Data dan Instruksi ke Memory Pengikatan data dan instruksi dapat dilakukan pada beberapa fase/waktu : Fase Kompilasi (Compile time) Jika lokasi memori diketahui sebelumnya, absolut address dapat di-generate; Harus kompilasi ulang kode tsb jika terjadi perubahan lokasi awal. Fase Load (Load time) Jika lokasi memori tidak diketahui saat fase kompilasi, maka compiler men-generate relocatable address Fase Eksekusi (Execution time) Pengikatan alamat ditunda sampai waktu runtime jika proses dapat dipindah selama eksekusi program dari satu segmen memori ke segmen memori lain. Perlu dukungan hardware untuk pemetaan alamat (contoh : register base dan limit).
Logical vs Physical Address Space Terdapat dua jenis alamat memori Logical address : alamat yang di-generate oleh CPU. Relatif untuk satu proses/program. Physical address : alamat fisik dilihat dari sudut pandang main memory. Absolut untuk semua proses/program. Logical address = Physical address JIKA address binding dilakukan pada fase kompilasi dan load. Why? Karena physical address sudah ditentukan sebelum terjadi eksekusi Logical address space : kumpulan logical addresses yang di-generate untuk sebuah program Physical address space : kumpulan physical addresses yang di-generate untuk sebuah program Q : Bagaimana jika logical address != physical address?
Memory-Management Unit (MMU) Logical address perlu dipetakan ke physical address Untuk melakukan pemetaan pada saat run-time, butuh hardware memory-management unit (MMU) Terdapat berbagai metode pemetaan alamat memori Metode paling sederhana menggunakan relocation register Metode lain dibahas pada bagian selanjutnya
Dynamic Relocation dengan Relocation Register Metode sederhana pemetaan alamat memori Physical address = logical address + relocation register Contoh : Sebuah program membuat pointer ke logical address 346 Butuh physical address agar pointer tersebut dapat disimpan di memory MMU memetakan logical address 346 ke physical address 14000+346 = 14346 Apa kelemahannya??
Dynamic Loading int total=0; int hitung(int a, int b){ return a+b; } Sebuah routine/fungsi akan di-load ke memory hanya jika dipanggil Awalnya, hanya main routine yang diload ke memory Routing lain disimpan di disk Contoh: Load routine main() ke memory Routing hitung() masih di disk Program memanggil fungsi hitung() Routing hitung() di load ke memory Keuntungan : Hemat memory, hanya load routine yang dibutuhkan saja int total=0; int hitung(int a, int b){ return a+b; } int main(){ printf("Program Hitung"); int hasil = hitung(5,10); printf("Hasil");
Dynamic Linking Kode program biasanya mengakses system library Contoh : printf(),scanf(),System.out.println() Bagaimana agar system library bisa dieksekusi? Dua solusi : static dan dynamic linking Static linking : pada saat compile, system library disisipkan ke file executable Ukuran file exe jadi besar Dynamic linking : system library dihubungkan (linking) saat eksekusi int total=0; int hitung(int a, int b){ return a+b; } int main(){ printf("Program Hitung"); int hasil = hitung(5,10); printf("Hasil");
Swapping
Masalah Bagaimana jika alokasi main memory tidak mencukupi? Padahal setiap program yang akan dieksekusi harus di-load ke memory.
Swapping Sebuah porses dapat ditukar sementara keluar dari memori ke backing store, dan kemudian dibawa kembali ke memori untuk melanjutkan eksekusi. Backing store : disk, ukuran cukup besar,kecepatan akses cepat Roll out, roll in – swapping menggunakan algoritma priotity based scheduling Proses dengan prioritas rendah ditukar sehingga proses dengan prioritas tinggi dapat diload dan dieksekusi. Bagian terbesar dari waktu swap adalah waktu transfer; Total waktu transfer berbanding lurus dengan jumlah memori yang diswap Contoh : swap di Windows dan Linux
Skema Swapping
Melihat Penggunaan Swap
Metode Alokasi Memori
Memori adalah sumber daya terbatas Latar Belakang Memori adalah sumber daya terbatas Memori harus dialokasikan untuk dua komponen : sistem operasi dan proses user Masalah Bagaimana mengalokasikan sumber daya memori yang terbatas itu? Metode Alokasi Memori : cara yang dipakai oleh sistem operasi untuk mengalokasikan memori bagi process-process yang berjalan Contiguous Memory Allocation Segmentation Paging
Contoh Kasus Sistem Operasi Free Memory 100M Proses Kebutuhan Memori Waktu Masuk P1 25M P2 20M 1 P3 15M 2 P4 40M 3 P5 4
Contiguous Memory Allocation (Alokasi Memori Berurutan)
Contiguous Allocation / Alokasi Berurutan Memori dibagi menjadi satu/beberapa partisi Satu partisi hanya dialokasikan untuk satu proses Berdasarkan jumlah partisinya, metode ini dibagi menjadi dua : Single partition Multiple partition
Single Partition Contiguous Allocation (2) Memori dibagi menjadi SATU partisi/bagian Hanya ada satu proses yang dapat diload ke memory sekali waktu Tidak ada konsep concurrency atau parralellism Masalah Bagaimana caranya agar beberapa proses bisa diload secara bersamaan?
Multiple Partition Contiguous Allocation (2) Memori dibagi menjadi beberapa partisi/bagian Setiap partisi dialokasikan untuk satu proses Jumlah proses yang dapat berjalan secara concurrent = jumlah partisi Ada dua cara pembagian partisi berdasarkan cara penentuan ukuran partisi Fixed-size partition Variable-size partition
Contiguous Allocation dengan fixed-size Pada fixed-size, ukuran tiap partisi bersifat statis dan tidak dapat diubah sepanjang sistem operasi berjalan Pada memori terdapat hole/partisi bebas hole : blok dari memori yang tidak terpakai ukuran hole statis Mekanisme Jika proses datang, akan dialokasikan ke memory pada hole yang cukup untuk proses tersebut. Sisa alokasi pada suatu hole tidak dapat dipakai proses lain Jika proses selesai, alokasinya jadi hole
Contoh Kasus OS Hole1 (25M) Hole2 (30M) Hole3 Hole4 (20M) OS P1 (25M) Proses Memori P1 25M P2 20M P3 P4 sisa 10M
Contiguous Allocation dengan variable-size Pada variable-size, ukuran tiap partisi disesuaikan dengan kebutuhan memori tiap proses Pada memori terdapat hole/partisi bebas hole : blok dari memori yang tidak terpakai Mekanisme Jika proses datang, akan dialokasikan ke memory pada hole yang cukup untuk proses tersebut. Jika proses selesai, alokasinya jadi hole Dua hole yang bertetangga dapat bergabung
Contoh Kasus Sistem Operasi Hole 100M Proses Kebutuhan Memori Waktu Masuk Waktu Exec P1 25M 5 P2 20M 1 3 P3 15M 2 P4 40M 7 P5 4 6
Contoh (2) OS P1(25M) Hole(75M) OS P1(25M) P2(20M) Hole(55M) OS 1 2 3 4 5
Dynamic Storage-Allocation Problem Ada beberapa metode untuk memasukkan n proses baru ke hole yang tersedia : First-Fit Alokasi lubang pertama yang cukup untuk proses. Best-Fit Alokasi lubang terkecil yang cukup untuk proses. Harus mencari ke seluruh daftar berdasarkan urutan ukuran. Menghasilkan lubang sisa yang terkecil Worst-Fit Alokasi ke lubang terbesar
P6 masuk dengan kebutuhan memori 10M Contoh OS Hole(25M) P5(15M) Hole (15M) P4(40M) Hole(30M) P6 masuk dengan kebutuhan memori 10M Di hole mana P6 akan dialokasikan? First-fit : Hole1 Best-fit : Hole2 Worst-fit : Hole3
Masalah 1 : Fragmentasi Eskternal Misal P6 masuk dengan kebutuhan memori 40M Total hole tersedia = Hole1 + Hole2 + Hole3 = 70M Q : Bisakah P6 bisa dialokasikan? A : Tidak. Why? Ada fragmentasi eksternal : total memori tersedia cukup, tapi mereka tidak berurutan (contagious) OS Hole(25M) P5(15M) Hole (15M) P4(40M) Hole(30M)
Masalah 2 : Fragmentasi Internal Misal P6 masuk dengan kebutuhan memori 29M P6 bisa dialokasikan di Hole3 Tapi, terjadi fragmentasi internal Jumlah alokasi cukup, tapi sisa sedikit sekali hole untuk bisa dipakai proses lain. OS Hole(25M) P5(15M) Hole (15M) P4(40M) Hole(30M)
Solusi Fragmentasi Eksternal Fragmentasi eksternal dapat diatasi dengan compaction Geser dan pindah lokasi memori dari setiap proses Hanya memungkinkan jika pengalamatan memori dilakukan pada saat eksekusi OS Hole(25M) Hole (15M) Hole(30M) P5(15M) P4(40M)
Proteksi Memori Alokasi memori untuk satu proses perlu diproteksi agar tidak diakses proses lain Bagaimana caranya? Gunakan dua register : relocation register dan limit register Process yang dieksekusi CPU meminta akses ke memory pada alamat tertentu Jika alamat yang diminta < limit, ijinkan Untuk mengakses, logical address + relocation register untuk mendapatkan physical address.
Segmentation
Segmentation int total=0; int hasil=0; int hitung(int a, int b){ Program dibagi menjadi beberapa segmen/komponen Fungsi main Sub-fungsi Variabel global Standard Lib. Segment heap Stack thread Tiap segment diberi nomor segmen s Tiap segment kemudian dialokasikan ke memory Tiap segment dari satu process TIDAK HARUS dialokasikan berurutan 3 int total=0; int hasil=0; int hitung(int a, int b){ return a+b; } int main(){ hasil = hitung(total,10); printf("Hasil %d", hasil); 2 1 4
Contoh Alokasi int total=0; int hasil=0; int hitung(int a, int b){ OS Segment 1 Segment 2 Segment 3 Segment 4 3 int total=0; int hasil=0; int hitung(int a, int b){ return a+b; } int main(){ hasil = hitung(total,10); printf("Hasil %d", hasil); 100 130 2 150 170 1 200 4 240 250
Pemetaan Logical Address ke Physical Address (1) Physical memory space tiap segment dibatasi oleh dua register : base dan limit Logical address data/instruksi dalam suatu segment berbentuk: <nomor segment, offset> offset : nomor index data/instruksi di suatu segment, nilai offset antara 0 - limit Pemetaan dilakukan oleh segmentation hardware (MMU) MMU menyimpan segmentation table yang berisi limit dan base dari setiap segment di physical memory Nomor segment dijadikan index dari table
Bagaimana cara kerjanya? Process yang dieksekusi CPU akan mengakses data/instruksi pada segment s dan offset d MMU melihat nilai limit dan base dari segment s pada segment table MMU mengecek apakah offset d berada jangkauan limit Cek apakah d < limit? Jika YA, maka physical address = offset d + base
Contoh Program mengakses variable hasil dengan logical address 3 int total=0; int hasil=0; int hitung(int a, int b){ return a+b; } int main(){ hasil = hitung(total,10); printf("Hasil %d", hasil); OS Segment 1 Segment 2 Segment 3 Segment 4 Program mengakses variable hasil dengan logical address <3, 20> Untuk segment 3, base=200, limit=40 Cek apakah offset<limit 20 < 40? Ya Physical address variable hasil = (base segment 3)+offset Physical address = 200+20 = 220 100 2 130 1 150 4 170 200 Segment Base Limit 1 100 30 2 150 20 3 200 40 4 240 10 240 250 Physical Memory Segment Table
Paging
Paging Physical memory dibagi menjadi beberapa frame dengan ukuran sama Logical memory dibagi menjadi beberapa block dengan ukuran sama yang disebut pages How? Backing store (disk) dibagi menjadi beberapa block dengan ukuran sama Dengan cara ini, satu page bisa menempati satu frame di memori
Contoh Alokasi Misal, ukuran page = frame = 4 bytes Kapasitas physical memory = 32 bytes 4 8 12 16 20 24 28 32
Pemetaan Logical Address ke Physical Address (1) Logical address data/instruksi dalam suatu page berbentuk: <nomor page, offset> offset : nomor index data/instruksi di suatu page, nilai offset antara 0 – ukuran page Pemetaan dilakukan oleh paging hardware (MMU) MMU menyimpan page table yang berisi base address atau frame number dari setiap page di physical memory Nomor page dijadikan index dari table
Bagaimana cara kerjanya? Process yang dieksekusi CPU akan mengakses data/instruksi pada page p dan offset d MMU melihat nilai base dari page p pada segment table physical address = offset d + base
Contoh Misal “C” punya logical address <0,2> page Base 4 1 16 2 12 Logical Addr. p d data A 1 B 2 C 3 D E F G H I J K L 4 8 12 16 20 24 28 Physical Memory Misal Kapasitas physical memory 28 bytes Ukuran page = frame = 4 bytes Ukuran 1 karakter = 1 byte “C” punya logical address <0,2> Di page table, base addr dari page 0 adalah 4 Maka physical address-nya = 4 + 2 = 6 Page 0 Page Table Page 1 Page 2 Logical Memory
Kelebihan dan Kelemahan Paging Karena ukuran page = frame, maka setiap frame dapat menampung satu page Tidak ada fragmentasi eksternal Tapi, tetap ada fragmentasi internal. Contoh : Ukuran page = frame = 2048 bytes Sebuah proses butuh 72766 bytes = 35 page + 1086 bytes Di physical memory dialokasikan 36 frame dimana di salah satu frame terjadi fragmentasi internal sebesar 2048-1086 = 962 bytes Solusi : ukuran page harus kecil untuk meminimalisir fragmentasi internal
Dukungan Perangkat Keras Paging Setiap OS mempunyai cara berbeda untuk implementasi page table Satu page table untuk setiap proses. Di PCB ada pointer ke table Satu/beberapa table untuk semua proses Ada beberapa cara implementasi page table di perangkat keras Register Page table base register (PTBR) Translation Look-Ahead Buffer (TLB)
Page Table di Register Page table dapat disimpan di register Cara paling sederhana implementasi page table di perangkat keras Cocok jika jumlah baris di page table kecil Misal 256 baris Padahal computer saat ini punya jumlah baris di page table yang sangat banyak.
Page Table dengan PTBR Page table disimpan di main memory Register menyimpan Page Table Base Register (PTBR) untuk menunjukkan lokasi page table di memory Kelemahan : Butuh dua kali akses memory : akses page table dan akses data/instruksi Page table bisa jadi mengalami proses swapping
Page Table dengan TLB Translation Look-Ahead Buffer (TLB) : perangkat keras untuk cache lookup data. Entri TLB mengandung key, value Kapasitas TLB hanya 32-1024 entri TLB hanya menyimpan beberapa page table, sisanya simpan di memori Bagaimana cara kerjanya? CPU pertama mencari entri dengan nomor page p pada page table di TLB Jika ada, gunakan entri tersebut untuk cari physical address Jika tidak ada, cari entri dengan page p pada page table di memory Gunakan entri tersebut Tambahkan entri itu ke TLB
Proteksi pada Paging Proteksi pada paging dapat dilakukan dengan menambahkan 1 kolom bernilai valid/invalid (1 bit) Jika satu proses akan mengakses satu alamat bernilai invalid, maka dia tidak diijinkan mengaksesnya
Shared Page Metode Paging menawarkan kemampuan berbagi page antar beberapa proses Contoh Ada 3 user menjalankan text editor yang terdiri atas 150KB code dan 50KB data Tanpa shared page, butuh 3x200KB = 600KB alokasi memori Dengan shared page, butuh 150 + (3x50) = 300KB
Struktur Page Table
Latar Belakang Masalah Komputer modern saat ini mendukung pengalamatan memory berukuran besar Komputer 32-bit mendukung pengalamatan sampai 232 = 4 GB Jumlah entri pada page table menjadi sangat besar. Contoh : Pada komputer 32-bit dengan ukuran page 4KB (212) maka akan ada 220 entri page table Implementasi page table secara linear tidak cocok Solusi : Harus ada perubahan struktur page table Hierarchical Paging Hashed Page Table Inverted Page Tables
Hierarchical Paging Page table disusun secara berjenjang Alamat pada page table menunjuk ke alamat lain page table baru menunjuk ke isi page table
Bagaimana cara implementasinya? Logical address dibagi menjadi beberapa bagian tergantung jumlah jenjang. Misalnya untuk 2 jenjang pada computer 32-bit. Translasi alamat dapat dilakukan sebagai berikut
Hashed Page Tables Page table di-index dengan hash dari nomor page p Satu entri pada page table berisi list page dengan hash yang sama
<process-id, page-number, offset> Inverted Page Table Page table di-index dengan menggunakan process id (pid) Logical address terdiri atas <process-id, page-number, offset>
Contoh pada Arsitektur Intel 32-bit, 64-bit dan ARM
Contoh pada Berbagai Arsitektur Baca textboot Silberschatz section 8.7 dan 8.8 halaman 383-388
Terima Kasih