Procházet otázky :: SZZ na MFF UK

#

- Hlavní strana
- Okruhy
- Projít
- Stáhnout
- Co je potřeba
- Chci přispět
- Kredity

Hledat:

## Prohlížení státnicových textů

### Aktivní čekání

Vlastnosti: spotřebovává čas procesoru, vhodnější pro předpokládané krátké doby čekání, nespotřebovává prostředky OS, rychlejší.

Je možné použít např. zakázání přerušení (vhodné pro jádro OS). Používání zámků nefunguje:

    int lock;
    void proc(void) {
    for (;;) {
    nekritická_sekce();
    while (lock != 0);
    lock = 1;
    kritická_sekce();
    lock = 0;
    }
    }

ale důsledné střídání ano (to ale porušuje podmínku 3.)

    int turn = 0;

    void p1(void)                void p2(void)
    {                            {
    for (;;) {                   for (;;) {
    while (turn != 0);           while (turn != 1);
    kritická_sekce();            kritická_sekce();
    turn = 1;                    turn = 0;
    nekritická_sekce();          nekritická_sekce();
    }                            }
    }                            }

Petersonovo řešení:

    #define N 2                   /* počet procesů */

    int turn;
    int interested[N];            /* kdo má zájem */

    void enter_region(int proc) { /* proc: kdo vstupuje */
    int other;

    other = 1-proc;             /* číslo opačného procesu */
    interested[proc] = TRUE;    /* mám zájem o vstup */
    turn = proc;                /* nastav příznak */
    while (turn == proc && interested[other] == TRUE);
    }

    void leave_region(int proc) { /* proc: kdo vystupuje */
    interested[proc] = FALSE;   /* už odcházím */
    }

Instrukce TSL (spin-lock) - je nutné aby ji podporoval HW (všechny současné procesory nějakou mají):

    enter_region:
    tsl   R,lock           ; načti zámek do registru R a
    ; nastav zámek na 1
    cmp   R,#0             ; byl zámek nulový?
    jnz   enter_region     ; byl-li nenulový, znova
    ret                    ; návrat k volajícímu - vstup do
    ; kritické sekce
     leave_region:
    mov   lock,#0          ; ulož do zámku 0
    ret                    ; návrat k volajícímu