Layout Memori 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.
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;}
#include <stdio.h>
/* Uninisialisasi variabel yang disimpan dalam BSS*/
int global;
int main(void)
{return 0;}
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;
}
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;
}
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;
}
Segmen Memori dalam Bahasa C
- Segmen Kode (Text Segment): Segmen kode adalah tempat dimana instruksi program disimpan. Ketika program dieksekusi, CPU akan mengambil instruksi dari segmen ini. Sebagai bagian dari layout memori, segmen ini umumnya bersifat hanya baca (read-only) untuk mencegah perubahan tak terduga pada kode yang sedang berjalan. Penyimpanan di segmen kode biasanya tidak dipengaruhi oleh alokasi dinamis atau variabel lokal yang digunakan dalam program.
- Segmen Data (Data Segment): Segmen data digunakan untuk menyimpan data statis yang diketahui pada saat kompilasi. Variabel global dan statis, baik yang diinisialisasi maupun tidak diinisialisasi, ditempatkan di segmen ini. Segmen data terbagi lagi menjadi dua bagian:
- Inisialisasi: Untuk variabel global atau statis yang sudah diberi nilai awal.
- Tanpa Inisialisasi (BSS - Block Started by Symbol): Untuk variabel global atau statis yang belum diinisialisasi secara eksplisit oleh programmer, yang secara otomatis akan diinisialisasi dengan nilai default (biasanya nol).
- Segmen Tumpukan (Stack Segment): Segmen tumpukan adalah area memori yang digunakan untuk menyimpan data terkait dengan pemanggilan fungsi. Tumpukan digunakan untuk menyimpan variabel lokal, parameter fungsi, serta alamat pengembalian setelah fungsi selesai dieksekusi. Setiap kali fungsi dipanggil, tumpukan akan bertambah (push), dan setiap kali fungsi selesai, tumpukan akan berkurang (pop). Pengelolaan tumpukan dilakukan secara otomatis oleh sistem operasi, dan ukuran segmen ini terbatas oleh sistem, yang bisa menyebabkan masalah seperti *stack overflow* jika terlalu banyak memori yang digunakan.
- Segmen Heap (Heap Segment): Segmen heap adalah area memori yang digunakan untuk alokasi dinamis. Berbeda dengan tumpukan, yang pengelolaannya otomatis, alokasi di segmen heap dilakukan secara eksplisit oleh programmer melalui fungsi alokasi memori seperti *malloc*, *calloc*, atau *realloc*. Memori yang dialokasikan di heap harus dikelola dengan hati-hati untuk menghindari kebocoran memori (*memory leak*) atau penggunaan memori yang sudah dibebaskan. Sebagai contoh, setelah penggunaan memori dinamis selesai, programmer perlu memastikan bahwa memori tersebut dibebaskan menggunakan fungsi *free*.
- Segmen Pengaturan (Memory-Mapped Segment): Segmen ini digunakan untuk memetakan file atau perangkat keras tertentu ke dalam ruang alamat memori. Ini memungkinkan program untuk mengakses file atau perangkat keras tersebut seolah-olah adalah bagian dari memori utama, meningkatkan efisiensi dalam hal akses data.
Manajemen Memori dalam Bahasa C
- Memori Statis: Memori statis adalah memori yang dialokasikan pada waktu kompilasi dan memiliki waktu hidup yang sebanding dengan durasi eksekusi program. Variabel global, variabel statis, dan konstanta disimpan di segmen data atau segmen kode. Alokasi dan pembebasan memori ini terjadi secara otomatis, sehingga programmer tidak perlu khawatir tentang pengelolaannya selama eksekusi program.
- Memori Dinamis: Memori dinamis adalah memori yang dialokasikan selama waktu eksekusi program dengan menggunakan fungsi seperti *malloc* atau *calloc*. Keuntungan utama dari memori dinamis adalah kemampuannya untuk dialokasikan atau dibebaskan sesuai dengan kebutuhan program. Namun, hal ini menuntut perhatian khusus terhadap pembebasan memori untuk mencegah kebocoran memori, dimana memori yang sudah tidak digunakan lagi tetap tersimpan, menghabiskan sumber daya.
Alokasi Memori dan Pointer
Masalah Umum dalam Manajemen Memori
Pengelolaan Memori dan Kinerja
Kesimpulan
- Kebocoran Memori Bahasa C dan Cara Mengatasinya
- Fungsi FSEEK dan REWIND Bahasa C dan Penjelasannya
- EOF Bahasa C Menggunakan GETC dan FEOF Beserta Penjelasannya
- Fungsi FOPEN Bahasa C untuk File dalam Mode Penulisan
- Read dan Write Struktur File Bahasa C
- Fungsi FGETS dan GETS Bahasa C dan Penjelasannya
- File Handling Bahasa C dan Penjelasannya
5 komentar untuk "Layout Memori Bahasa C dan Penjelasannya"
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 -
Apa yang dimaksud dengan layout memori bahasa C?
BalasHapusLayout 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.
HapusBagaimana proses layout memori pada Bahasa C?
BalasHapusLayout 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.
HapusKompilator akan mengaitkan nama variabel yang ada tersebut dengan alamat memori sesuai dengan urutan layout memori pada Bahasa C.
Hapus