Wednesday, October 24, 2012

Resource Allocation Type

Type resource allocation mendefinisikan cara bagaimana scheduler mengalokasikan resource block untuk setiap transmisi. Dalam istilah 'flexibility', cara untuk memberikan resource block dengan flexibilitas yang maksimum akan menggunakan deretan bit map (bit stream), setiap bit tersebut akan merepresentasikan setiap resource block group. Dengan cara tersebut akan dapat dicapai flexibilitas yang maksimum tetapi akan menghasilkan banyak proses kompilasi dari resource allocation atau terlalu banyak data (bit map yang terlalu panjang) untuk mengalokasikan resourcenya.
Oleh karena itu LTE memperkenalkan beberapa type dari resource allocation dan tiap tipe tersebut menggunakan prosedur yang telah terdefinisi sebelumnya. Ada tiga tipe resource allocation dalam LTE, yaitu resource allocation type 0, 1, dan 2. Penggunaan tiap tipe ini ke dalam tiap DCI seperti terlihat pada tabel di bawah :


Perlu diketahui bahwa sampai saat release 10, DCI format sudah mencapai DCI format 4, namun pada tabel di atas hanya ditampilkan sampai DCI format 2 saja, untuk format di lain belum dapat ditampilkan.

Resource Allocation Type 0
Resource allocation tipe 0 adalah cara yang paling sederhana dalam mengalokasikan resource allocation. Pertama resource blok dibagi menjadi group. Group ini sering disebut sebagai Resource Block Group (RBG). Jumlah resource block dalam tiap group tergantung pada sistem bandiwidth yang digunakan. Artinya ukuran RBG berbeda-beda tergantung pada system bandwidthnya. Hubungan antara ukuran RBG (jumlah resource block dalam RBG) dengan sistem bandwidth seperti terlihat pada tabel di bawah :
Sebagaimana diketahui bahwa resource allocation tipe 0 mengalokasikan resource dengan menggunakan bit map dan tiap bit tersebut mewakili satu buah resource block group. Susunan pada RA 0 ini adalah "RB --> RBG" dan resource allocation dilakukan pada level RBG. Contoh di bawah mungkin dapat memperjelas ilustrai RA 0 ini. Ilustrasi ini menggunakan sistem bandwidth 10 Mhz. Satu hal yang harus selalu diingat bahwa setiap bit map merepresentasikan satu RBG, bukan satu RB.
Field pertama yang perlu diperhatikan yaitu "RB-Assign". RB-assign berjumlah 17 bit yang diperoleh dari perhitungan berikut. Pertama sistem bandwidth adalah 10 Mhz berarti jumlah maksimum resource blocknya adalah 50. Nah jumlah maksimum tersebut jika kita cocokkan dengan tabel 7.1.6.1-1 pada ilustrasi di atas akan diperoleh bahwa RBG size adalah 3. Sow 1 bit map yang merepresentasikan 1 RBG akan memiliki 3 buah resource block atau PRB. Jika indeks PRB dimulai dari 0 - 49 (total 50), maka RBG atau bit map yang dibutuhkan adalah 49/3 = 17. Nah ketemu deh jumlah bit mapnya 17 biji ;) * moga jelas wkwkwk

Kemudian jika melihat deretan bit RB-assign = 00110100000000000. Kita liat ada 3 biji bit 1, berarti jumlah RBG-nya adalah 3 buah. Karena 1 RBG = 3 RB, maka total RB adalah 9 RB. Telah diketahui bahwa 1 RB itu sama dengan 12 RE (resource element atau sering juga disebut subcarrier dalam domain frekuensi) maka total RE adalah 12 x 9 = 108. Nah sampai di sini telah diketahui bahwa terdapat 108 RE. Setelah itu mari kita lihat field "MCS" yang bernilai '0'. Jika MCS ini kita cocokkan dengan tabel 7.1.7.1-1 "Modulation and TBS index table for PDSCH" yang terdapat pada TS 36213 7.1.7.1, seperti terlihat di bawah : (tabelnya sebagian aja, soalnya agak panjang)

Pada tabel terlihat bahwa untuk indeks MCS = 0, maka modulation ordernya ada 2. Hal ini berarti 1 RE = 3 bit. Sooowww..... 108 RE = 108 x 2 bit = 216 bit. Nah dari sini telah diketahui bahwa MAC layer dapat melakukan uplink sebanyak 216 bit pada transmisi berikutnya.

Resource Allocation Type 1
Resource tipe 1 ini juga menggunakan bitmap untuk mengalokasikan resource block, namun pada RA 1 ini ditambahkan beberapa susunan atau layer. Layer baru ini disebut sebagai subset RBG. Sehingga total hierarki RA tipe 1 adalah "RB-->RBG-->RBG subset" dan resource allocation dikerjakan pada revel RBG subset. Satu RBG subset dibentuk dari beberapa buah RBG. Namun jumlah RBG dalam tiap RBG subset juga tergantung dari sistem bandwidth yang digunakan. Hal yang perlu diperhatikan dalam RA tipe 2 ini yaitu:

  • Setiap bit dalam bitmap sudah langsung merepresentasikan 1 buah RB
  • Setiap RBG dialokasikan secara berurutan "across" beberapa RBG subset, seperti terlihat pada contoh di bawah 
  • Jumlah subset sama dengan jumlah RB dalam RBG
  • Tidak semua RB dapat dialokasikan karena jumlah subset tidak cukup untuk menkover semua RB
Contoh di bawah moga memberikan penjelasan yang lebih pas, pada contoh ini digunakan sistem bandwidth 10 Mhz.
Nah mari perhatikan field "RAType1", jumlah bit dalam field ini juga adalah 17 buah. Untuk memperoleh jumlah bit tersebut caranya sama dengan resource allocation tipe 0 sebelumnya. Namun pada RAType ini, 2 bit pertama menandakan subset, 1 bit berikutnya adalah shift, dan sisanya baru menunjukkan RB-Assign sebanyak 14 bit. Telah disebutkan di atas bahwa jumlah bit dalam bitmap atau RB-Assign sudah langsung menunjukkan jumlah resource block. Nah jika melihat RB-Assign tersebut hanya terdapat 3 buah bit 1, berarti jumlah resource blocknya ada 3 biji. Jika jumlah resource block ada 3 maka Resource Element (RE) = 3 x 12 = 36 RE. Sow.. klu udah dapat jumlah RE, langkah berikutnya adalah melihat field "MCS". MCS juga menunjukkan nilai 0, berati 1 RE = 2 bit. Sehingga jumlah bit total adalah 36 x 2 = 72 bit, selesai dah...!


Resource Allocation Type 2

Dalam RA type 2 ini, eNB mengalokasikan RB yang bersifat "contiguous", contiguous artinya berdekatan kali yah... ? :p. Contiguous RB tersebut adalah konsep "virtual" bukan konsep secara "physical". Ini berarti bahwa sekalipun MAC layer mengalokasikan beberapa contiguous RB, RB tersebut mungkin dapat secara tidak berurutan akan ditransmisikan pada PHY layer. Jadi harus ada aturan atau algoritma yang mengubah logical (virtual) RB allocation ini ke dalam bentuk physical RB allocation.
Ada dua tipe dari aturan konversi ini, yaitu localized dan distributed. Ketika digunakan localized maka baik virtual allocation ataupun physical allocation mengalokasikan RB dalam bentuk contiguous. Kemudian ketika digunakan distributed, virtual RB allocation bersifat contiguous namun physical allocation tidak bersifat contiguous, physical mendistribusikan RB pada range frekuensi secara keseluruhan. Di bawah ini adalah contoh ilustrasi untuk RA tipe 2 ini. Saya pikir ilustrasi ini sudah begitu jelas, jadi tidak usah ada penjelasan lagi dibawahnya. Pada contoh ini digunakan sistem bandwidth 10 Mhz juga.



From : sharetechnote
Reference:
TS-36.213 7.1.6 Resource Allocation

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);