Manajemen Memori (2)

Senin, 03 Januari 2011

PROSES ADDRESS SPACE

Ketika user mode process meminta alokasi memori, maka proses tersebut bagi kernel :

· Dianggap nonurgent sehingga proses tersebut tidak dengan segera mendapat alokasi memori.

· Tidak bersih dari error sehingga kernel harus berusaha menangguli error yang ada.

Karena kernel berusaha sebisa mungkin untuk menunda permintaan alokasi memory maka user mode process menggunakan sebuah interval linier address yang baru yang merupakan bagian dari address space yang disebut memory region.

Address space sebuah proses terdiri dari semua linier address yang proses tersebut dapat gunakan. Interval linier address tersebut disebut memory region. Memory region dikarakterisasi dengan initial address, length (panjang) dan hak akses. Untuk alasan efisiensi, maka initial address dan panjang dari memory region harus merupakan kelipatan dari 4096.

1. Memory descriptor

Segala informasi yang berhubungan dengan process address space terdapat dalam tabel referensi mm field dari process descriptor. Struktur data mm_struct :

struct mm_struct {

struct vm_area_struct *mmap, *mmap_avl, *mmap_cache;

pgd_t *pgd;

atomic_t count;

int map_count;

struct semaphore mmap_sem;

unsigned long context;

unsigned long start_code, end_code, start_data,

end_data;

unsigned long start_brk, brk, start_stack;

unsigned long arg_start, arg_end, env_start, env_end;

unsigned long rss, total_vm, locked_vm;

unsigned long def_flags;

unsigned long cpu_vm_mask;

unsigned long swap_cnt;

unsigned long swap_address;

void *segments;

};

Field yang penting :

· pgd dan segments : menunjuk Page Global Directory dan Local Descriptor Table dari proses.

· rss : menspesifikasikan jumlah page frame yang dialokasikan untuk proses.

· total_vm : melambangkan ukuran proses dalam jumlah pages.

· locked_vm : menghitung jumlah “locked” pages, yaitu pages yang tidak bisa diswap.

· count : merupakan jumlah prses yang menggunakan mm_struct deskriptor yang sama.

Fungsi mm_alloc () digunakan untuk mendapatkan memori deskriptor yang baru. Karena deskriptor ini terletak dalam slab allocator cache, maka mm_alloc () memanggil kmem_cache_alloc () untuk menginisialisasi memori deskriptor baru dengan menduplikasi isi dari memori deskriptor yang ada dan countnya diset 1.

2. Memory Regions

Memory region dideskripsikan degna vm_area struct :

struct vm_area_struct {

struct mm_struct *vm_mm;

unsigned long vm_start;

unsigned long vm_end;

struct vm_area_struct *vm_next;

pgprot_t vm_page_prot;

unsigned short vm_flags;

short vm_avl_height;

struct vm_area_struct *vm_avl_left, *vm_avl_right;

struct vm_area_struct *vm_next_share,**vm_pprev_share;

struct vm_operations_struct *vm_ops;

unsigned long vm_offset;

struct file *vm_file;

unsigned long vm_pte;

};

Tiap memory region deskriptor mengindentifikasi sebuah interval linier address tertentu. vm_start berisi linier address dalam interval yang pertama sementara vm_end berisi linier address pertama diluar interval sehingga vm_end – vm_start merupakan panjang dari memory region.

Memory region tiap proses tidak pernah overlap. Jika ada 2 memory region yang bersinggungan maka kernel akan berusaha untuk menggabungkannya. Jika tidak bisa maka akan dibuat saling bersebelahan saja. Pada proses dialokasi, jika yang didisalokasi ada ditengah-tengah sebuah memory region maka memory region tersebut akan terbagi 2.

3. Page Fault Handler

Linux Page Fault exception handler harus membedakan eksepsi yang disebabkan oleh kesalahan programming dari eksepsi yang disebabkan oleh pengacuan ke sebuah page yang berada pada process address space , tetapi belum dialokasi. Fungsi do_page_fault()yang merupakan rutin servis interup Page Fault membandingkan linear address yang menyebabkan page fault dengan memori region dari proses current hal ini merupakan hal yang tepat untuk meng-handle exception.

Jenis page fault handler antara lain : copy on write, demand paging, send SIGSEGV, kill process and kernel “Oops”, dan “fixup code”.

4. Copy on Write

Sistem Unix generasi pertama mengimplementasikan pembuatan proses dengan cara yang ceroboh : saat fork()dipanggil, kernel menduplikasi seluruh process address space parentdan meng-assign salinan proses ke child process. Kernel Unix modern memperkenalkan pendekatan yang lebih efisien yang disebut Copy OnWrite (COW). Idenya adalah daripada menduplikasi page frames, maka terjadi pembagian antara parent process dan child process.

5. Managing the Heap

Setiap proses Unix mempunyai memory region spesifik yang disebut heap yang digunakan untuk memenuhi permintaan proses dinamik memori. Field memory descriptor start_brk dan brk membatasi alamat awal dan akhir pada region tersebut.

Fungsi libary C berikut bisa digunakan oleh proses untuk meminta dan membebaskan dynamic memory :

· malloc (size), meminta ukuran byte dynamic memory

· calloc(n, size), meminta sebuah array yang terdiri atas n elemen dari size, jika alokasi suskses maka akan menginisialisasi komponen array dengan 0 dan mengembalikan linear address dari elemen pertama.

· free(addr), membebaskan memory region yang dialokasikan oleh malloc() atau calloc() yang mempunyai alamat inisial addr.

· brk(addr), memodifikasi ukuran heap secara langsung, parameter addr menentukan nilai baru dari current->mm->brk, dan return value-nya adalah alamat akhir yang baru dari memory region.

0 komentar:

Posting Komentar