İşletim Sistemleri Sınava Yönelik Çalışma Soruları

 

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);
        }

 

3 comments

  1. 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?

  2. Şö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.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir