Lompat ke konten Lompat ke sidebar Lompat ke footer

Layout Memori Bahasa C dan Penjelasannya

Pada pemrograman bahasa C, pada umumnya representasi memoris dari sebuah program terdiri dari beberapa bagian, yaitu: Segmen Teks, Inisialisasi Segmen Data, Uninisialisasi Segmen Data, Heap, dan Stack.


Sebelum memahami lebih dalam materi tentang Layout Memori Bahasa C dan Penjelasannya, terlebih dahulu pelajari materi tentang: Pengurutan Struct Bahasa C Beserta Contoh Programnya, Compound Literals Bahasa C Beserta Penjelasannya, dan Anonimus Union dan Struct Bahasa C dan Penjelasannya.

Tipikal memori layout dari proses yang berjalan:

satu, Segmen Teks: segmen teks atau juga dikenal sebagai sebuah kode segmen atau teks, merupakan salah satu dari section program pada file objek atau memori, yang terdiri dari instruksi eksekusi program. Sebagai bagian dari sebuah memori, teks segmen dapat ditempatkan dibagian bawah dari heap atau stack dalam urutan tertentu untuk mencegah heap dan stack mengalami overflow ketika melakukan overwrite.

Umumnya, teks segmen dapat dibagikan ke bagian lain sehingga hanya cukup menggunakan satu file saja dalam sebuah memori untuk dieksekusi secara berkali-kali dalam program, seperti teks editor, kompilator bahasa C, shells, dan lain sebagainya. Selain itu, segmen teks seringkali bersifat read-only, untuk mencegah program mengubah instruksinya secara tidak sengaja.

Baca Juga:

dua, Inisialisasi Data Segmen: inisialisasi data segmen secara sederhana disebut sebagai data segmen. Sebuah data segmen adalah sebuah bagian dari ruang alamat virtual dari suatu program, yang mengandung variabel global dan variabel static yang diinisialisasi oleh programmer.

Catatan: data segmen hanya bersifat read-only, karena nilai variabel dapat diubah pada saat dijalankan. Segmen ini juga dapat lebih jauh diklasifikasikan menjadi area inisialisasi read-only dan area inisialisasi read-write. Contohnya, string global yang didefinisikan oleh char char s[] = "hello world" pada bahasa C, dan sebuah statemen bahasa C seperti int debug=1 yang berada di luar fungsi main dapat disimpan pada area inisialisasi read-write. Juga, sebuah statemen global bahasa C seperti const char* string = "hello world" dapat membuat string literal "hello world" menjadi dapat disimpan pada area inisialisasi read-only, dan variabel karakter pointer string pada area inisialisasi read-write. Contoh lainnya, static int i = 10 dan variabel global int i = 10 dapat disimpan pada data segmen.

tiga, Uninisialisasi Data Segmen: uninisialisasi data segmen umumnya disebut sebagai "bss" segmen, dinamai dari operator assembler kuno yang merupakan singkatan dari "block started by symbol" Data, yang diinisialisasi oleh kernel ke aritmatika 0 sebelum program mulai mengeksekusi data yang tidak diinisialisasi dimulai pada akhir segmen data, dan berisi semua variabel global, dan variabel statis yang diinisialisasi ke nol atau tidak memiliki inisialisasi eksplisit dalam kode sumber. Contoh: sebuah deklarasi variabel static int i; dapat dikandung pada BSS segment dan sebuah deklarasi variabel int j; dapat dikandung pada BSS segment.

empat, Stack: Stack umumnya selalu berdampingan dengan area heap dan berkembang pada arah yang berlawanan, dimana ketika pointer stack bertemu dengan pointer heap, maka alokasi memori akan dibebaskan.

Catatan: dengan ruang alamat memori modern yang lebih besar yang disertai dengan teknik memori virtual, stack mungkin dapat digantikan pada hampir semua bagian bahasa pemrograman, tetapi penggunaannya akan tetap berkembang dalam arah yang berlawanan. Area stack mengandung program stack, dimana sebuah struktur LIFO umumnya berlokasi pada bagian memori yang lebih tinggi. Pada standar arsitektur PC komputer x86, stack akan berkembang bergerak ke arah alamat nol; sedangkan pada arsitektur lainnya, stack akan berkembang ke arah yang berlawanan. Sebuah rute register "stack pointer" pada bagian atas stack, itu disesuaikan setiap kali nilai "didorong" ke stack. Kumpulan nilai akan didorong untuk sebuah fungsi pemanggilan disebut juga sebagai "stack frame". Sebuah frame stack terdiri dari nilai minimum dari sebuah alamat return. Stack merupakan tempat dimana variabel secara otomatis akan disimpan bersamaan dengan informasi yang disimpan setiapkali sebuah fungsi dipanggil. Setiap kali sebuah fungsi dipanggil, alamat dari fungi tersebut dikembalikan dan informasi lainnya tentang lingkungan pemanggilnya, seperti mesin register, akan disimpan pada Stack. Fungsi yang baru saja dipanggil akan dialokasikan dalam sebuah ruangan pada stack secara otomatis dan merupakan variabel sementara. Dengan cara ini, maka fungsi rekursif dapat bekerja pada bahasa C, dimana setiap kali sebuah fungsi rekursif dipanggil oleh fungsi itu sendiri, maka sebuah frame stack baru akan digunakan, sehingga sekumpulan variabel tidak perlu dilibatkan dengan variabel baru saat ini dari instance lainnya dari sebuah fungsi yang sedang dipanggil tersebut.

lima, Heap: Heap adalah suatu segmen dimana alokasi memori dinamis umumnya akan ditempatkan. Area heap dimulai pada bagian akhir dari segmen BSS dan berkembang menjadi alamat yang lebih besar dari alamat sebelumnya. Area heap diatur oleh malloc, realloc, dan free, yang mungkin saja menggunakan sistem pemanggilan brk dan sbrk untuk menyesuaikan nilai ukurannya. Penggunaan brk dan sbrk dan sebuah area heap tunggal adalah tidak diharuskan untuk memenuhi kontrak malloc, realloc, atau free. Namun, hal tersebut mungkin saja dapat diimplementasikan menggunakan mmap untuk menyiapkan bagian potensial tidak berkelanjutan dari memori virtual ke proses ruanga alamat virtual. Area Heap dibagikan oleh semua librari bahasa C dan secara dinamis memuat modul dalam prosesnya.

Contoh: perintah melaporkan nilai ukuran dalam satuan byte dari teks, data, dan segmen bss.

#include <stdio.h>

int main(void)

{return 0;}

Tambahkan sebuah variabel global pada program, kemudian periksa nilai ukuran dari bss.

Contoh:

#include <stdio.h>

/* Uninisialisasi variabel yang disimpan dalam BSS*/

int global; 

int main(void)

{return 0;}

Tambahkan sebuah varaibel static yang juga disimpan pada bss.

Contoh:

#include <stdio.h>


/* Variabel inisialisasi yang

 disimpan dalam BSS*/

int global; 


int main(void)

{

/* Uninitialized static

 variable stored in bss */

static int i; 

return 0;

}

Tambahkan inisialisasi variabel static yang kemudian disimpan pada Data Segmen (DS).

Contoh:

#include <stdio.h>


/* Uninisialisasi variabel

 yang disimpan dalam BSS */

int global; 


int main(void)

{

/* Inisialisasi variabel

 static yang disimpan di dalam

 DS*/

static int i = 100

return 0;

}

Inisialisasikan sebuah variabel global yang kemudian disimpan pada Data Segmen (DS).

Contoh:

#include <stdio.h>


/* Inisialisasi variabel

 global yang disimpan dalam DS

 */

int global = 10


int main(void)

{

/* Inisialisasi variabel

 static yang disimpan dalam DS

 */

static int i = 100


return 0;

}



Artikel ini telah dibaca oleh: Firamika, Galang Prayoga, Gerald Hugo Christano, Gladys Sanditya, dan Gustina Aruming Sekar Lati.

5 komentar untuk "Layout Memori Bahasa C dan Penjelasannya"

  1. Apa yang dimaksud dengan layout memori bahasa C?

    BalasHapus
    Balasan
    1. Layout memori atau tata letak memori pada bahasa C merupakan program bahasa C yang berisi lima segmen yaitu stack, heap, BSS, DS, dan segmen teks, dimana setiap segmen tersebut memiliki izin baca, tulis, dan eksekusi sendiri.

      Hapus
  2. Bagaimana proses layout memori pada Bahasa C?

    BalasHapus
    Balasan
    1. Layout memori ditata secara berurutan pada nilai dasar 0 dan seterusnya untuk satu byte setiap kali. Setiap posisi dalam memori memiliki nomornya masing-masing yang disebut sebagai alamat memori.

      Hapus
    2. Kompilator akan mengaitkan nama variabel yang ada tersebut dengan alamat memori sesuai dengan urutan layout memori pada Bahasa C.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -