💻 Bilgisayar, 💾 Programlama

C’de Processler ve vfork()

Bu sene Doç. Dr. Aylin Kantarcı hocamızın verdiği İşletim Sistemleri 2 dersinde, süreçleri (processler) ve nasıl işlediklerini ayrıntılı bir şekilde öğrendik.

Bize verilen ödevde, iki matrisin çarpma işleminin her satırını bir sürece yaptıracağımız bir program istendi. Ödevin daha sonra değiştirilen ve kontrolü iptal edilen ilk sürümünde, henüz IPC’leri görmediğimizden süreçler arası bilgi aktarımını süreçleri aynı adres sahasında farklı program counterlar ile çalıştırarak sağlamıştık. (vfork)

Zaten sonra IPC’lere dönüştürmek 15 dakikamı ya aldı ya almadı.

Vfork bir linux sistem çağrısıdır. (system call) Onun için aşağıdaki kod Windows’ta çalışmaz.

Kaynak kodlarını, örnek girdi dosyasını ve ödev metnini aşağıdan indirebilirsiniz. Kaynak kodunu indirmek istemezseniz yazının devamına göz atabilirsiniz.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main() {

    /* Acilis yazilari BASLANGICI */
    printf("Umut BENZER\n");
    printf("05-06-7670\n");
    printf("Ege Universitesi Bilgisayar Muhendisligi 3. Sinif\n");
    printf("https://ubenzer.com\n");
    printf("Processes\n\n");
    /* Acilis yazilari SONU */

    int m;
    int n;
    int k;

    int pid;
    pid = fork();

    if (pid == 0) {
        /* B süreci */
        FILE *fp;
        if((fp=fopen("input.txt","r")) == NULL) {
            printf ("Dosya acilamadi.");
            exit(-1);
        }

        fscanf(fp,"%d %d %d",&m, &n, &k);

        int matrisA[m][n];
        int matrisB[n][k];
        int matrisC[m][k];

        int i;
        int j;

        for(i=0;i<m;i++) {
             for(j=0;j<k;j++) {
                matrisC[i][j] = 0;
            }
        }

        /* A MATRISINI OKU */
        for(i=0;i<m;i++) {
            for(j=0;j<n;j++) {
                fscanf(fp,"%d",&matrisA[i][j]);
            }
        }

        /* B MATRISINI OKU */
        for(i=0;i<n;i++) {
            for(j=0;j<k;j++) {
                fscanf(fp,"%d",&matrisB[i][j]);
            }
        }

        fclose(fp);

        /* EKRANA MATRISLERI YAZDIR */
        printf("Matris A:\n");
        for(i=0;i<m;i++) {
            for(j=0;j<n;j++) {
                printf("%d\t", matrisA[i][j]);
            }
            printf("\n");
        }

        printf("\nMatris B:\n");
        for(i=0;i<n;i++) {
            for(j=0;j<k;j++) {
                printf("%d\t", matrisB[i][j]);
            }
            printf("\n");
        }

        int pidler[m];
        for(i=0;i<m;i++) {
            pidler[i] = vfork();
            if (pidler[i] == 0) {

                int ic1,ic2;
                for(ic1=0; ic1<k; ic1++) {
                    for(ic2=0; ic2<n; ic2++)  {
                        matrisC[i][ic1] += matrisA[i][ic2] * matrisB[ic2][ic1];
                    }
                }

                exit(0);

            } else if(pid < 0){
                fprintf(stderr, "Fork yapamadim. %d\n", errno);
                exit(EXIT_FAILURE);
            }
        }
        for(i=0;i<m;i++) {
            wait(pidler[i]);
        }

        printf("\nMatris C:\n");
        for(i=0;i<m;i++) {
            for(j=0;j<k;j++) {
                printf("%d\t", matrisC[i][j]);
            }
            printf("\n");
        }
        exit(0);

    } else if (pid > 0) {
        wait();
    } else {
        fprintf(stderr, "Fork yapamadim. %d\n", errno);
        exit(EXIT_FAILURE);
    }
}
👋 🚨 Yeni yazılardan haberdar olmak ister misiniz? 👇

C’de Processler ve vfork() bir yorum aldı.

  1. Sizin ödev basitmiş…:) Bir de bizimkisine bir bakınız…"Aman hocam kavur balıkları,akşama getireceğim kabadayıları" cinsinden:)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir