Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Forest_roby

    őstag

    válasz Bazsesz #2360 üzenetére

    Hi!

    Szemaforok: légyeg, ha egy erőforrást egyszerre két folyamat akar használni, akkor ütköznének a folyamatok, -biztos hogy hibás eredmények születnének. Most cifrázhatnám, hogy milyen sulyos hibák történhetnének, de el tudjátok képzelni... No, első gondolatra válozókkal meglehetne oldani, a problémát ( ezt most nem részletezem ) , de az a probléma, hogy ott ugyanúgy összeakadna a progi, ez nem megoldás. A szemafórok az oprendszer (LINUX) által biztosított olyan változók, amiknél nem fordulhat elő az, hogy egszerre használják ugyanazt az eszközt... ( hogy ezt hogy érik el, az legyen egy okosabb embernek az összefoglalója ).
    Szóval ilyen problémák megoldására a szemaforokat kell használni....
    Használat:
    A szemaforokon két műveletet értelmezünk:
    Csökkentés és Növelés
    A szemafor értéka 0 és 1 lehet. Ha 0 -akkor blokkolt a folyamat és ha 1 akkor szabad a futás.
    Csökkentés:
    Amikor a progi belépni akar a kritikus szakaszba akkor fog csökkenteni, ha a szemafor 0 volt akkor várólistára kerűl a folyamat, ha 1 volt akkor a folyamat lefut és a szemafor 1-ről 0-ra csökken.
    Növelés:
    A folyamat végrehajtása után történik meg. A szemafort 1-re álitja. Ha lenne olyan folyamat, amely e miatt a szemafor miatt volt blokkolt állapotban, arról a Linux gondoskodik, hogy az felszabaduljon a blokkolt állapotból.

    (dióhélyban /majd vissza kell olvasnom, hogy mennyi baromságot írtam ide le....)

    int semget(...)
    int semctl(...)
    int semop(...)
    fv-eknek érdemes utánna nézni, sajna a progi amit tudnék adni 125 soros és most nincs kedvem begépelni, de google-on biztos sokat találsz....
    remélem azért nem volt teljesen hasztalan ezt begépelnem...

    Sok sikert!

    [Szerkesztve]

  • Robaj

    addikt

    válasz Bazsesz #2360 üzenetére

    Vmi ilyesmi:

    #define N 100
    typedef int semaphore;
    semaphore mutex=1;
    semaphore empty=N;
    semaphore full=0;


    void producer(void)
    { int item;
    while (TRUE){
    produce_item(&item);
    down(&empty);
    down(&mutex);
    enter_item(item);
    up(&mutex);
    up(&full);
    }
    }

    void consumer(void)
    {
    int item;
    while (TRUE) {
    down(&full);
    down(&mutex);
    remove_item(&item);
    up(&mutex);
    up(&empty);
    consume_item(item);
    }
    }

    Előadásjegyzetben van/volt, hámozz ki belőle vmit. Nekem nem sikerült. De 2-es megvan.:)

  • Jester01

    veterán

    válasz Bazsesz #2360 üzenetére

    A szemaforok tulajdonképpen számlálók amik általában azt jelentik, hogy valami X dologból rendelkezésre áll valamennyi. A számláló növelése nem várakozik, ez csak azt jelenti, hogy több X áll rendelkezésre. Ha most jön valaki, hogy neki kellene valamennyi X, akkor a rendelkezésre álló mennyiséget az igényelt mennyiséggel csökkenteni kell, illetve ha éppen nincs elegendő, akkor várni kell.

    A te feladatodra rátérve: 2 szemaforra lesz szükség, mivel a probléma szimmetrikus. Az egyik jelzi, hogy az A program írt valamit amit a B kiolvashat, illetve fordítva.

    A program:
    write(); /* írunk valamit */
    sem_up(A); /* jelezzük, hogy A írt */
    sem_down(B); /* várunk amíg B jelzi, hogy írt */
    read(); /* kiolvassuk */

    B program:
    sem_down(A); /* várunk amíg A jelzi, hogy írt */
    read(); /* kiolvassuk */
    write(); /* írunk valamit A-nak */
    sem_up(B); /* jelezzük, hogy B írt */

Új hozzászólás Aktív témák