IPC
Pada kesempatan kali
ini yang akan saya bahas adalah tentang bagaimana komunikasi antar proses. Seperti
halnya mahluk hidup, sebuah proses di dalam komputer juga saling berkomunikasi
dengan proses lainnya, apa yang mereka komunikasikan ya?
Yang mereka bicarakan tentu bukan gosip murahan belaka
atau hal tidak penting, yang mereka komunikasikan adalah pembagian resource
yang mereka butuhkan untuk menjalankan proses mereka, jadi dengan komunikasi
ini di mungkinkan 2 buah program yang berbeda dapat mengakses sebuah kolom data
yang sama dan sama sama dapat mengubah isi nilai dari data tersebut. Komunikasi
ini biasa disebut dengan IPC (Interprocess Communication)
IPC dapat dilakukan dengan beberapa metode antaranya:
1.
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 sequensial. Jadi proses yang
melakukan akses atau interupt terlebih dahulu akan selalu dilayani dan
mendapatkan hak lebih dulu untuk mengakses resource atau data yang ada di blok
memory.
2.
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.
3.
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.
Di bawah ini adalah contoh kodingan untuk membuat shared memory.
#include
#include
#include
#include
#include
#include
using namespace std;
struct LOCK {
string name;
string type;
vector pids;
};
int main ()
{
int
segment_id;
LOCK* shared_memory;
struct
shmid_ds shmbuffer;
int
segment_size;
const int
shared_segment_size = 0x6400;
/*
Allocate a shared memory segment. */
segment_id = shmget
(IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/*
Attach the shared memory segment. */
shared_memory = (LOCK*)
shmat (segment_id, 0, 0);
printf ("shared
memory attached at address %p\n", shared_memory);
/*
Determine the segment's size. */
shmctl (segment_id,
IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf ("segment
size: %d\n", segment_size);
/*
Write a string to the shared memory segment.
*/
//sprintf
(shared_memory, "Hello, world.");
shared_memory ->
name = "task 1";
shared_memory ->
type = "read";
(shared_memory ->
pids).push_back("12345");
(shared_memory ->
pids).push_back("67890");
/*
Detach the shared memory segment. */
shmdt (shared_memory);
/*
Reattach the shared memory segment, at a different address. */
shared_memory = (LOCK*)
shmat (segment_id, (void*) 0x5000000, 0);
printf ("shared
memory reattached at address %p\n", shared_memory);
/*
Print out the string from shared memory.
*/
//printf
("%s\n", shared_memory -> name);
cout << "Name
of the shared memory: " + shared_memory -> name << endl;
/*
Detach the shared memory segment. */
shmdt (shared_memory);
/*
Deallocate the shared memory segment. */
shmctl (segment_id,
IPC_RMID, 0);
return 0;
}
Tidak ada komentar:
Posting Komentar