Archivi per Novembre 2008
Addio isengard
Servizi stoppati, record brasato sulla zona dns e raccomandata di disdetta inviata.
*sigh*
Thread, semafori e DTrace
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);
}




