Archivi per Novembre 2008

Addio isengard

14-11-2008 14:01:34 CET Postato in: post a caso | Commenta

Servizi stoppati, record brasato sulla zona dns e raccomandata di disdetta inviata.

*sigh*

Thread, semafori e DTrace

12-11-2008 11:04:16 CET Postato in: nerdate, univaq | Commenta

Ovvero come perdere mezz'ora abbondante per vedere come interagiscono dei thread/processi (entità schedulabili, va) di un esercizio di Sistemi Operativi.
Molti probe (praticamente tutti tranne i primi due) sono definiti nel programma per evitare di dover usare fbt e/o pid e di dover tirar dentro i dati tramite copyin().

Se non capisci un cazzo di DTrace ti consiglio di leggere qui.

#!/usr/bin/dtrace -s

/* Problema dei baristi - semaphore monitor
 * vim:ts=4:et:
 */

#pragma D option quiet

uint64_t main_ts;

/* Establish time baseline */
pid$target:a.out:main:entry
{
    self->pr_id = pid;
    main_ts = timestamp;
    printf("0 -3 start\n");
}

proc:::exit
/self->pr_id && pid == self->pr_id/
{
    ts = timestamp - main_ts;
    printf("%u -3 end\n", ts);
}

/* Probes for consumer threads */
cliente$target:::start
{
    ts = timestamp - main_ts;
    self->traceme = 1;
    self->cid = arg0;
    printf("%u %d start\n", ts, self->cid);
}

cliente$target:::leave
{
    ts = timestamp - main_ts;
    printf("%u %d leave\n", ts, self->cid);
    self->traceme = 0;
}

/* Probe for producer threads */
barista$target:::start
{
    ts = timestamp - main_ts;
    self->traceme = 1;
    self->cid = (int) arg0;
    printf("%u %d start\n", ts, self->cid);
}

/* Probes for semaphore wait - before semop() call */
sem$target:::wait_enter
/self->traceme/
{
    ts = timestamp - main_ts;
    printf("%u %d wait %d\n", ts, self->cid, arg0);
}

/* after semop() call (non-blocking call or wakeup) */
sem$target:::wait_leave
/self->traceme/
{
    ts = timestamp - main_ts;
    printf("%u %d eow %d\n", ts, self->cid, arg0);
}

/* Record sem_signal calls as well */
sem$target:::signal
/self->traceme/
{
    ts = timestamp - main_ts;
    printf("%u %d signal %d\n", ts, self->cid, arg0);
}