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í
×
    dnes 02:22 | Humor

    Bogdan Ionescu rozběhl webový server na jednorázové elektronické cigaretě.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Byla vydána beta verze Ubuntu 25.10 s kódovým názvem Questing Quokka. Přehled novinek v poznámkách k vydání. Dle plánu by Ubuntu 25.10 mělo vyjít 9. října 2025.

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

    Bola vydaná nová verzia 4.13 security platformy Wazuh. Prináša nový IT hygiene dashboard, hot reload dekodérov a pravidiel. Podrobnosti v poznámkách k vydaniu.

    peterm655 | Komentářů: 0
    včera 12:22 | IT novinky

    Americký výrobce čipů Nvidia investuje pět miliard dolarů (přes 100 miliard Kč) do konkurenta Intel, který se v poslední době potýká s vážnými problémy. Firmy to včera oznámily ve společné tiskové zprávě. Dohoda o investici zahrnuje spolupráci při vývoji čipů pro osobní počítače a datová centra. Akcie společnosti Intel na zprávu reagovaly výrazným růstem.

    Ladislav Hagara | Komentářů: 5
    včera 05:11 | Komunita

    Dlouholetý balíčkář KDE Jonathan Riddell končí. Jeho práci na KDE neon financovala firma Blue Systems, která ale končí (Clemens Tönnies, Jr., dědic jatek Tönnies Holding, ji už nebude sponzorovat), někteří vývojáři KDE se přesunuli k nově založené firmě Techpaladin. Pro Riddella se již nenašlo místo. Následovala debata o organizaci těchto firem, které zahraniční vývojáře nezaměstnávají, nýbrž najímají jako kontraktory (s příslušnými důsledky z pohledu pracovního práva).

    |🇵🇸 | Komentářů: 8
    včera 02:33 | Komunita

    V Amsterdamu probíhá Blender Conference 2025. Videozáznamy přednášek lze zhlédnout na YouTube. V úvodní keynote Ton Roosendaal oznámil, že k 1. lednu 2026 skončí jako chairman a CEO Blender Foundation. Tyto role převezme současný COO Blender Foundation Francesco Siddi.

    Ladislav Hagara | Komentářů: 0
    včera 02:22 | Zajímavý článek

    The Document Foundation, organizace zastřešující projekt LibreOffice a další aktivity, zveřejnila výroční zprávu za rok 2024.

    ZCR | Komentářů: 0
    18.9. 17:33 | Nová verze

    Byla vydána nová stabilní verze 7.6 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 140. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    18.9. 16:22 | Nová verze

    Byla vydána verze 1.90.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    18.9. 16:11 | Nová verze

    GNUnet (Wikipedie) byl vydán v nové major verzi 0.25.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (42%)
     (56%)
     (9%)
     (11%)
     (18%)
     (9%)
     (13%)
     (9%)
     (16%)
    Celkem 45 hlasů
     Komentářů: 7, poslední včera 23:32
    Rozcestník

    Dotaz: Synchronizace

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

    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.