Üye Kayıt Üye Giriş

Processlerarası Haberleşme ve Senkronizasyon Konusundaki SystemV ve POSIX Farklılıkları


Processlerarası Haberleşme ve Senkronizasyon Konusundaki SystemV ve POSIX
Farklılıkları

 

 

Processlerarası haberleşme ve senkronizasyon konusunda Unix/Linux programcıları için iki
seçenek söz konusudur:
1) Oldukça yaygın olarak bilinen SystemV fonksiyonlarını kullanmak. Bu fonksiyonlar
AT&T Unix sistemleri tarafından tasarlanmıştır, ama sistemlerin hemen hepsinde geçerli
olarak kullanılmaktadır.
2) POSIX standartlarında belirtilen fonksiyonlardır. Bu fonksiyonlar daha taşınabilir ve daha
iyi tasarlanmış olmalarına karşın daha az kişi tarafından kullanılmaktadır.

POSIX standartlarının birincisi yani POSIX.1 ya da 1003.1 Unix sistemlerindeki sistem
fonksiyonlarını tanımlar. POSIX.2 shell programlarına ilişkin standarttır. POSIX.3 test
yöntemlerine ilişkin belirlemeleri içerir. 1993-94 senelerinde POSIX fonksiyonlarına yeni
eklemeler yapılmıştır. Bu eklemelerin numaralandırılması konusunda anlaşmazlıklar
çıkmıştır. Eklemeler üç aşamada gerçekleştirilmiştir. Bir grup bu eklentileri POSIX.1.b,
POSIX.1.c, POSIX.1.d biçiminde, bir grup ise POSIX.4.a, POSIX.4.b ve POSIX.4.c
biçiminde isimlendirmiştir. Sonradan yapılan bu eklemelerin bazıları şunlardır:
- thread fonksiyonları
- paylaşılan bellek alanı (shared memory) ve mesaj kuyrukları
- mutex ve semaphore’lar
- diğer bazı konular...


Process’lerarası haberleşme ve senkronizasyon konusunda yalnızca pipe kullanımı SystemV
ve POSIX standartlarında ortaktır. Bu zamana kadar görülmüş olan shared memory ve mesaj
kuyrukları SystemV’e özgü olanlardır, çünkü bu konuda SystemV fonksiyonları çok daha
yaygın kullanılmaktadır, ancak maalesef SystemV’in semaphore fonksiyonları POSIX
biçimlerine göre oldukça kullanışsızdır.


SystemV’in senkronizasyon nesneleri key_t türünden sayılarla teşhis edilmektedir. Yani bu
yönteme göre farklı procesler aynı sayıyı verirlerse aynı senkronizasyon nesneleri üzerinde
işlem yaparlar. İsimli pipe kullanımında istisna olarak bir dosya ismi temasının geçtiğini
görüyoruz. İşte POSIX’in bütün senkronizasyon nesneleri isimli pipe’larda olduğu gibi bir
dosya ismi ile teşhis edilmektedir. POSIX’in senkronizasyon nesneleri için verilecek dosya
isimleri POSIX standartlarına göre root dizininde olmalıdır. Standartlara göre bu isim ‘/’ ile
başlar, fakat root’un altındaki başka bir dizinle devam ederse ne olacağı, yani işlemin geçerli
olup olmayacağı işletim sistemini yazanlara bırakılmıştır. Maalesef bazı sistemlerde normal
bir kullanıcının root dizinine yazma hakkı yoktur. Bu durumda standartlardaki durum hepten
belirsiz hale gelmiştir. Yapılacak en iyi şey önce root üzerinde isimleri yaratmaya çalışmak,
eğer bu mümkün olamıyorsa alt dizinler üzerinde işlemlere devam etmektir.


POSIX Semaphore’ları
POSIX semaphore sistemi tıpkı pipe’larda olduğu gibi isimli ve isimsiz olmak üzere iki
gruptur. İsimsiz semaphore’lar aynı process’in threadleri arasında, isimli semaphore’lar farklı
process’lerin thread’leri arasında kullanılabilirler.
İsimsiz POSIX Semaphore’ları
İsimsiz semaphore’lar şu fonksiyonlarla kullanılır:
sem_init
sem_destroy
sem_wait
sem_post
sem_trywait

sem_init semaphore’u yaratır; sem_destroy yok eder; sem_wait semaphore sayacına bakar,
sayaç 0 ise thread’i bloke eder, sayaç 0’dan büyükse sayacı 1 azaltarak akışı devam ettirir;
C ve Sistem Programcıları Derneği 150
sem_post ise sayacı artırmaktadır; sem_trywait bloke etmeden giriş hakkı kontrolü
yapmaktadır. Bu durumda kritik kod aşağıdaki gibi oluşturulmalıdır:
sem_init(....);
...
sem_wait(....);
...
/* Kritik kod */
...
sem_post(....);
...
sem_destroy(....);

Aynı işlemler Win32 sistemlerinde şöyle yapılmaktadır:
CreateSemaphore(....);
...
WaitForSingleObject(....);
...
/* Kritik kod */
...
ReleaseSemaphore(....);
...
CloseHandle(....);

İsimsiz POSIX semaphore fonksiyonlarının prototipleri şöyledir:
int sem_init(sem_t *sem, int pshared, unsigned value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);


pshared mutex’lerde olduğu gibi semaphore’un processler arasında paylaşılıp
paylaşılmayacağını belirlemekte kullanılır. Bu değer 0 olarak geçilirse böyle bir paylaşım söz
konusu olmaz. Eğer bu parametre PTHREAD_PROCES_SHARED biçiminde geçilirse
processler arası paylaşım gerçekleşir. sem_init fonksiyonunun value parametresi (üçüncü
parametre) semaphore sayacının başlangıç değeridir.


sem_t genellikle bir yapı biçiminde olan türdür. Sistemin tipik kullanımı şöyledir:
sem_t *sem;
sem_init(sem, 0, 2); // Kritik koda aynı anda iki thread girebilecektir..
...
...
sem_wait(sem);
...
...
sem_post(sem);
...
...
sem_destroy(sem);

Semaphore’un sayaç değeri istenildiği zaman sem_getvalue fonksiyonuyla alınabilir.


int sem_getvalue(sem_t *sem, int *sem_value);

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER