Üye Kayıt Üye Giriş

Ortak Bellek Alanlarının Kullanımı


Ortak Bellek Alanlarının Kullanımı

 

 

Farklı process’lerin farklı doğrusal adreslerde aynı fiziksel RAM bloğunu görmelerine ortak
bellek alanları (shared memory) denilmektedir. Bu konu Win32 sistemlerinde “bellek tabanlı
dosyalar (memory maped file)” ismiyle çok benzer biçimde bulunmaktadır. Sanal bellek
kullanabilen bir işlemcinin tipik olarak fiziksel RAM’e erişmesi iki aşamada yapılmaktadır.


1) Program içerisinde kullanılan bütün adresler doğrusal adreslerdir (linear address).
Doğrusal adresler process’e özgüdür, her process’in doğrusal adresleri diğerlerinden
ayrılmıştır.
2) Doğrusal adresler işlemci tarafından sayfa tablosu (page table) denilen bir tabloya
bakılarak fiziksel adrese dönüştürülmektedir.
Sayfa tablosu tipik olarak şöyle bir görünümdedir:


Doğrusal
Adres
Fiziksel
Adres


0 41
1 53
2 56
3 -
4 -
5 93
... ...


Burada –‘ler ile gösterilen alanlar commit edilmiş ancak fiziksel RAM’de yer bulamamış
sayfalardır. Bir alanın commit edilmiş olması demek, orası için swap dosyasında yer ayrılmış
ama fiziksel RAM’de yer ayrılmamış olması demektir. Commit edilmiş sayfalara erişildiğinde
sayfa fiziksel RAM’de yoksa işlemci tarafından kesme çağırılır işletim sistemi de erişilen
bölgenin commit edilmiş olup olmadığına bakar, onun için fiziksel RAM’de bir sayfa ayarlar.
Sonra sayfa tablosunda güncellemeyi yapar ve çalışma kesiksiz olarak devam eder. Eğer
erişilen bölge commit edilmemişse bu durumda Win32 sistemlerinde process sonlandırılır,
UNIX sistemlerinde önce SIGSEGV signal’ı gönderilir, sonra process sonlandırırlır.


shmget Fonksiyonu
Bu fonksiyon ortak bellek alanı yaratmakta kullanılır.
int shmget(key_t key, int size, int flag);
Fonksiyonun birinci parametresi IPC anahtar numarasıdır. İkinci parametre ortak bellek
alanının byte cinsinden büyüklüğünü belirtir. Daha önce yaratılmış ortak bellek alanını
kullanmak istiyorsak size belirtilmeyebilir, yani 0 geçilebilir. Aslında ortak bellek alanı daha
önce yaratılmışsa fonksiyonun bu parametresi dikkate alınmamaktadır. flag parametresi diğer
IPC nesnelerinde olduğu gibi IPC_CREAT ve IPC_EXCL kombinasyonu birleşiminden
oluşabilir. Ayrıca nesne yaratılırken erişim modu da or’lanarak flag’de belirtilmelidir.
Fonksiyon başarılı ise IPC ID değerine başarısızsa –1 değerine geri dönmektedir.
Ortak bellek alanına ilişkin ID elde edildikten sonra artık bunu gerçek anlamda bellekte
oluşturmak gerekir. Bu işlem shmat fonksiyonu ile yapılır.


shmat Fonksiyonu
void *shmat(int shmid, void *addr, int flag);
Fonksiyonun birinci parametresi shmget fonksiyonundan elde edilen ID değeridir.
Fonksiyonun ikinci parametresi ortak bellek alanının process’in bellek alnındaki doğrusal
başlangıç adresini belirlemekte kullanılır. Bu adres NULL olarak geçilirse doğrusal adreste
nerenin tahsis edileceği sisteme bırakılır. Eğer NULL geçilmeyip bir adres değeri geçilirse
sistem tahsisatı o doğrusal adresten başlayarak yapmaya çalışır. Ancak bu mümkün
olmayabilir, o zaman fonksiyon başarısız olur. Fonksiyonun flag parametresi SHM_RND ya
da SHM_RDONLY olabilir. Ya da hiç bir belirleme yapılmayacaksa bu parametre 0 olarak
geçilebilir. Fonksiyonun ikinci parametresine bir adres girilmiş ve üçüncü parametresi
SHM_RND biçimindeyse bu durumda belirtilen adres sayfa büyüklüğüne aşağıya doğru
yuvarlanır. Fonksiyonun geri dönüş değeri başarılı ise tahsis edilen doğrusal adres alanının
başlangıç adresi, başarısız ise ((void *) –1) değeridir. (Bu değer aynı zamanda Windows’taki
INVALID_HANDLE_VALUE değeridir.)


shmdt Fonksiyonu
Ortak bellek alnına ilişkin IPC nesnesi yaratılıp doğrusal adres alanına bağlandıktan sonra
istenirse bu fonksiyonla doğrusal adres alanındaki bağlantı yeniden koparılabilir.
int shmdt(void *add);
Fonksiyon doğrusal adrese bağlanan ortak bellek alanının başlangıç adresini parametre olarak
alır ve bu bağlantıyı koparır. Bağlantılar koparılsa da IPC nesnesi yaşamaya devam eder.
Process sonlanırken zaten bu koparılma işlemi sistem tarafından gerçekleştirilmektedir. Ortak
bellek alanlarını kullanabilmek için sys/types.h, sys/ipc.h, sys/shm.h dosyaları include
edilmelidir.
Örnek uygulama: Bu uygulamada shm1.c programı bir ortak bellek alanı yaratacak ve
buraya bir bilgi yerleştirecektir. shm2.c process’i de bu bilgiyi ortak bellek alanından
alacaktır.


/* shm1.c */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_KEY_VALUE 1234567
int main(void)
{
char *padr;
int shmid;
if ((shmid = shmget(SHM_KEY_VALUE, 1024, IPC_CREAT|0666)) < 0) {
perror("shmget");
exit(1);
}
if ((padr = (char *) shmat(shmid, NULL, 0)) == (void *) -1) {
perror("shmat");
exit(1);
}
strcpy(padr, "shared memory");
for (;;) {
if (*padr == 'q')
break;
sleep(1);
}
shmdt(padr);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
/* shm2.c */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_KEY_VALUE 1234567
int main(void)
{
char *padr;
int shmid;
if ((shmid = shmget(SHM_KEY_VALUE, 0, 0666)) < 0) {
C ve Sistem Programcıları Derneği 116
perror("shmget");
exit(1);
}
if ((padr = (char *) shmat(shmid, NULL, 0)) == (void *) -1) {
perror("shmat");
exit(1);
}
puts(padr);
*padr = 'q';
shmdt(padr);
return 0;
}

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

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

ETİKETLER