Thread dan IPC
Thread adalah bagian kecil dari suatu proses yang bisa dijadwalkan oleh sistem operasi. Thread juga disebut sebagai proses ringan(lightweight).
- Single Threading
Adalah sebuah proses yang hanya memiliki satu thread yang berjalan. Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses. - Multi Threading
Adalah proses yang memiliki lebih dari satu thread yang berjalan didalamnya, sehingga dalam hal ini proses dapat menjalankan lebih dari satu tugas dalam satu waktu
IPC (Interprocess Communincation)
Interprocess Communication adalah cara atau mekanisme pertukaran data antara satu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang sama, atau komputer jarak jauh yang terhubung melalui jaringan.
a. Pipes
Pipe merupakan komunikasi sequensial antar proses yang saling terelasi, namun
pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar proses yang saling berhubungan, dan komunikasinya yang dilakukan adalah secara sekuensial.
b. Message Queue
Sistem berkirim pesan adalah proses komunikasi antar bagian sistem untuk
membagi variabel yang dibutuhkan. Proses ini menyediakan dua operasi yaitu
mengirim pesan dan menerima pesan.
c. Shared Memory
Sistem Berbagi Memori merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Alamat dan besar alokasi memori yang digunakan biasanya ditentukan oleh pembuat program. Pada metode ini, sistem akan mengatur proses mana yang akan memakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.
d. Socket
Bentuk dari komunikasi yaitu UDP dan TCP menggunakan abstraksi socket yang menyediakan endpoint untuk komunikasi antar proses. Socket bisa dijalankan di berbagai platform(BSD UNIIX, UNIX, Linux, Windows, & Machintos OS).
Interprocess Communication adalah cara atau mekanisme pertukaran data antara satu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang sama, atau komputer jarak jauh yang terhubung melalui jaringan.
a. Pipes
Pipe merupakan komunikasi sequensial antar proses yang saling terelasi, namun
pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar proses yang saling berhubungan, dan komunikasinya yang dilakukan adalah secara sekuensial.
b. Message Queue
Sistem berkirim pesan adalah proses komunikasi antar bagian sistem untuk
membagi variabel yang dibutuhkan. Proses ini menyediakan dua operasi yaitu
mengirim pesan dan menerima pesan.
c. Shared Memory
Sistem Berbagi Memori merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Alamat dan besar alokasi memori yang digunakan biasanya ditentukan oleh pembuat program. Pada metode ini, sistem akan mengatur proses mana yang akan memakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.
d. Socket
Bentuk dari komunikasi yaitu UDP dan TCP menggunakan abstraksi socket yang menyediakan endpoint untuk komunikasi antar proses. Socket bisa dijalankan di berbagai platform(BSD UNIIX, UNIX, Linux, Windows, & Machintos OS).
Contoh permasalahan:
Oink adalah seorang distributor komponen komputer untuk area Surabaya. Komponen yang tersedia di Oink Komputer yaitu RAM, harddisk, motherboard, PSU, VGA, dan processor. Setiap harinya dia melakukan banyak transaksi dengan beberapa pelanggannya. Setiap saat oink dapat menambahkan stok barangnya dan setiap pelanggan dapat membeli barang di oink comp. Oink merasa kesulitan dalam mencatat semua transaksinya dalam buku, jadi bantulah oink membuat sebuah aplikasi yang dapat memudahkan pekerjaannya. Terdapat 2 aplikasi, untuk penjual dan pembeli.
Berikut adalah kebutuhan dari aplikasi untuk penjual:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, tambah stok
2. Fitur tambah stok memiliki format inputan: nama_barang jumlah_barang. Jika barang yang sudah ada di stok diinputkan kembali, maka stoknya bertambah.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang jumlah_barang
Berikut adalah kebutuhan dari aplikasi untuk pembeli:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, beli barang
2. Fitur beli barang memiliki format inputan: nama_barang jumlah_barang. Jika fitur ini dijalankan maka stok barang akan berkurang sesuai jumlah yang dibeli. Jika jumlah pembelian lebih dari stok yang tersedia, maka program menampilkan pesan kesalahan.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang jumlah_barang
Berikut adalah kebutuhan dari aplikasi untuk penjual:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, tambah stok
2. Fitur tambah stok memiliki format inputan: nama_barang jumlah_barang. Jika barang yang sudah ada di stok diinputkan kembali, maka stoknya bertambah.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang jumlah_barang
Berikut adalah kebutuhan dari aplikasi untuk pembeli:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, beli barang
2. Fitur beli barang memiliki format inputan: nama_barang jumlah_barang. Jika fitur ini dijalankan maka stok barang akan berkurang sesuai jumlah yang dibeli. Jika jumlah pembelian lebih dari stok yang tersedia, maka program menampilkan pesan kesalahan.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang jumlah_barang
Berikut program untuk penjual
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define SHMSZ 12
int main()
{
int shmid;
key_t key;
int *shm;
int *content;
char menu[7];
char tmb_brg[11];
int i;
int j;
int brg;
/*
* We'll name our shared memory segment
* "1111".
*/
key = 1111;
/*
* Create the segment.
*/
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
/*
* Now we attach the segment to our data space.
*/
if ((shm = shmat(shmid, NULL, 0)) == (int*) -1)
{
perror("shmat");
exit(1);
}
/*
* Now put some things into the memory for the
* other process to read.
*/
content = shm;
for(i=0; i<6; i++)
content[i] = 0;
printf("Untuk melihat menu ketik 'menu'\n");
while(1)
{
scanf("%s",menu);
for(j=0;j<strlen(menu);j++)
menu[j]=tolower(menu[j]);
if(strcmp(menu,"menu") == 0)
{
printf("'lihat' : Melihat stok barang\n");
printf("'tambah' : Menambah stok barang\n");
printf("'keluar' : Keluar dari program\n");
}
else if(strcmp(menu,"lihat") == 0)
{
printf("\nSTOCK BARANG\n");
printf("RAM\t\t %d\n",content[0]);
printf("harddisk\t %d\n",content[1]);
printf("motherboard\t %d\n",content[2]);
printf("PSU\t\t %d\n",content[3]);
printf("VGA\t\t %d\n",content[4]);
printf("processor\t %d\n",content[5]);
}
else if(strcmp(menu,"tambah") == 0)
{
printf("Masukkan nama barang dan berapa jumlah barang yang ditambah\n");
scanf("%s%d",tmb_brg,&brg);
brg=abs(brg);
for(j=0;j<strlen(tmb_brg);j++)
tmb_brg[j]=tolower(tmb_brg[j]);
if(strcmp(tmb_brg,"ram") == 0)
content[0]+=brg;
else if(strcmp(tmb_brg,"harddisk") == 0)
content[1]+=brg;
else if(strcmp(tmb_brg,"motherboard") == 0)
content[2]+=brg;
else if(strcmp(tmb_brg,"psu") == 0)
content[3]+=brg;
else if(strcmp(tmb_brg,"vga") == 0)
content[4]+=brg;
else if(strcmp(tmb_brg,"processor") == 0)
content[5]+=brg;
else printf("Barang tidak ada\n");
}
else if(strcmp(menu,"keluar") == 0)
break;
else printf("Menu tidak ada\n");
}
return 0;
}
Berikut program untuk pembeli
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define SHMSZ 12
int main()
{
int shmid;
key_t key;
int *shm;
int *content;
char menu[7];
char beli_brg[11];
int brg;
int j;
/*
* We'll name our shared memory segment
* "1111".
*/
key = 1111;
/*
* Create the segment.
*/
if ((shmid = shmget(key, SHMSZ, 0666)) < 0)
{
perror("shmget");
exit(1);
}
/*
* Now we attach the segment to our data space.
*/
if ((shm = shmat(shmid, NULL, 0)) == (int *) -1)
{
perror("shmat");
exit(1);
}
/*
* Now put some things into the memory for the
* other process to read.
*/
content = shm;
printf("Untuk melihat menu ketik 'menu'\n");
while(1){
scanf("%s",menu);
for(j=0;j<strlen(menu);j++)
menu[j]=tolower(menu[j]);
if(strcmp(menu,"menu") == 0)
{
printf("'lihat' : Melihat stok barang\n");
printf("'beli' : Membeli barang\n");
printf("'keluar': Keluar dari program\n");
}
else if(strcmp(menu,"lihat") == 0)
{
printf("\nSTOCK BARANG\n");
printf("RAM\t\t %d\n",content[0]);
printf("harddisk\t %d\n",content[1]);
printf("motherboard\t %d\n",content[2]);
printf("PSU\t\t %d\n",content[3]);
printf("VGA\t\t %d\n",content[4]);
printf("processor\t %d\n",content[5]);
}
else if(strcmp(menu,"beli") == 0)
{
printf("Masukkan nama barang dan berapa jumlah barang yang dibeli\n");
scanf("%s%d",beli_brg,&brg);
brg=abs(brg);
for(j=0;j<strlen(beli_brg);j++)
beli_brg[j]=tolower(beli_brg[j]);
if(strcmp(beli_brg,"ram") == 0)
{
if(content[0]>=brg)
content[0]-=brg;
else
printf("Stok barang kurang\n");
}
else if(strcmp(beli_brg,"harddisk") == 0)
{
if(content[1]>=brg)
content[1]-=brg;
else
printf("Stok barang kurang\n");
}
else if(strcmp(beli_brg,"motherboard") == 0)
{
if(content[2]>=brg)
content[2]-=brg;
else
printf("Stok barang kurang\n");
}
else if(strcmp(beli_brg,"psu") == 0)
{
if(content[3]>=brg)
content[3]-=brg;
else
printf("Stok barang kurang\n");
}
else if(strcmp(beli_brg,"vga") == 0)
{
if(content[4]>=brg)
content[4]-=brg;
else
printf("Stok barang kurang\n");
}
else if(strcmp(beli_brg,"processor") == 0)
{
if(content[5]>=brg)
content[5]-=brg;
else
printf("Stok barang kurang\n");
}
else printf("Barang tidak ada\n");
}
else printf("Menu tidak ada\n");
}
return 0;
}
Kedua kodingan secara terpisah dijadikan object dengan cara gcc (nama file).c -o (nama file).o lalu dieksekusi dengan cara ./(nama file).o
Problem diatas dilakukan dengan menggunakan 2 terminal, yang pertama menjalankan program penjual, yang kedua menjalankan program pembeli.
Sekian postingan dari saya, apabila kurang jelas bisa tanya, terima kasih..
Comments
Post a Comment