Semafor (programovanie): Rozdiel medzi revíziami
Smazaný obsah Přidaný obsah
Nová stránka: : ''Pre ostatné použitia, pozri Semafor.'' '''Semafor''', v programovaní, je zabezpečená premenná (entita zachovávajúca hodnotu) alebo [[abstraktného dátovéh... |
|||
Riadok 16:
P(Semaphore s) // Získanie zdroja
{
wait until s > 0, then s := s-1;
/* musí byť [[atomické (programovanie)|atomické]] ak platí s > 0 */
}
V(Semaphore s) // Uvoľnenie zdroja
{
s := s+1; /* musí byť atomické */
}
Init(Semaphore s, Integer v)
{
s := v;
}
Všimnime si, že zvyšovanie premennej ''s'' nesmie byť prerušené a procedúra ''P'' nesmie byť prerušená ak ''s'' je väčšie od 0. Toto sa dá dosiahnuť pomocou špeciálnej inštrukcie [[test-and-set]] (ak to v danej architektúre [[inštrukčná sada]] podporuje) alebo (ak to je [[jednoprocesorový systém]]) sa dá zakázať [[prerušenie]] na zabránenie prepnutia procesu.
Řádek 72 ⟶ 56:
P(Semaphore s, integer howmany)
{
wait until s >= 0;
s := s - howmany; /* musí byť atomické */
wait until s >= 0;
}
V(Semaphore s, integer howmany)
{
s := s+howmany; /* musí byť atomické */
}
Na pochopenie, prečo je to lepšie ako jednoduché viacnásobné volanie P, uvažujme nasledovný problém. Povedzme, že máte množstvo N nejakého zdroja, napríklad zásobníkov pevnej dĺžky. Môžete chcieť mať inicializovaný semafor na hodnotu N na monitorovanie, ktorý zásobník je momentálne nepoužívaný. Keď si chce proces alokovať zásobník, zavolá P na semafore a dostane ho. Ak nie sú žiadne zásobníky voľné, bude čakať pokiaľ niektorý z iných procesov neuvoľní zásobník a vyvolá V na semafore.
Řádek 108 ⟶ 80:
Za povšimnutie stojí, že nie je nutné mať číslo na semafore rovné hodnote počtu voľných zásobníkov. Testovanie a čakanie na podmienke s >= 0 v P je nutné na zabezpečenie toho, aby pri pridávaní sa do čakacej fronty procesy nerušili ostatným požiadavky: proces nezmení hodnotu na semafore, pokiaľ nie je prvý vo fronte. V reálnej implementácii je to robené bez zobudenia procesu na zmenšenie hodnoty.
==Semafory v dnešnej dobe používané programátormi==
|