|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Russian Turkce |
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)�zet: Bu makale Bu makalenin anla��labilmesi i�in �n ko�ullar �unlard�r:
LinuxFocus'un son iki say�s�nda yay�nlanan makaleleri okumak yararl� olacakt�r (Kas�m2002 ve Ocak2003). |
��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.
�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
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:
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.
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*/ };
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*/ ... };
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)
length = sizeof(struct message) - sizeof(long);
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)
Bir kuyru�u silmek i�in �u
fonksiyondan IPC_RMID bayra�� yard�m�yla faydalan�r�z:
msgctl()
msgctl(qid, IPC_RMID, 0)
#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); }
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; }
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Leonardo Giordani, FDL LinuxFocus.org |
�eviri bilgisi:
|
2003-03-11, generated by lfparser version 2.35