Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

delay()

[es] :: Art of Programming :: delay()

[ Pregleda: 4445 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.etf.bg.ac.yu

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon delay()03.09.2002. u 16:19 - pre 230 meseci

Postovani prijatelji,

zna li neko kako se kod operativnih sistema implementira funkcija za suspendovanje niti na odredjeno vreme? (delay() )

Pitanje je konkretno ovo: da je li u realizaciji potrebno uvesti po jedan tajmer za svaku suspendovanu nit ili
se moze koristiti i manji broj tajmera, uz potencijalno slozeniji wakeUp mehanizam.
Cilj je naravno da se izbegne preopterecenje sistea brojnim nitima koje samo obradjuju brojace.

Zahvalan,
f
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: delay()03.09.2002. u 20:15 - pre 230 meseci
Ako dobro razumem sta ti treba:
- svaka nit moze da zove sleep() funkciju za sebe
- treba ti mehanizam da ovo funkcionise sa min. brojem timera?

Ovo moze da se napravi sa jednim timerom i redom za cekanje.
'Red' nije struktura red (queue) vec nesto sto ima sledece operacije:
- umetanje u strukturu tako da bude uredjeno po klucu
- nalazenje najmanjeg elementa (po klucu)
- izbacivanje iz strukture (opet, po kljucu)

Mislim da se uglavnom koristi heap (nisam siguran) ali moze i neko
koliko-toliko balansirano stablo.

Threadovi koji cekaju su u strukturi uredjeni po vremenu budjenja.

Nit kada pozove sleep uradi:
izracuna svoje vreme budjenja (time + delay) i to je kljuc
stavi sebe u gore opisanu strukturu
proveri da li je vreme budjenja pre vremena na koji je programiran timer,
i ako jeste, postavi novo vreme budjenja timera
ide u sleep stanje
(ok, ovde treba uzeti u obzir da za vreme ove operacije
moze da prodje vreme potrebno za budjenje niti)

Kada se desi timer-event, sistem uradi:
1. Uzme nit sa najranijim vremenom budjenja,
stavi u 'ready' stanje i izbaci iz 'reda'
2. Uzme trenutno vreme i ako je vreme budjenja prve niti u 'redu' manje od
trenutnog (ili jednako), goto 1.
3. Uzme vreme budjenja prve niti u redu i programira timer da se tad probudi.

Ovo je sve otprilike, ali mislim da je ideja 'tu negde'.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 799
*.beg.sezampro.yu



+62 Profil

icon Re: delay()04.09.2002. u 10:10 - pre 230 meseci
Pokusaj sa GetTickCount() da napravis resenje bez tajmera; moguce je.

Rajko
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.dial.InfoSky.Net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: delay()07.09.2002. u 05:10 - pre 230 meseci
Uz sve što je Saša Spasić rekao dodajem i sledeće.

Mada je direktna upotreba tajmera (znači kreiranje novog ,,tajmer procesa'', bio to zaista proces, nit, objekat u jezgru, prekid, izuzetak ili šta god) moguća, postoji i drugo rešenje.

Ovakva funkcionalnost se radi u okviru schedulera (što i nije neočekivano, scheduler ionako preuzima kontrolu nad sistemskim tajmerom na nižem nivou). Tradicionalni scheduler sadrži najmanje tri liste: listu spremnih (,,ready state'' kako kaže Saša), listu zaustavljenih/onih koji čekaju (,,wait state''), i listu aktivnih (ako se radi o višeprocesorskoj mašini; za jednoprocesorsku ova ,,lista'' sadrži samo jedan član).

Za postavljeno pitanje, od najvećeg značaja je lista procesa koji čekaju. Među uobičajene kriterijume (čekanje na semafor, ulaz/izlaz i drugo) može se dodati i čekanje na tajmer (implementirano preko najmanjeg ,,kvanta'' samog scheduler-a).

Jasno je da ovakav pristup ima manju rezoluciju (osnovna jedinica vremenskog raspoređivanja je unapred utvrđeni 1 kvant koji najčešće iznosi od 1–100ms), ali ima i neke prednosti: moguće je izvršiti optimizacije na nivou scheduler-a, kao i izvršiti bolju kontrolu procesa.

Pored već pomenute knjige Operating Systems Vade Mecum, preporučio bih i OS Kit ako te interesuju konkretne implementacije.


Što se tiče ,,GetTickCount()'' moram priznati da još nisam sreo procesor koji među svojim instrukcijama sadrži i neku tog oblika.

Toliko
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 799
*.beg.sezampro.yu



+62 Profil

icon Re: delay()07.09.2002. u 15:50 - pre 230 meseci
Ali zato si video procesor koji ima implementiran timer? Ili cak i thread-ove?

Rajko

P.S. Procitaj prvi post. Covek je lepo rekao "operativni sistemi", a ne procesori.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.dial.InfoSky.Net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: delay()08.09.2002. u 03:43 - pre 230 meseci
Možda sam pogrešio, ali učinilo mi se da je pitanje bilo u kontekstu razvoja operativnih sistema (pošto se pitalo ,,kako koji implementira'').

Nisam dao konkretan odgovor (,,Windows to radi ovako, Linux tako, HP-UX tako, Mach tako''), već nešto opštiji.

Razvoj operativnog sistema podrazumeva razvoj uz pomoć instrukcija samog procesora, kao i ostalih uređaja (od kojih je gotovo obavezan ,,tajmer'', ali hardverski uređaj).

Što se tiče niti, one su malo veća apstrakcija, ali ako insistiraš, mogu reći da postoje procesori koji ih delimično implementiraju (ne mogu potpuno, pošto je potrebna i memorija za njih, kao i prilagođena kontrola, a ne unapred ugrađena u procesor). Takav je čak i IA32 (Intel to naziva tasks, ali suštinske razlike nema pošto je task u Intel-smislu veoma širok pojam).

GetTickCount() funkcija je, verujem, relevantna samo za Windows operativne sisteme. Što je još gore, Windows jezgro ne verujem da koristi upravo nju za izvođenje delay() (uostalom, to bi značilo da Windows ima vrlo čudnu rekurzivnu arhitekturu; mada, možda i grešim). Prema tome, GetTickCount() se možda može koristiti u user-level čekanju, a nikako ne spada u način na koji to Windows radi na nivou operativnog sistema (što je bilo, čini mi se, pitanje).

Zbog toga sam dozvolio sebi malo ironije; ako je to bilo neprikladno, izvinjavam se (tj. izvinjavam se u svakom slučaju).


Svakako, ne mogu isključiti mogućnost da sam ja pogrešno shvatio pitanje. Ali o tome ćemo morati da sačekamo pošiljaoca da se izjasni.

Toliko
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.dial.InfoSky.Net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: delay()08.09.2002. u 03:51 - pre 230 meseci
Još o GetTickCount() funkciji.

Ako se koristi takav pristup (koji ne verujem da se koristi u bilo kojem postojećem operativnom sistemu), onda se mora koristiti neki ciklus, što bi oduzimalo procesorsko vreme (pa je zato i nekorišćen pristup). Ne zaboravimo da delay() ne treba da blokira ceo računar, već samo jedan proces. Ovakvo rešenje je prolazilo na DOS-u, ali ne i sada.

U opštem slučaju, ovo bi se efikasnije uradilo ako bi se izvršila kalibracija procesora po pokretanju jezgra, pa onda umesto čitanja RTC-a (prilično neefikasnog tajmera), vrši se ciklus sa određenim brojem ponavljanja. Svakako, ovo zavisi od opterećenja sistema, ali ko će i koristiti ovaj pristup u sistemima u kojima je moguće da radi više od jednog procesa?

Toliko
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.etf.bg.ac.yu

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: delay()08.09.2002. u 07:27 - pre 230 meseci

Postovani prijatelji,

Hvala svima na diskusiji i savetima. Videcemo koliko dobro sam ih shvatio,
jer upravo krecem na specijalitet kuce (specijalitet kuce == ispit u nedelju u 8 sati ujutro)...

f
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.etf.bg.ac.yu

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: delay()08.09.2002. u 11:34 - pre 230 meseci

Postovani prijatelji,

Ko je rekao da Bog cuva budale, bio je u pravu.

Naime, odem na ispit a tamo, do na razlicitu formulaciju _istovetan_ zadatak! Takoreci, kec na deset. Tako su
vasi predlozi bili jos korisniji i efektivniji, bar u mom slucaju. Jos jednom svima puno hvala, cak i vise nego u
prethodnoj poruci. :)

f
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: delay()24.09.2002. u 16:10 - pre 229 meseci
sa nitima se ne radi sa delay()... zapravo bilo kakve asinhrone funkcije nisu pozeljne. Umesto toga koristi pthread_cond_timedwait(), pthread_mutex_trylock() ili pthread_cond_wait() ...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.rcub.bg.ac.yu

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: delay()24.09.2002. u 22:58 - pre 229 meseci

Kad smo kod pthreadsa i konkretne implementacije, cisto da podsetim na jedan detaljcic. Naime, kod pthreads biblioteke
koliko se secam, delay suspenduje ceo _proces_ a ne tred. Drugim recima, delay u bilo kom tredu zaustavlja sve tredove
u programu, pa moraju da se koriste specificne delay varijante. Srecom ova varijanta se odnosila na delay jednog treda...

f
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: delay()25.09.2002. u 12:20 - pre 229 meseci
filipe totalno si mi nejasan - podseticu te na tvoje pitanje: zna li neko kako se kod operativnih sistema implementira funkcija za suspendovanje niti na odredjeno vreme? (delay() ) .

Ja sam na ovo odgorio da je losa praksa koristiti delay(), nisam doduse rekao zasto, ali najzanimljivije je sto si posle mog teksta sam odgovorio zasto... :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.rcub.bg.ac.yu

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: delay()25.09.2002. u 12:41 - pre 229 meseci

Manje-vise, trazio sam odgovor na jedno ispitno pitanje: kako ispod haube izgleda funkcija za suspenziju niti
na odredjeno vreme, sa naglaskom na mali overhed za obradu tajmera. Strogo govoreci, pobrkao sam termine tako da
sam zaista ispao nejasan nekome ko je dosao u pola price; tu si skroz u pravu. S te strane, moje izvinjenje.

Medjutim ni ispitna terminologija nije bas mainstream, delay() tu sluzi za suspenziju niti a ne procesa,
jer radni kernel podrzava samo niti. :) Moze biti da je otud izasla zabuna jer nisam prvo uskladio terminologiju
s jusom pa tek onda pisao.

f
 
Odgovor na temu

[es] :: Art of Programming :: delay()

[ Pregleda: 4445 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.