Активно чекање

У софтверском инжењерингу, активно чекање, заузет-петљањем или вртење је техника у коме процес непрестано проверава да види да ли је стање тачно, као да ли је улаз тастатуре или брава доступна. Вртење се може такође користити за генерисање произвољног временског кашњења, техника која је неопходна на системима у којима не постоји метод чекања одређене дужине времена. Брзина процесора варира доста од рачунара до рачунара, нарочито пошто су неки процесори дизајнирани да динамично намештају брзину на основу спољашњих фактора, као што је оптерећење оперативног система. Као такаво, вртење као временска техника често проиводи непредвидиве или чак недоследне резултате осим ако се код не спроводи да одлучи колико брзо ће процесор извршити "не ради ништа" петљу, или код петље експлицитно проверава сат реалног-времена.

Вртење може бити добра стратегија у неким ситуацијама, највише приликом имплементација спин брава унутар оперативних система дизајнираних да покрећу SMP ситеме. Углавном, међутим, вртење се сматра анти-шаблоном и требало би да се избегава ,[1] док време процесора које би могло да се искористи за извшење различитих нити је потрошено на бескорисне активности.

Пример С кодаУреди

Следећи С код примери илуструју две нити које деле гловални цео број i. Прва нит користи активно чекање да провери измене у вредности i:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
 
volatile int i = 0; /* i је глобална, тако да је видљиво за све функције.
                       Такође је обележен као несталан, зато што оно
                       се може променити на начин који није предвидив од стране компилатора,
                       овде из различитог навоја. */
 
/* f1 користи спинбраву да сачека i да се промени од 0. */
static void *f1(void *p)
{
    while (i==0) {
        /* не ради ништа - само проверавара */
    } 
    printf("i'његова вредност је промењена на %d.\n", i);
    return NULL;
}

static void *f2(void *p)
{
    sleep(60);   /* спава  60 секунди */
    i = 99;
    printf("t2 је променио вредност од i на %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;
}

У оваквом случају, један може да размисли коришћење С11 стања променљивих.

АлтернативеУреди

Већина оперативних система и библиотека нити пружа различите позиве ситема који ће блокирати процесе на догађају, као што је стицање браве, промена тајмера, I/O доступност или сигнали. Користећи овакве позиве углавном производи једноставне, најефикасније, праведне, и без-расе резултате. Један позив проверава, информише планер догађаја који чека, убацује баријеру меморије где је могуће, и може да изврши I/O операцију пре враћања. Остали процеси могу користити CPU док је позивач блокиран. Планеру је дата потребна информација за имплементацију приоритета наследства или остале механизме да избегне глад.

Активно чекање само од себе може бити мање бескорисно користећи функцију кашњења (пример.,sleep()) нађена у многим оперативним системима. Ово ставља нит на спавање на одређено време, током кога нит нече потрошити CPU време. Ако петља проверава нешто једноставно онда ће она потрошити већину времена док спава и потрошиће мало CPU времена.

У програмима који се никад не заврше (као што су оперативни системи), бесконачно активно чекање може бити убачено користећи безусловне скокове показане преко NASM синтаксе : jmp $. CPU ће аутоматски JMP(x86 инструкција)скочити до свог процесора заувек . Активно чекање као ово може бити замењено са

sleep:
hlt
jmp sleep

За више информација погледати, hlt.

Одговарајућа употребаУреди

У програмирању ниског-нивоа, активно чекање може бити пожељно. Није можда пожељно или практично убацивати прекинуто процесовање за сваки хардверски апарат, нарочито они којима се тешко приступа. Понекад је неопходно да се напише неки тип контроле података за хардвер, а затим донети статус уређаја који проистиче из записане операције, статус који можда неће постати валидан све док број кругова машине не прође пратећи запис. Програмер може позвати функцију одлагања оперативног система, али ако уради, то му може узети више времена него што би се потрошило приликом вртења од неколико сатних циклуса чекајући уређај да се врати у своје првобитно стање.

Види јошУреди

РеференцеУреди

  1. ^ „Why the "volatile" type class should not be used”. Архивирано из оригинала на датум 02. 11. 2013. Приступљено 13. 11. 2015. 

Спољашње везеУреди