Ugrás a tartalomhoz

busy waiting

A Wikiszótárból, a nyitott szótárból


Főnév

busy waiting (tsz. busy waitings)

  1. (informatika) A számítógép-programozásban a busy waiting, spinning vagy tevékeny várakozás azt jelenti, hogy egy folyamat újra és újra ellenőrzi, hogy egy feltétel igazzá vált-e, például hogy elérhető-e a bemenet a billentyűzetről, vagy hogy felszabadult-e egy erőforrás. Azokon a rendszereken, ahol még nem volt lehetőség a tetszőleges ideig tartó várakozásra, ezzel a módszerrel valósították meg a várakozást. Azonban a számítógépek sebessége különböző, és egy gép sebessége is változhat, különösen akkor, ha úgy van tervezve, hogy sebességét külső tényezőkhöz, például a terheléstől, így ez a módszer ma már nem szolgáltat megbízható eredményt. A kódnak meg kell határoznia, mennyi idő alatt hajtható végre egy várakozó ciklus, vagy pedig külső órát kell ellenőriznie.

Néha a busy waiting megfelelő stratégia, például SMP rendszerekre írt operációs rendszerekben bizonyos lockokra való várakozáskor (spinlock). Általában azonban antimintának tekinthető és kerülendő, mivel pazarolja a processzoridőt, amit hasznosabb feladatokra is lehetne használni.

C példa

Az alábbi C nyelvű kód két szálat tartalmaz, amelyek egy globális i változón osztoznak. Az első szál busy waitinget használ annak ellenőrzésére, hogy az i változó értéke megváltozott-e:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
 
volatile int i = 0; /* i is global, so it is visible to all functions.
                       It's also marked volatile, because it
                       may change in a way which is not predictable by the compiler,
                       here from a different thread. Thus preventing the compiler from
                       caching its value.*/
 
/* f1 uses a spinlock to wait for i to change from 0. */
static void *f1(void *p)
{
    while (i==0) {
        /* do nothing - just keep checking over and over */
    } 
    printf("i's value has changed to %d.\n", i);
    return NULL;
}

static void *f2(void *p)
{
    sleep(60);   /* sleep for 60 seconds */
    i = 99;
    printf("t2 has changed the value of i to %d.\n", i);
    return NULL;
}

int main()
{
    int rc;
    pthread_t t1, t2;

    rc = pthread_create(&t1, NULL, f1, NULL);
    if (rc != 0) {
        fprintf(stderr,"pthread f1 failed\n");
        return EXIT_FAILURE;
    }
 
    rc = pthread_create(&t2, NULL, f2, NULL);
    if (rc != 0) {
        fprintf(stderr,"pthread f2 failed\n");
        return EXIT_FAILURE;
    }
 
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    puts("All pthreads finished.");
    return 0;
}

A hasonló esetek megfelelő kezelésére a C11 óta elérhetők a monitorok feltételváltozói.