[LinuxFocus-icon]
Ev  |  Eri�imd�zeni  |  ��indekiler  |  Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Leonardo]
taraf�ndan Leonardo Giordani
<leo.giordani(at)libero.it>

Yazar hakk�nda:

Milan Politechnico'da Telekoninikasyon M�hendisli�inde okuyor.Network yoneticisi olarak �al���yor ve programlama (�zellikle Assembly ve C/C++) ile ilgileniyor.1999'dan beri neredeyse sadece Linux/Unix ile �al���yor.



T�rk�e'ye �eviri:
Özcan Güngör <ozcangungor(at)netscape.net>

��erik:

 

E�zmanl� Programlama - �leti Kuyruklar� (1)

[run in paralell]

�zet:

Bu makale

Bu makalenin anla��labilmesi i�in �n ko�ullar �unlard�r:

  • Minimun kabuk bilgisi
  • Temel C dili bilgisi(yaz�m,d�ng�ler,k�t�phaneler)

LinuxFocus'un son iki say�s�nda yay�nlanan makaleleri okumak yararl� olacakt�r (Kas�m2002 ve Ocak2003).
_________________ _________________ _________________

 

Giri�

Son makalede, e�zamanl� i�lemler kavram�n� tan�tt�k ve i� i�lem ileti�imi probleminin ��z�m�n� ��rendik:Semaforlar.Orada g�rd���m�z gibi, semafor kullan�m� bize payla��lm�� kaynaklara ula��m�n y�netilmesi imkan�n� vermektedir.Yani kabaca iki ya da daha �ok i�lemin e�zamanl� �al��mas�n� sa�lar.

��lemlerin e�zamanl� �al��mas� demek, i�lemlerin zamanlamas� demektir. Mutlak referans sisteminde de�il (hangi i�lemin hangi zamanda ba�lay�p hangi zamanda bitece�ini vermek) g�receli olanda (hangi i�lemin �nce hagngisinin sonra �al��aca��n� planlamak) yap�l�r.

Semafor kullan�m� kendisini iki yolla g�sterir:karma��k veya s�n�rl�. Karma��kt�r ��nk� her i�lem, di�er i�lemlerin onunla e�zamanl� �al��abilmesi i�in bir semafor y�netmesi gerekir. S�n�rl�d�r ��nk� i�lemler aras�nda parametre de�i�imine izin vermez. Bir i�lemin olu�ma �rne�ine bakal�m:Bu olay �al��an b�t�n i�lemler taraf�nda bilinmelidir ama semafor bu t�r bilgilerin g�nderilmesine izin vermez.

Payla��lm�� kaynaklara semafolarla ula��m�n e�zamanl� kontrol�, bizi, bir i�lemin s�rekli t�kamas�na g�t�r�r: Bir i�lem i�in i�ine girdi�inde kayna�� b�rak ve di�erleri kullanmadan onu kilitle.G�rd���m�z gibi e�zamanl� programlama d�nyas�nda hangi i�lemin ne zaman �al��t�r�laca��n� �ok iyi bilemiyoruz.

Bu k�sa a��klamadan da anla��laca�� gibi semaforlar karma��k e�zamanlama sorunlar� i�in yetersizdir.Daha ��k bir ��z�m ileti kuyruklar�d�r.Bu makalede i�lemleraras� ileti�im imkan� teorisini i�leyece�iz ve SysV fonksiyonlar�n� kullanarak k���k bir program yazaca��z.

 

�leti Kuyru�u Teorisi

Her i�lem bir veya daha fazla kuyruk ad� verilen yap� olu�turabilir:Her yap� bir ya da daha fazla de�i�ik tiplerde ileti tutabilir .Bu iletiler de�i�ik kaynaklara sahiptirler ve her durumun bilgileri i�erirler; herkes iletileri kendi belirtecini sa�lad��� kuyruklara g�nderebilir. �leti, kuyru�a s�rayla ba�lan�r, bilgileri kronolojik olarak okur (en eskiden en yeniye) fakat se�icidir,yani sadece belirli bir tipte olan iletileri okur:Bu son �zellik okudu�umuz iletinin �nceli�inin bir nevi kontrol�n� verir.

�letilerin kullan�m�,i�lemler aras�ndaki posta sisteminin basit bir uygulamas�d�r.�leti kendi kutusuna gelmi� olan postay� �nerilen s�rada al�r ve postada s�ylenileni yapar.

�ki i�lemin e�zamanlamas� basit olarak iki i�lem aras�nda bir iletinin kullan�lmas�yla yap�l�r:Kaynaklar hala kendi durumlar�n� i�lemlere bildiren bir semafora sahip olacaklar ancak zamanlama do�rudan yap�lacak.Art�k ba�lang��ta �ok karma��k olan bir sorunun ileti kuyru�u kullanarak basitle�ti�ini anl�yoruz.

C dili ile ileti kuyru�u programlamaya ba�lamadan �nce e�zamanlamayla ilgili bir sorun hakk�nda konu�al�m:�leti�im protokol� gereksinimi

 

Bir Protokol Olu�turma

Protokol, bir k�medeki elemanlar�n etkile�imlerini kontrol eden bir kurald�r; son makalede, en basit protokol� g�rd�k:Bir semafor olu�turma ve iki i�lemin di�erinin durumuna bakarak �al��mas�.�leti kuyru�unun kullan�m� �ok karma��k protokollerin uygulanmas�na izin verir: B�t�n a� protokollerinin (TCP/IP, DNS, SMTP,...) ve hatta iki bilgisayar aras�ndaki ilet�iminin, ileti de�i�im mimarisi �zerine kurulu oldu�unu d���nmek yeterlidir. Bir bilgisayar i�inde olan veya daha fazlas�n�n aras�nda olan i�lemleraras� ileti�im aras�nda bir fark yoktur.�leride de g�rece�imiz gibi, �u an konu�tu�umuz kavram� yaymak �ok kolay bir i� olacakt�r.

Bu basit protokol �rne�i ileti de�i�imi temeline dayan�r:A ve B i�lemi e�zamanl� �al���r ve farkl� verileri kullan�r;�al��may� bitirdiklerinde sonu�lar�n� birle�tirirler.Birbirleriyle etkile�imlerini d�zenleyen protokol a�a��daki gibi olabilir:

��LEM B:


��LEM A

Bu durumda kimin verileri birle�tirece�i tamamen keyfidir; genel olarak i�in i�ine kar��an i�lemin do�as�na dayan�r (sunucu/istemci) ama bu daha �zel bir makalenin konusudur.

Bu protokol kolayca n adet i�leme geni�letilebilir: A d���ndaki her i�lem kendi verisiyle �al���r ve A'ya ileti g�nderir.A yan�t verdi�inde, her i�lem kendi sonucunu g�nderir: A d���ndaki l�lemlerin yap�s� hen�z de�i�medi.

 

Sistem V �leti Kuyruklar�

Art�k bu kavramlar� Linux alt�nda uygulama zaman� geldi. Daha �nce de s�yledi�im gibi, semaforlar�n y�netimine benzer fonksiyonlar ileti kuyruklar� i�in de vard�r:Okuyucunun i�lem olu�turma, sistem �a�r�lar�n�n kullan�m� ve IPC anahtarlar� gibi temel konular� bildilerini varsay�yorum.

Bir iletiyi tan�mlayan sistemin temel yap�s�na msgbuf denir.Bu linux/msg.h i�inde tan�mlanm��t�r.

/* msgsnd ve msgrcv �a�r�lar� i�in ileti tamponu*/
struct msgbuf {
        long mtype;         /* ileti tipi*/
        char mtext[1];      /* ileti metni*/
};

mtype alan�, iletinin tipini temsil eder ve zorunlu olarak pozitif de�erdir:Say�lar ile ileti tipleri aras�ndaki ili�ki daha �nceden tan�mlanmal�d�r ve protokol tan�mlamas�n�n bir par�as�d�r.�kinci k�s�m, iletinin i�eri�ini tutar ama tan�mlama s�ras�nda belirlenmek zorunda de�ildir. msgbuf yap�s� karma��k verileri tutabilecek �ekilde yeniden tan�mlanabilir.�ne�in �unu yazmak m�mk�nd�r:
struct message {
        long mtype;         /* ileti tipi*/
        long sender;        /* g�nderenin id'si*/
        long receiver;      /* al�c�n�n id'si*/
        struct info data;   /* iletinin i�eri�i*/
        ...
};

Tam olarak e�zamanlama teorisinin arg�malar�yla y�zle�meden �nce, maksimum boyuta (4056 byte) sahip bir iletinin nas�l olu�turulaca��n� d���nmeliyiz. A��k�a g�r�ld��� gibi kerneli bu boyutu art�r�p tekrar derleyebiliriz.Ancak bu uygulamam�z� biraz b�y�t�r (dahas�, bu de�er olduk�a iyi performans g�stercek bir de�ere e�itlenmi�tir ve bu de�eri b�y�tmek iyi de�ildir).

Yeni bir kuyruk olu�turmak i�in �u fonksiyonu �a��rmek gerekir: msgget()

int msgget(key_t key, int msgflg)
Bu fonksiyon bir IPC anahtar� ve baz� bayraklar� arg�man olarak al�r. Bu bayraklar� �imdilik �u de�ere e�itleyebiliriz:
IPC_CREAT | 0660
(e�er bu kuyruk yoksa olu�tur; kullan�c� ve gruba kullanma hakk� ver). Fonsiyon kuyruk belirtecini geri d�nd�r�r.

Daha �nceki makalede oldu�u gibi hi� hata olmayaca��n� varsay�yoruz.B�ylece kodu basitle�tirebiliriz ve hatta ileriki makalelerde g�venli IPC kodlar�nda bahsedebiliriz.

Belirtecini bildi�imiz bir kuyru�a bir ileti g�ndermek i�in �u fonksiyonu kullan�r�z: msgsnd()

int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg)

Burada msqid kuyru�un belirtecidir, msgp g�nderece�imiz iletinin g�stericisidir (burada tipi struct msgbuf olarak verilmi�tir), msgsz iletinin boyutudur ( mtype 'n�n uzunlu�u hari�tir.Bir long tipini uzunlu�udur ve genelde 4 byted�r) ve msgflg bekleme politikas�yla alakal� bir bayrakt�r.�letinin uzunlu�u �u �ekilde bunabilir:
length = sizeof(struct message) - sizeof(long);

E�er msgflg IPC_NOWAIT de�erine e�itlenmi�se, g�nderici i�lem baz� bo�luklar�n durumlar� uygun olana kadar beklemeyecek ve bir hata verip ��kacakt�r; Bu konuyu hata y�netimi ba�l�� alt�nda inceleyece�iz.

Bir kuyruktaki iletiyi okyabilmek i�in �u fonksiyonu kullan�r�z: msgrcv()

int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long mtype, int msgflg)


Burada msgp okunacak iletinin nereye kopyalanaca�� belirtir. mtype ilgilendi�imiz ileti altk�mesini g�sterir.

Bir kuyru�u silmek i�in �u fonksiyondan IPC_RMID bayra�� yard�m�yla faydalan�r�z: msgctl()

msgctl(qid, IPC_RMID, 0)

�imdiye kadar s�ylediklerimizi bir program ile test edelim.Bu program bir ileti kuyru�u olu�turur, bir ileti g�nderir ve onu okur.. Do�ru �al��an bir sistemi kontrol edece�iz.
#include <stdio.h>
#include <stdlib.h>
#include <linux/ipc.h>
#include <linux/msg.h>

/* msgbuf yap�s�n� tekrar tan�mlar*/
typedef struct mymsgbuf
{
  long mtype;
  int int_num;
  float float_num;
  char ch;
} mess_t;

int main()
{
  int qid;
  key_t msgkey;

  mess_t sent;
  mess_t received;

  int length;

  /* pseuo-rastgele say� �reteci
	�ekirde�ini ba�lat�r*/
  srand (time (0));

  /* iletinin uzunlu�u */
  length = sizeof(mess_t) - sizeof(long);

  msgkey = ftok(".",'m');

  /* Kuyru�u olu�turur*/
  qid = msgget(msgkey, IPC_CREAT | 0660);

  printf("QID = %d\n", qid);

  /* Bir ileti olu�turur*/
  sent.mtype = 1;
  sent.int_num = rand();
  sent.float_num = (float)(rand())/3;
  sent.carattere = 'f';

  /* bir ileti g�nderir*/
  msgsnd(qid, &sent, length, 0);
  printf("�LET� G�NDER�LD�...\n");

  /* Bir ileti al�r*/
  msgrcv(qid, &received, length, sent.mtype, 0);
  printf("ALINAN �LET�...\n");

  /* Al�nan ve g�nderilen iletilerin
	ayn� olup olmad���n� kontrol eder*/
  printf("Tamsay� = %d (sent %d) -- ", received.int_num,
         sent.int_num);
  if(received.int_num == sent.int_num) printf(" Tamam\n");
  else printf("HATA\n");

  printf("Ondal�k say� = %f (sent %f) -- ", received.float_num,
         sent.float_num);
  if(received.float_num == sent.float_num) printf(" Tamam\n");
  else printf("HATA\n");

  printf("Char = %c (sent %c) -- ", received.ch, sent.ch);
  if(received.ch == sent.ch) printf(" TAMAM\n");
  else printf("HATA\n");

  /* Kuyru�u yok et*/
  msgctl(qid, IPC_RMID, 0);
}

�imdi iki i�lem olu�turabilir ve onlar� ileti kuyru�u ile ileti�im i�ine koyabiliriz.Birazc�k i�lem b�lme kavram�n� d���nelim:Baba i�lem taraf�ndan tutulan b�t�n de�i�kenlerin de�erleri o�ul i�lemlere ta��n�r (bellek kopyalama). Baba ve o�ul i�lemlerin belirtecini bildikleri ve ula�abildikleri bir ileti kuyru�unu i�lemi b�lmeden �nce olu�turmal�y�z.

Yazd���m kod o�ul ile�im verisini baba i�leme g�nderdi�i bir ileti kuyru�u kullan�r.O�ul i�lem rastgele say�lar �retir ve bu babaya g�nderir.Ard�ndan her ikisi de bu say�lar� ekrana yazarlar.

#include <stdio.h>
#include <stdlib.h>
#include <linux/ipc.h>
#include <linux/msg.h>
#include <sys/types.h>

/* ileti yap�s�n� tekrar tan�mlar*/
typedef struct mymsgbuf
{
  long mtype;
  int num;
} mess_t;

int main()
{
  int qid;
  key_t msgkey;
  pid_t pid;

  mess_t buf;

  int length;
  int cont;

  length = sizeof(mess_t) - sizeof(long);

  msgkey = ftok(".",'m');

  qid = msgget(msgkey, IPC_CREAT | 0660);

  if(!(pid = fork())){
    printf("BABA - QID = %d\n", qid);

    srand (time (0));

    for(cont = 0; cont < 10; cont++){
      sleep (rand()%4);
      buf.mtype = 1;
      buf.num = rand()%100;
      msgsnd(qid, &buf, length, 0);
      printf("O�UL - �LET� NUMARASI %d: %d\n", cont+1, buf.num);
    }

    return 0;
  }

  printf("BABA - QID = %d\n", qid);

  for(cont = 0; cont < 10; cont++){
    sleep (rand()%4);
    msgrcv(qid, &buf, length, 1, 0);
    printf("BABA - �LET� MUMARASI %d: %d\n", cont+1, buf.num);
  }

  msgctl(qid, IPC_RMID, 0);

  return 0;
}

Burada iki i�lem olu�turduk.Bu i�lemler ileti de�i�im sistemi arac�l��� ile birlikte �al��abiliyorlar.Burada bir protokole gereksinim duymad�k ��nk� i�lemler �ok basit.Sonraki makalede yine ileti kuyruklar�ndan bahsedece�iz ve de�i�ik ileti tiplerini y�netece�iz.Kendi IPC projemizi (telefon anahtarlama sim�lat�r�) oluturabilmek i�in ileti�im protokolleri �zerinde daha �ok �al��aca��z.  

�nerilen Kaynaklar

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Leonardo Giordani, FDL
LinuxFocus.org
�eviri bilgisi:
it --> -- : Leonardo Giordani <leo.giordani(at)libero.it>
it --> en: Leonardo Giordani <leo.giordani(at)libero.it>
en --> tr: Özcan Güngör <ozcangungor(at)netscape.net>

2003-03-11, generated by lfparser version 2.35