Aktivno čekanje
U softverskom inženjeringu, aktivno čekanje, zauzet-petljanjem ili vrtenje je tehnika u kome proces neprestano proverava da vidi da li je stanje tačno, kao da li je ulaz tastature ili brava dostupna. Vrtenje se može takođe koristiti za generisanje proizvoljnog vremenskog kašnjenja, tehnika koja je neophodna na sistemima u kojima ne postoji metod čekanja određene dužine vremena. Brzina procesora varira dosta od računara do računara, naročito pošto su neki procesori dizajnirani da dinamično nameštaju brzinu na osnovu spoljašnjih faktora, kao što je opterećenje operativnog sistema. Kao takavo, vrtenje kao vremenska tehnika često proivodi nepredvidive ili čak nedosledne rezultate osim ako se kod ne sprovodi da odluči koliko brzo će procesor izvršiti "ne radi ništa" petlju, ili kod petlje eksplicitno proverava sat realnog-vremena.
Vrtenje može biti dobra strategija u nekim situacijama, najviše prilikom implementacija spin brava unutar operativnih sistema dizajniranih da pokreću SMP siteme. Uglavnom, međutim, vrtenje se smatra anti-šablonom i trebalo bi da se izbegava ,[1] dok vreme procesora koje bi moglo da se iskoristi za izvšenje različitih niti je potrošeno na beskorisne aktivnosti.
Primer S koda
[uredi | uredi izvor]Sledeći S kod primeri ilustruju dve niti koje dele glovalni ceo broj i. Prva nit koristi aktivno čekanje da proveri izmene u vrednosti 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;
}
U ovakvom slučaju, jedan može da razmisli korišćenje S11 stanja promenljivih.
Alternative
[uredi | uredi izvor]Većina operativnih sistema i biblioteka niti pruža različite pozive sitema koji će blokirati procese na događaju, kao što je sticanje brave, promena tajmera, I/O dostupnost ili signali. Koristeći ovakve pozive uglavnom proizvodi jednostavne, najefikasnije, pravedne, i bez-rase rezultate. Jedan poziv proverava, informiše planer događaja koji čeka, ubacuje barijeru memorije gde je moguće, i može da izvrši I/O operaciju pre vraćanja. Ostali procesi mogu koristiti CPU dok je pozivač blokiran. Planeru je data potrebna informacija za implementaciju prioriteta nasledstva ili ostale mehanizme da izbegne glad.
Aktivno čekanje samo od sebe može biti manje beskorisno koristeći funkciju kašnjenja (primer.,sleep()) nađena u mnogim operativnim sistemima. Ovo stavlja nit na spavanje na određeno vreme, tokom koga nit neče potrošiti CPU vreme. Ako petlja proverava nešto jednostavno onda će ona potrošiti većinu vremena dok spava i potrošiće malo CPU vremena.
U programima koji se nikad ne završe (kao što su operativni sistemi), beskonačno aktivno čekanje može biti ubačeno koristeći bezuslovne skokove pokazane preko NASM sintakse : jmp $. CPU će automatski JMP(x86 instrukcija)skočiti do svog procesora zauvek . Aktivno čekanje kao ovo može biti zamenjeno sa
sleep:
hlt
jmp sleep
Za više informacija pogledati, hlt.
Odgovarajuća upotreba
[uredi | uredi izvor]U programiranju niskog-nivoa, aktivno čekanje može biti poželjno. Nije možda poželjno ili praktično ubacivati prekinuto procesovanje za svaki hardverski aparat, naročito oni kojima se teško pristupa. Ponekad je neophodno da se napiše neki tip kontrole podataka za hardver, a zatim doneti status uređaja koji proističe iz zapisane operacije, status koji možda neće postati validan sve dok broj krugova mašine ne prođe prateći zapis. Programer može pozvati funkciju odlaganja operativnog sistema, ali ako uradi, to mu može uzeti više vremena nego što bi se potrošilo prilikom vrtenja od nekoliko satnih ciklusa čekajući uređaj da se vrati u svoje prvobitno stanje.
Vidi još
[uredi | uredi izvor]- BogoMips
- Nestabilna promenljiva
- Biranje (računarska nauka)
- Spin brave
- Sinhronizacija (računarska nauka)
- Pitersonov algoritam
Reference
[uredi | uredi izvor]- ^ „Why the "volatile" type class should not be used”. Arhivirano iz originala 02. 11. 2013. g. Pristupljeno 13. 11. 2015.
Spoljašnje veze
[uredi | uredi izvor]- Description from The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
- Article "User-Level Spin Locks - Threads, Processes & IPC" by Gert Boddaert
- Austria SpinLock Class Reference Arhivirano na sajtu Wayback Machine (14. maj 2011)