Belajar : Heap dan Stack

edi ermawan, http://offground.wordpress.com

——— May 15, 2010 ——– Ketika suatu program berjalan, processor (– atau lebih tepatnya 80x86 ? –) mengalokasikan memory untuk program tersebut di RAM, yang terbagi menjadi empat bagian yaitu Code Segment (CS), Stack Segment (SS), Data Segment (DS), dan Extra Segment (ES).

Code Segment menyimpan semua kode dan instruksi-instruksi processor yang digunakan oleh program tersebut. Semua data di memori ini bersifat read-only.

Stack Segment teralokasi untuk berbagai keperluan, seperti menyimpan return address dari pemanggilan fungsi, menyimpan parameter-parameter yang dilewatkan ke fungsi, menyimpan variabel lokal di dalam fungsi, dll. Penambahan dan pengurangan memory stack menggunakan metode last in first out (LIFO). Misalnya, saat suatu fungsi dipanggil, seketika itu variabel lokal di dalam fungsi tersebut dialokasikan di stack (push), dan ketika fungsi sudah berakhir, variabel lokal di-dealokasikan (pop).  Walaupun proses LIFO di stack terjadi otomatis, di stack bisa terjadi overflow, atau yang disebut stack overflow. Stack overflow terjadi misalnya ketika terjadi pemanggilan recursive tak berujung (infinite recursive). Contoh:

[sourcecode language=“cpp”] void functionA { int A[1000]; funtionA; } [/sourcecode]

Data Segment terbagi menjadi 3 bagian yaitu Data, BSS dan Heap. Namun di beberapa literatur, data segment disebut juga heap, ini perlu diketahui agar tidak membingungkan.

Data berisi variabel-variabel program yang langsung diisi saat deklarasi, misalnya:

[sourcecode language=“cpp”] int i=10; char *str=‘isi string’; [/sourcecode]

BSS berisi variabel global dan variabel static yang tidak terinisialisasi. Misal:

[sourcecode language=“cpp”] int I; char *str; [/sourcecode]

Heap adalah bagian memori yang dapat dialokasikan secara dinamis, misalnya di C/C++  menggunakan malloc, new, dan juga dapat di-dealokasikan. Namun seandainya, suatu memori yang teralokasi dan tidak di-dealokasi secara manual  (melalui baris program), maka memori yang teralokasi tersebut akan tetap terjaga sampai program tersebut ditutup. Kesimpulannya, pembuat program-lah yang bertanggung jawab dengan apa yang terjadi di heap. Kesimpulan lainnya, jika di stack saja bisa terjadi overflow, maka di heap lebih mungkin lagi. Terutama untuk  bahasa pemrograman yang tidak memiliki garbage collector seperti C/C++, Delphi dll.

Dalam sebuah aplikasi, buffer overflow (stack atau heap overflow) atau aplikasi yang dapat di buffer overflow , bisa membuat aplikasi tersebut crash dan tidak aman. (will be continued). :)

——— Nov 11, 2012 Updated——– 

Di setiap program komputer yang berjalan, stack dialokasi di setiap thread. Jadi suatu aplikasi men-sharing heap yang sama, dan setiap thread memiliki stack-nya sendiri-sendiri. Kapan stack di-alokasikan? : saat setiap kali thread dibuat dan besarnya terbatas tergantung OS yang digunakan. di Ms-Windows , nilai default 1MB , Linux  mungkin berbeda. Jadi bisa di gambarkan sebagai bagian memory yang besarnya 1 MB dan kontinyu. Namun, walaupun besar total 1 MB, lokal variabel di setiap fungsi dibatasi sampai 4KB saja (untuk x86) , 8KB untuk (x64). jika lebih, programmu akan crash di _chkstk() jika pakai Microsoft compiler [saya pernah mengalami]  .

heap dan stack dialokasikan di RAM, tapi kenapa penggunaan stack lebih cepat dibanding heap? . karena stack pre-allocated dan untuk mengaksesnya tidak perlu menggunakan sebuah list atau variable pointer, tapi menggunakan register CPU : EBP dan ESP  . Register EBP dan ESP berperan saat pemanggilan fungsi (baca disini) .

comments powered by Disqus