abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:00 | Zajímavý software

    Společnost Cloudflare představila Cloudflare OS (GitHub), tj. open source platformu navrženou pro integraci umělé inteligence (agentů) přímo do pracovních procesů organizací.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová verze 5.13 svobodného multiplatformního softwaru pro konverzi a zpracování digitálních fotografií primárně ve formátů RAW RawTherapee (Wikipedie). Vedle zdrojových kódů je k dispozici také balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.

    Ladislav Hagara | Komentářů: 0
    4.8. 20:44 | Zajímavý článek

    Jean-Baptiste Kempf na svém blogu představil novou verzi 9.0 "Lei" kolekce svobodného softwaru umožňujícího nahrávání, konverzi a streamovaní digitálního zvuku a obrazu FFmpeg (Wikipedie).

    Ladislav Hagara | Komentářů: 1
    4.8. 20:11 | Komunita

    Richard Hughes oznámil, že službu Linux Vendor Firmware Service (LVFS) umožňující aktualizovat firmware zařízení na počítačích s Linuxem, nově sponzoruje také společnost NVIDIA.

    Ladislav Hagara | Komentářů: 1
    4.8. 12:22 | Zajímavý software

    Edvard Rejthar na blogu zaměstnanců CZ.NIC představil svou aplikaci SlideRshow (GitHub). Funguje jako prohlížeč fotek, ale i jako jejich organizér a prezentátor. Neinstaluje se, běží přímo v prohlížeči. Bez serveru. Offline.

    Ladislav Hagara | Komentářů: 3
    4.8. 11:44 | Nová verze

    Kermit, tj. protokol pro přenos souborů, vznikl před 45 lety. Při této příležitosti byla po 15 letech od vydání poslední stabilní verze 9.0.302 vydána nová stabilní verze 11 implementace C-Kermit. S podporou IPv6.

    Ladislav Hagara | Komentářů: 0
    4.8. 11:11 | Zajímavý článek

    První verze konverzního nástroje Pandoc byla vydána před 20 lety. Jeho autor John MacFarlane při tomto výročí rekapituluje jednotlivé etapy vývoje a přidávání nových funkcí – rozšíření nejen Markdownu a podporu mnoha dalších formátů.

    |🇵🇸 | Komentářů: 0
    4.8. 00:55 | Pozvánky

    Srpen přinesl nejen další spalující vedro, ale také Virtuální Bastlírnu s neméně žhavými novinkami. Využijte tedy předpovědi na deštivý čtvrteční večer a od 20:00 se připojte online k tomuto neformálnímu setkání kutilů, techniků a vědců, kde se strahovskými bastlíři proberete nejzajímavější věci, na které jste narazili za poslední měsíc. Pokud jde o novinky, řeč zcela jistě přijde na systém INDX pro tiskárny Průša, který na konci

    … více »
    bkralik | Komentářů: 0
    3.8. 17:22 | Zajímavý článek

    Firma T-Mobile blokovala „dezinformační web“ AC24 bez toho, aniž by k tomu měla závazný pokyn orgánů veřejné moci. Píše to ve svém rozsudku Městský soud v Praze, který po čtyřech letech uzavřel kauzu blokace zmíněného webu. Operátor musí uhradit škodu ve výši 35 tisíc korun. Advokát společnosti T-Mobile se snažil i u odvolacího senátu argumentovat tím, že firma jednala v dobré víře, když na stránky omezila přístup poté, co ji k tomu vyzvalo

    … více »
    Ladislav Hagara | Komentářů: 50
    3.8. 16:33 | IT novinky

    Padla obžaloba v bitcoinové kauze. Státní zástupkyně chce pro Blažka 6,5 roku vězení, pro Titze 8 let.

    Ladislav Hagara | Komentářů: 3
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (18%)
     (30%)
     (6%)
     (6%)
     (2%)
     (15%)
     (23%)
    Celkem 2326 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: Synchronizace

    26.4.2010 18:20 Rogue | skóre: 4
    Synchronizace
    Přečteno: 645×

    Ahoj potřeboval bych od Vás opět poradit, problém se týká synchronizace. Svůj program jsem aplikoval na problematiku 5 filozofů, ale mám pocit, že dochází k deathlock a starvation. Předem Vám děkuji, za odpovědi.

    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>
    #include <time.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    #include <sys/ipc.h>

    #include "semun.h"

    #define N 5
    #define LEFT ((philosopherNumb - 1 + N) % N)
    #define RIGHT ((philosopherNumb + 1) % N)
    #define LOCK (N+1)

    int setSemValue(void);
    int delSemaphore(void);
    int waitTime(void);
    int think(void);
    int eat(void);
    int zpracujParametr(char *arg, int pocetArg);
    int downSemaphore(int philosopherNumb);
    int upSemaphore(int philosopherNumb);
    int philosopher(int philosopherNumb);
    void takeForks(int philosopherNumb);
    void putForks(int philosopherNumb);
    void testPhilosopher(int philosopherNumb);


    enum STATE {thinking, hungry, eating};
    char *state;

    int semId;
    int shmId;

    //struct semData
    //{
    // int semId;
    //} SEM_DATA;

    struct shmData
    {
    int count;
    } SHM_DATA;

    int main(int argc, char *argv[])
    {
    struct shmData *sharedData;

    pid_t pid;
    pid_t children[N];


    int i = 0;
    int retCode = 0;
    //int shmId = 0;
    int stepsNumber = 0;
    void *sharedMemory = (void *) 0;
    // Overovani parametru
    if ((stepsNumber = zpracujParametr(argv[1], argc)) == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Inicializace sdilene pameti
    if ((shmId = shmget(IPC_PRIVATE, N + 1, 0666 | IPC_CREAT)) == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Zpristupneni sdilene pameti programu
    if ((sharedMemory = shmat(shmId, (void *) 0, 0)) == (void*) -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Inicializace citace akci
    sharedData = (struct shmData *) sharedMemory;
    sharedData->count=0;
    // Odpojeni sdilene pameti
    if (shmdt(sharedMemory) == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Inicializace semaforu
    if ((semId = semget(IPC_PRIVATE, N + 1, 0666 | IPC_CREAT)) == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Zpristupneni semaforu
    setSemValue();
    // Zpristupneni sdilene pameti programu
    if ((state = shmat(shmId, (void *) 0, 0)) == (void*) -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Vytvoreni podprocesu
    for (; i < N; i++)
    {
    pid = fork();
    switch (pid)
    {
    case -1:
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    break;
    case 0:
    while (stepsNumber != 0)
    {
    setbuf(stdout,NULL);
    philosopher(i);
    stepsNumber--;
    }
    exit(EXIT_SUCCESS);
    break;
    default:
    children[i] = pid;
    break;
    }
    }
    // Ukonceni potomknu;
    for (i = 0; i < N; i++)
    {
    retCode = waitpid(children[i], NULL, 0);
    if (retCode < 0)
    {
    retCode = kill(children[i], SIGTERM);
    if (retCode == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    }
    }
    // Odpojeni sdilene pameti
    if (shmdt(state) == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Uvolneni sdilene pameti
    if (shmctl(shmId, IPC_RMID, 0) == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    // Uvolneni semaforu
    if (delSemaphore() == -1)
    {
    fprintf(stderr, "Failed...\n");
    exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
    }

    int zpracujParametr(char *arg, int pocetArg)
    {
    char *chyba;
    int errCode = 0;
    int cislo = 0;
    errno = 0;
    // V parametru je obsazen nepripustny pocet parametru nebo neni obsazen zadny parametr.
    if ((pocetArg > 2) || (pocetArg == 1))
    {
    return -1;
    }
    cislo = strtol(arg, &chyba, 10);
    errCode = errno;
    // Parametr obsahuje nepripustne hodnoty.
    if (errCode != 0)
    {
    return -1;
    }
    // Parametr obsahuje neciselne znaky.
    if (*chyba != '\0')
    {
    return -1;
    }
    // Parametr obsahuje zapornou hodnotu.
    if (cislo < 0)
    {
    return -1;
    }
    return cislo;
    }

    int waitTime(void)
    {
    int pauseTime = 0;
    int retCode = 0;
    int errCode = 0;
    // Generovani nahodneho cisla v rozmezi O-100.
    srand((unsigned int) time(NULL) + (unsigned int) getpid());
    pauseTime = rand() % 101;
    retCode = usleep(pauseTime);
    errCode = errno;
    // Chybne skonceni funkce.
    if (retCode != 0)
    {
    return -1;
    }
    // Chybne skonceni funkce.
    if (errCode != 0)
    {
    return -1;
    }
    return 0;
    }

    int think(void)
    {
    waitTime();
    return 0;
    }

    int eat(void)
    {
    waitTime();
    return 2;
    }

    int setSemValue(void)
    {
    union semun semUnion;

    semUnion.val = 0;
    int i = 0;
    for (; i < N + 1; i++)
    {
    if (semctl(semId, i, SETVAL, semUnion) == -1)
    {
    return -1;
    }
    }
    return 0;
    }

    int delSemaphore(void)
    {
    union semun semUnion;

    if (semctl(semId, 0, IPC_RMID, semUnion) == -1)
    {
    return -1;
    }
    return 0;
    }

    int downSemaphore(int philosopherNumb)
    {
    struct sembuf sem;

    sem.sem_num = philosopherNumb;
    sem.sem_op = -1;
    sem.sem_flg = 0;
    if (semop(semId, &sem, 1) == -1)
    {
    return -1;
    }
    return 0;
    }

    int upSemaphore(int philosopherNumb)
    {
    struct sembuf sem;

    sem.sem_num = philosopherNumb;
    sem.sem_op = 1;
    sem.sem_flg = 0;
    if (semop(semId, &sem, 1) == -1)
    {
    return -1;
    }
    return 0;
    }

    void takeForks(int philosopherNumb)
    {
    downSemaphore(LOCK);
    state[philosopherNumb] = hungry;
    testPhilosopher(philosopherNumb);
    upSemaphore(LOCK);
    downSemaphore(philosopherNumb);
    }

    void putForks(int philosopherNumb)
    {
    downSemaphore(LOCK);
    state[philosopherNumb] = thinking;
    testPhilosopher(LEFT);
    testPhilosopher(RIGHT);
    upSemaphore(LOCK);
    }

    void testPhilosopher(int philosopherNumb)
    {
    if (state[philosopherNumb] == hungry && state[LEFT] != eating && state[RIGHT] != eating)
    {
    state[philosopherNumb] = eating;
    upSemaphore(philosopherNumb);
    }
    }

    int philosopher(int philosopherNumb)
    {
    state[philosopherNumb] = thinking;
    printf("F(%d) Mysli\n", philosopherNumb);
    think();
    printf("F(%d) Bere vidlicky\n", philosopherNumb);
    takeForks(philosopherNumb);
    printf("F(%d) Ji\n", philosopherNumb);
    eat();
    printf("F(%d) Poklada vidlicky\n", philosopherNumb);
    putForks(philosopherNumb);
    return 0;
    }
    -------------------------semun.h------------------------------------------------------------
    #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
    #else
    union semun
    {
    int val;                    
    struct semid_ds *buf;       
    unsigned short int *array;
    struct seminfo *__buf;      
    };
    #endif 

    Odpovědi

    26.4.2010 19:51 Lukáš Zapletal | skóre: 42 | blog: lzapův svět | Olomouc
    Rozbalit Rozbalit vše Re: Synchronizace
    UPOL? ;-)

    To neni moc dobre polozena otazka. Pastnout sem kod a cekat. Spis by to asi chtelo zkusit rozvinout nejake podezreni, kde by mohl byt problem. A cekat potvrzeni nebo vyvraceni myslenky.

    "Je to spatne" je asi malo.

    ps - hovorime obvykle o "deadlock" nikoliv "deathlock" ;-)
    26.4.2010 20:15 duigha
    Rozbalit Rozbalit vše Re: Synchronizace
    Ne, to není UPOL. Je to FIT VUT ;)
    26.4.2010 20:19 Rogue | skóre: 4
    Rozbalit Rozbalit vše Re: Synchronizace
    Ano máte naprostou pravdu díky za opravu upsal jsem se. Jinak mám podezření na semafory a jejich uzamykání filozofů, ve funkci void testPhilosopher(int philosopherNumb), ale nejsem si jistý, abych pravdu řekl teď se znažím přijít na chybu metodou pokus omyl proto se ptám Vás. Chyba je ve výpise, že například dokáže jíst filozof, který nemá k dispozici vidličky. Potřebuji, aby jedli pouze ti, kteřý mají s vidličky po své levé a pravé ruce a nemohli si je brat jen tak "libovolně ze stolu". Předem dík za čas a Vaše odpovědi.
    26.4.2010 23:12 Jirka P
    Rozbalit Rozbalit vše Re: Synchronizace
    Chyba je ve výpise, že například dokáže jíst filozof, který nemá k dispozici vidličky.
    Skutečně je to tak? Mě přijde, že je to celý tak divoké, že i ten výstup může být jen zmatený. Zkuste spustit
    strace -f -o logfile program
    a pokud si budete myslet, že k chybě došlo, postněte sem logfile jako přílohu.

    Jinak k vyhladovění ve vašem řešení dojít může.
    27.4.2010 09:50 Rogue | skóre: 4
    Rozbalit Rozbalit vše Re: Synchronizace
    Co máte přesně na mysli tím pojmemem divoké ?
    27.4.2010 16:57 Rogue | skóre: 4
    Rozbalit Rozbalit vše Re: Synchronizace
    Chtel jsem se zeptat jestli mi nekdo neda radu jak predejit starvation. Diky za odpoved.
    27.4.2010 23:45 Jirka P
    Rozbalit Rozbalit vše Re: Synchronizace
    Divoké znamená zhruba WTF?!? Konkrétně jde o ten velký LOCK (to není úplně nejlepší technika) a použití semaforu nikoli k ochraně paměťové struktury nebo invariantu, ale k prostému čekání (dá se použít, ale moc čitelné to není).

    Starvation zabráníte tak, že tam najdete cyklus, ve kterém se jeden filosof nenají, a přeseknete ho. Např. pokud budou střídavě jíst jednička a trojka, může být dvojka hungry donekonečna. Takže (třeba) trojku nenecháte jíst, dokud je dvojka hungry.

    Jinak vřele nedoporučuji makra jako vaše LEFT a RIGHT, tohle je cesta do pekel.
    28.4.2010 15:52 Rogue | skóre: 4
    Rozbalit Rozbalit vše Re: Synchronizace
    Ok díky za tip, hned se do toho pustím.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.