Tuesday, October 23, 2012

Iseng- "Memory Allocations"

Dalam dunia pemrograman, kita diizinkan untuk mengalokasikan ruang memory secara dinamis pada saat program berjalan sesuai dengan kita butuhkan, proses seperti ini dinamakan dengan alokasi memory dinamis (dynamic memory allocation). Sedangkan pada saat kita mendekalarikan variabel global maupun lokal di dalam kode program yang kita tulis, kompilaor secara otomatis akan memesan sejumlah ruang memory untuk menampung variabel tersebut, proses seperti ini disebut dengan alokasi memory statis (static memory allocation).

Untuk melakukan alokasi memory secara dinamis dibutuhkan pointer untuk mencata alamat-alamat baru yang dipesan. Bahasa C telah menyediakan fungsi-fungsi yang digunakan untuk proses pemesanan memory secara dinamis tersebut, yaitu fungsi malloc(), calloc(), dan realloc(). 


Fungsi malloc()
Fungsi ini mempunyai bentuk prototype seperti terlihat di bawah :

void * malloc(size_t n)

Fungsi malloc() akan mengembalikan pointer ke sejumlah n byte ruang memory yang belum diinisialisasi. Apabila tidak terpenuhi, maka fungsi ini akan mengembalikan nilai NULL. Hal yang perlu diperhatikan dalam  menggunakan fungsi ini adalah kita harus melakukan typecasting terhadap pointer yang akan dipesan sesuai dengan tipe data yang diinginkan. Perhatikan contoh penggunaan fungsi malloc di bawah ini :

int array[10];
int *p;
p = (int *) malloc(10 * sizeof(int));

Sintak ini artinya melakukan pemesanan atau mengalokasikan ruang memory sebanyak 40 byte (berasal dari 10x4) untuk menyimpan data yang bertipe int dan mencatat ruang memory tersebut ke dalam pointer p. Adapun nilai 4 di sini berasal dari ukuran tipe data int yaitu 4 byte. Jadi apabila kita ingin mengalokasikan ruanng memory untuk tipe data double, sedangkan kita telah mengetahui bahwa tipe data double berukuran 8 byte, maka kita dapat menuliskannya sebagai berikut :

double *p;
p =  (double*) malloc(8); 
/* atau dapat juga dituliskan p = (double*) malloc(sizeof(double)); */

Meskipun cara di atas dizinkan oleh kompilator serta program juga dapat berjalan dengan benar, namun kebanyakan dari programmer C pada umumnya lebih memilih untuk menggunakan operator sizeof untuk mendapatkan ukuran dari tipe data tertentu.

Fungsi calloc()
Fungsi ini mempunyai bentuk prototype sebagai berikut :

void *calloc(size_t n, size_t size);

Fungsi calloc() akan mengembalikan pointer ke sebuah array yang terdiri dari n elemen data dengan size yagn ditentukan. Apabila tidak terpenuhi, maka fungsi ini akan mengembalikan nilai NULL. Berbeda dengan fungsi malloc() yang tidak melakukan inisialisasi, pada fungsi calloc() ini ruang yang dialokasikan akan diinisialisasi dengan nilai nol. Untuk dapat lebih memahaminya, perhatikan contoh potongan kode program di bawah untuk penggunaan fungsi calloc().

int *p;
p = (int*) calloc(20, sizeof(int));

Sintak tersebut mengalokasikan 80 byte ruang memory (yang berasal dari 20x4). Dengan kata lain, terdapat 20 element array yang masing-masing elemennya berukuran 4 byte. Sama seperti sebelumnya, nilai 4 byte disini adalah ukuran dari tipe data int.


Fungsi realloc()
Fungsi terakhir yang dapat digunakan untuk mengalokasikan memory dalam bahasa C adalah realloc(). Prototype fungsi ini seperti terlihat di bawah :

void *realloc(void *p, size_t size)

Perlu ditekankan bahwa fungsi realloc() ini sebenarnya digunakan untuk melakukan perubahan terhadap alokasi memory yang sebelumnya telah dilakukan dengan menggunakan fungsi malloc() atau calloc(). Dengan kata lain, fungsi ini hanya digunakan untuk alokasi ulang apabila ternyata ruang yang dialokasikan oleh fungsi malloc() atau calloc() kurang besar. Fungsi realloc() ini akan mengembalikan pointer ke ruang baru yang ditambahkan, atau mengembalikan nilai NULL apabila permintaan ruang tersebut tidak terpenuhi. Berikut ini contoh penggunaan fungsi realloc() untuk menambahkan ruang memori yang telah dialokasikan.

int *p;
p = (int*) calloc(10, sizeof(int)); //memesan ruant 40 byte
realloc((int*) p, 80);//memesan ruang sebanyak 40 byte lagi, sehingga sekarang menjadi 80 byte



Nah... ! Untuk menghidari adanya pemborosan memory ataupun terjadinya memory leak (kebocoran memory), maka sebaiknya kita melakukan dealokasi terhadap ruang-ruang memory yang telah sebelumnya dialokasikan melalui fungsi malloc(), calloc(), ataupun realloc(). Dalam bahasa C, proses ini akan dilakukan dengan menggunakan fungsi free() yang memiliki parameter bertipe pointer. Prototype fungsi free() ini seperti terlihat di bawah :

void *free(void *p)

p didalam parameter fungsi free tersebut haruslah bertipe pointer. Contoh penggunaannya seperti terlihat di bawah :

int *p;
p = (int*) malloc(sizeof(int));
.....
.....
....
free(p);





Resource Element Groups

Informasi control untuk downlink pada physical channel dimasukkan ke dalam suatu resource unit yang lebih kecil dari pada resource block. Alasan melakukan hal ini adalah melakukan distribusi transmisi melalui banwdith yang lebih besar untuk memperoleh frequency-diversity. Sebagaimana telah diketahui bahwa control information secara umum lebih kecil daripada data dan jika resource block digunakan untuk transmisi control information, transmission akan menjadi bersifat lokal dalam domain frekuensi, hal ini tentu tidak diharapkan dari sudut pandang control-channel-perfomance. Unit resource yang digunakan untuk transmisi control information sering disebut sebagai resource element group (REG), yang terdiri dari 4 buah subcarriers (resource elements) dalam resource block pada OFDM symbol. Sebuah resource block berisi dua atau tiga  REG tergantung dari resource block dalam OFDM symbol apakah membawa reference signal atau tidak, seperti pada gambar di bawah :

Ketika terdapat reference signal dalam resource block, 4 dari 12 subcarrier digunakan untuk transmisi reference signal tersebut. 8 subcarriers yang tersisa kemudian akan digunakan untuk membentuk dua buah REG. Harus diketahui bahwa posisi subcarrier reference signal dalam resource block tidak tetap dan tergantung pada pergeseran frekuensi yang digunakan dalam tiap Cell atau eNB.

Resource element group direpsentasikan dengan pasangan index (k',l') dari resource element dengan k adalah index terendah dalam group dengan semua resource element dalam group yang mempunyai nilai yang sama dengan l. Jumlah maksimum REG yaitu 4 buah OFDM simbol dalam sebuah subframe. Hal ini karena PDCCH hanya dapat mencapai maksimum 4 OFDM simbol dalam bandwidth yang kecil. Simbol OFDM yang pertama selalu mempunyai satu atau dua reference signal. Kemudian simbol OFDM kedua berisi dua reference signal untuk antena ports 2 dan 3 dalam kasus 4 cell-specific reference signal. Dalam kasus simbol OFDM pertama dan keduaketika jumlah port antenna dikonfigurasi jadi empat, maka terdapat 2 resource-element group dalam physical resource block n_prb yang terdiri dari resource element (k,l) dengan :


ko menunjukkan resource element pertama dalam resource block dan dirumuskan sebagai :
Harus dicatat bahwa sekalipun single cell-specific reference signal dikonfigurasi pada port antenna 0, resource element yang dicadangkan untuk reference signal port antenna 1 tetap tidak digunakan. Kita mengetahui bahwa setiap REG didefinisikan pada 6 resource element karena dua resource element digunakan untuk reference signal.
Di symbol OFDM kedua dalam kasus hanya satu atau dua cell-specific reference signal yang dikonfigurasi, symbol ketiga dan keempat, tiga resource element group pada physical resource block n_prb terdiri dari resource element(k,l) dengan :

Mapping dari symbol-quadruplet z(i+2),
z(i+3)> ke resource element group disimbolkan dengan resource element (k',l') didefinisikan sehingga element z(i) dimasukkan ke resource element (k,l) dari resource element group tidak digunakan untuk cell-specific reference signal dalam urutan naik dari i dan k. Alasan mendefinisikan istilah symbol-quadraplets dan kemudian menggunakan empat resource elements untuk REG adalah untuk mengontrol channel dapat menggunakan sampai empat layer SFBC-FSTD skema transmit diversity.