Merhaba arkadaşlar. İşletim sistemleri dersine yönelik çalışma soruları olan
1) 0 ile 1 Milyon arasını 4 thread e bölerek onlara işlem yaptıran yazılım ve
2) Kullanıcıdan istenilen sayıya kadar olan çift ve tek sayıları threadlere toplatan yazılımı açıklamaları ile paylaşıyorum.
Umarım yararlı olur. Hepinize iyi çalışmalar.
1. Yazılım
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #define THREAD_SAYISI 4 #define DIZIBOYUTU 1000000 #define ITERASYONLAR DIZIBOYUTU/THREAD_SAYISI // HER THREAD NERDEN BASLIYIP NEREYE KADAR GIDECEK BUNU BELIRLEYECEK double sum = 0.0, a[DIZIBOYUTU]; pthread_mutex_t sum_mutex; //sum global bir değişken o yüzden koruma altına almam lazım void *is_yap(void *tid) { int i, start, *mytid, end; double mysum=0.0; /* kendime ait toplama kısmını yapıyorum*/ mytid = (int *)tid; start = (*mytid * ITERASYONLAR); end = start + ITERASYONLAR; printf("Thread %d , %d ile %d arasını topluyor\n",*mytid,start,end-1); for(i = start; i<end; i++) { a[i] = i * 1.0; mysum = mysum + a[i]; //mysum = mysum + i; de diyebiliriz. bunu geri kontrol etmek amaçlı böyle yatık } /* Toplama sonucunu yazarken rahatsiz etme */ pthread_mutex_lock(&sum_mutex); sum = sum + mysum; pthread_mutex_unlock(&sum_mutex); pthread_exit(NULL); } int main() { int i,start; pthread_t threads[THREAD_SAYISI]; pthread_mutex_init(&sum_mutex, NULL); for(i=0; i<THREAD_SAYISI; i++) { int *id = (int *)malloc(sizeof(int)); *id=i; pthread_create(&threads[i],NULL,is_yap,(void*)id); } for(i=0; i<THREAD_SAYISI;i++) { pthread_join(threads[i],NULL); } printf("Bitti. Toplam = %e \n",sum); //toplam sonuç kontrol double sum1=0.0; for(i=0;i<DIZIBOYUTU;i++) { sum1 = sum1 + a[i]; } printf("Kontrol: Toplam: %e\n",sum1); pthread_mutex_destroy(&sum_mutex); pthread_exit(NULL); } |
2. Yazılım
#include <iostream> #include <pthread.h> using namespace std; void *tekSayiTopla(void *); void *ciftSayiTopla(void *); int main() { int sayi; pthread_t th1, th2; cout<<"Bir sayi giriniz"<<endl; cin>>sayi; pthread_create(&th1,NULL,tekSayiTopla,(void *)&sayi); pthread_create(&th2,NULL,ciftSayiTopla,(void *)&sayi); void *vpr1; void *vpr2; pthread_join(th1,&vpr1); pthread_join(th2,&vpr2); int tek_sayi_sonuc = *(int *)vpr1; int cift_sayi_sonuc = *(int *)vpr2; cout<<"Tek sayilar toplami + cift sayilar toplamı = "<<tek_sayi_sonuc<< " + "<<cift_sayi_sonuc<<" = "<<tek_sayi_sonuc+cift_sayi_sonuc; return 0; } void *tekSayiTopla(void *x) { int *ptr; ptr = new int; //Dinamik bellek yonetimi yapiyoruz int a = *(int *)x; //gelen x i integer yaptik int i; *ptr = 0; for(i=1;i<=a;i=i+2) { *ptr = *ptr+i; } pthread_exit((void *)ptr); } void *ciftSayiTopla(void *y) { int *ptr2; ptr2 = new int; //Dinamik bellek yonetimi yapiyoruz int b = *(int *)y; //gelen x i integer yaptik int o; *ptr2 = 0; for(o=0;o<=b;o=o+2) { *ptr2 = *ptr2+o; } pthread_exit((void *)ptr2); } |
int main(){
fork();
fork();
fork();
printf(“soru3 b\n”);
}
İLE
int main(){
if(fork())
if(fork())
if(fork())
printf(“soru3 b\n”);
}
bu iki sorunun farkı nedir acaba?
printf(“soru3\n”); iki soru için de 3 fork un bitiminde yer alıyor
Şöyle ki;
fork() dediğim şey bir 2 tane proses oluşturur. Birisi anne diğeri çocuk. fork()’un altında kalan işlemler 2 kere yapılmış olur anne ve çocuk tarafından. anna => 1 + çocuk => 1 toplam 2 kere yapılmış olur.
Birinci soruda 3 tane fork() oluşturmuş. 1. fork()’ta anne ve çocuk; daha sonraki fork()’ta 1. fork()’un anne’sinden 2 tane çocuğundan 2 tane; en sondaki fork()’ta 4 tane oluşmuştu onların her birinden de 2 tane daha oluşacağı için toplamda elimde 8 tane proses oluşmuş olur. Bu 8 tane prosesin her biri soru 3b yazdıracaktır.
İkinci soruda ise if(fork()) dediğim şey aslında if(fork() != 0) ‘dur. Bu ne demek? Bu, eğer anne proses oluşmuşsa demek. Bu durumda ben 3 tane hali hazırda prosesin içine girmiş oluyorum. 3 if(fork()) olduğu için. Bu da 3 kere yazılması demek “soru3 b” ‘nin.