Jumat, 06 November 2015

IPC

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