Tata Letak Memori

Written by: Fajar   |   Updated on: Oktober 17, 2018
Tata Letak Memori

Sebelumnya penulis sering membahas mengenai memori, membuat variabel memesan memori dan lain-lain. Tapi sebenarnya apa yang kita program tidak akan lepas dari memori, semua akan membutuhkan memori meskipun program yang anda buat memiliki tujuan awal membuat program yang tidak mengandung penyimpanan seperti variabel, mereka akan tetap memakan memori.

Di dalam artikel penulis akan membahas mengenai tata letak memori. sebelum itu kita harus tau bahwa di dalam komputer, memori dibagi menjadi 2 jenis, yaitu :

  • Read-only : memori yang hanya bisa dibaca dan tidak bisa di ubah nilainya.
  • Read-write : memori yang bisa dibaca dan bisa di ubah nilainya.

Sekali lagi sebelum kita membahas tentang Tata Letak Memori dan berbagai segmennya untuk menyimpan data dan instruksi kode, pertama-tama kita harus memahami bahwa driver kompilator (yang memanggil bahasa preprocessor, compiler, assembler, dan linker, sesuai kebutuhan pengguna) dapat menghasilkan tiga jenis file objek tergantung pada pilihan yang diberikan ke driver kompilator. Secara teknis file objek adalah urutan byte yang tersimpan pada disk dalam sebuah file. File objek ini adalah sebagai berikut:

  • Relocatable Object File (File objek yang dapat dilepas): Ini adalah file library statis. Hubungan statis seperti program Unix ld mengambil koleksi file objek yang dapat dipindahkan dan argumen baris perintah sebagai masukan dan menghasilkan file objek executable yang dapat dihubungkan penuh sebagai keluaran yang dapat dimuat ke memori dan dijalankan. File objek yang dapat diisi ulang berisi kode biner dan data dalam bentuk yang dapat dikombinasikan dengan file objek yang dapat direlokasi lainnya pada waktu kompilasi untuk membuat file objek yang dapat dieksekusi.
  • Executable Object File: Ini adalah file executable yang berisi kode biner dan data dalam bentuk yang dapat disalin langsung ke memori dan dieksekusi.
  • Shared Object File (File objek bersama): Jenis file relokasi khusus ini dimuat ke memori dan dihubungkan secara dinamis, baik pada waktu muat maupun waktu berjalan.
Baca :   Sejarah Object Oriented Programming (OOP)

File objek memiliki format yang spesifik, namun format ini dapat bervariasi dari satu sistem ke sistem lainnya. Beberapa format yang paling umum adalah .coff (Common Object File Format), .pe (Portable Executable), dan elf (Executable and Linkable Format).

Tata Letak Memori

Singkat kata, ketika kita menjalankan program C/C++, program yang kita buar akan dimuat ke dalam RAM computer secara terorganisir. Di dalam komputer terdapat memori yang telah atur sedemikian rupa dan hal itu disebut sebagai tata letak memori.
Macam-macam Tata letak memori, yaitu :

  1. Text segment
  2. Initialized data segment
  3. Uninitialized data segment
  4. Stack
  5. Heap
Tata Letak Memori
Tata Letak Memori

Text Segment

Text segment juga dikenal sebagai code segment. Text segment berisi kode mesin dari program yang telah dikompilasi. Segmen teks dari file objek yang dapat dieksekusi seringkali merupakan segmen read-only yang mencegah agar program tidak dimodifikasi secara sengaja atau tidak sengaja, yang merupakan kepentingan untuk keamanan program.

Initialized data segment

Initialized data segment juga sering dikenal dengan data segment, segmen ini adalah tempat untuk semua variabel yang berjenis global, static, constant dan eksternal yang telah di inisialisasi. Segmen ini dapat digolongkan dalam ke area read-only yang telah diinisialisasi dan area read-write yang telah diinisialisasi

#include <stdio.h>

char nama[]="belajar C++";     /*variabel ini disimpan di dalam Initialized Data Segment dan di area read-write*/
const char domain[]="belajarcpp.com";    /* variabel ini disimpan di dalam Initialized Data Segment dan di area read-only*/

int main()
{
    static int a=67;          /* static variable disimpan di Initialized Data Segment*/
    return 0;
}

Uninitialized data segment

Unitialized data segment juga biasa dikenal sebagai BSS Segment. Isitilah BSS digunakan untuk menunjukkan data yang tidak diinisialisasi bersifat universal. Ini pada awalnya merupakan akronim untuk intruksi Block Storage Start dari bahasa Assembly IBM 704 (sekitar tahun 1957).

Baca :   Cara Membuat dan Penjelasan Program Hello World Bahasa C

Unitialized data segment menyimpan semua variabel global, static, dan external yang tidak diinisialisasi. Data segmen ini biasanya secara default diinisialisasi ke aritmatika 0 sebelum program dijalankan. Bagian ini tidak menempati ruang aktual dalam file objek, itu hanyalah tempat pemegang. Format file objek membedakan antara variabel yang diinisialisasi dan yang tidak diinisiasi untuk efisiensi ruang; variabel yang tidak diinisiasi tidak harus menempati ruang disk sebenarnya dalam file objek.

#include <stdio.h>

char a;               /* Uninitialized variabel dismpan di bss*/

int main()
{
    static int b;     /* Uninitialized static variabel disimpan di bss */
    return 0;
}

Heap

Segmen Heap juga merupakan bagian dari RAM, tempat dimana alokasi memori dinamis biasanya terjadi. Dalam Bahasa C alokasi memori dinamis dilakukan dengan menggunakan fungsi malloc dan calloc, dan pada C++ menggunakan new.

Tumpukan memori Segmen heap tumbuh bergerak ke atas.

#include <stdio.h>
int main()
{
    char *p=(char*)malloc(sizeof(char));    /* memori dialokasi di dalam segmen heap*/
    return 0;
}

Stack

Segmen Stack merupakan tempat penyimpanan untuk variabel local, dan digunakan untuk menyampaikan argumen ke function beserta alamat pengirim dari instruksi yang akan dieksekusi setelah pemanggilan fungsi selesai.

Variabel lokal memiliki ruang lingkup pada blok dimana mereka didefinisikan, mereka dibuat saat kontrol memasuki blok. Semua fungsi rekursif panggilan ditambahkan ke stack. Data ditambahkan atau dihapus dengan teknik last-in-first-out untuk membentuk stack.

Stack dan heap secara ciri khas terletak di ujung yang berlawanan dari proses ruang alamat virtual, dan mereka juga tumbuh secara berlawanan dengan heap.

Melihat Informasi Tata Letak Memori

Perintah size adalah sebuah perintah dari GNU utility yang berfungsi untuk meminta laporan dari ukuran segmen text, segmen data, segmen bss dan ukuran total untuk setiap obyek atau file arsip dalam argumennya.

Baca :   Dasar Input Output pada C pada CLI

Contoh Program : tataLetakMemori.c

#include <stdio.h>

int globalA;
int globalB = 56;

int main(){
    int a = 1;
    const int b = 2;

    printf("%i", a);

    return 0;
}

Untuk melihat detail informasi tentang tata letak memori dari program di atas yang memiliki nama file “tataLetakMemori.c”. kita dapat menggunakan perintah size dilanjutkan dengan argument nama file tersebut.


[belajarcpp@c] $ gcc tataLetakMemori.c -o tataLetakMemori
[belajarcpp@c] $ size tataLetakMemori

Di dalam Komputer penulis menampilkan

text        data       bss         dec        hex        filename
4412       968       100         5480     1568      tataLetakMemori


One Reply to “Tata Letak Memori”

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *