OPERACIJSKI SUSTAVI - 1. KOLOKVIJ 24.11.2001.

Zadatak 1 Što (najvjerojatnije) ispisuje donji programi i što bi ispisao program kad bi se odkomentirale naredbe za rad s mutexima. Detaljno objasnite zbog čega se njihov ispis razlikuje.

#include<stdio.h>
#include<pthread.h>
#define D 5
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int A = 0;
void *thread_function (void *arg) {
int i, x, n;
n = (int) arg;
//  if (pthread_mutex_lock(&mutex)) error("Error in mutex_lock!");
for (i=0; i<n; i++)
{
    x=A;
    x=x+1;
    if (n%2) sleep (1);
    A=x;
}
//  if (pthread_mutex_unlock(&mutex)) error("Error in mutex_unlock!");
}
void main (void) {
pthread_t t_id[D];
int arg;
int i;
//  if (pthread_mutex_init(&mutex, NULL)) error("Error in mutex_init!");
for (i=0; i<D; i++)
{
        arg=i+1;
        if (pthread_create(&t_id[i], NULL, &thread_function, (void*)arg))
        {
                printf("Error in creating %d. thread!", i);
                exit(1);
        }
}
for (i=0; i<D; i++)
{
        if (pthread_join(t_id[i], NULL))
        {
                printf("Error in termination of %d. thread!", i);
                exit(1);
        }
}
//  if (pthread_mutex_destroy(&mutex)) error("Error in mutex_destroy!");
printf ("A = %d\n", A);
}

Zadatak 2 Napišite Dekkerov postupak za medusobno isključivanje dviju dretvi i ukratko ga objasnite.

Zadatak 3 Sustav dretvi se sastoji od 7 dretvi D_{i}, i ∈ {1, 2, 3, 4, 5, 6, 7}. Relacija ”treba se dogoditi prije” definirana je za sljedeće parove dretvi:

D_{1} < D_{j} j ∈ {2, 3, 4, 5, 6, 7}
D_{2} < D_{j} j ∈ {2, 3, 4, 5, 7}
D_{3} < D_{j} j ∈ {4, 7}
D_{5} < D_{j} j ∈ {3, 4, 7}
D_{6} < D_{j} j ∈ {7}

a) Objasnite pojmove ”medusobno zavisni” i ”medusobno nezavisni” zadaci u višedretvenom modelu, i izrecite uvjet medusobne nezavisnosti.

b) Nacrtajte pripadni usmjeravajući graf.

c) Napišite sve parove nezavisnih dretvi.

Zadatak 4 Napišite program koji množi dvije kvadratne matrice reda n u 4 dretve.(Svaka dretva računa svoj dio rezultirajuće matrice ). Da li nam za ovaj zadatak treba medusobno isključivanje dretvi? Zašto? Objasnite u čemu bi bila razlika da smo zadatak umjesto u više dretvi rješavali pomoću više procesa?

Zadatak 5 Ova prekidna rutina za obradu prekida više razina nije dobro napisana, jer je programer zaboravio zaštiti kritični odsječak.Objasnite zašto nije dobra, navedite način na koji bi izazvali nepravilno ponašanje rutine te dopunite rutinu tako da radi ispravno.

void prekidna_rutina (int sig) {
    int i, j, ok=1;
    printf ("Unesite razinu prekida...\n");
    scanf ("%d", &i);
    OZNAKA_CEKANJA[i]=1;
    while (ok)
    {
        j=N;
        while ((j>tekuci_priority) && (!OZNAKA_CEKANJA[j]))
            j--;
        if (j>tekuci_priority)
        {
            OZNAKA_CEKANJA[j]=0;
            prioritet[j]=tekuci_prioritet;
            tekuci_prioritet=j;
            obrada_prekida(j);
            tekuci_prioritet=prioritet[j];
        }
        else
            ok=0;
    }
}

BORIS MILAŠINOVIĆ Rezultati: 28.11.2001. u 12:30