Hlavní navigace

Názory k článku Programování pod Linuxem pro všechny (15)

  • Článek je starý, nové názory již nelze přidávat.
  • 7. 5. 2004 11:02

    Ivan (neregistrovaný)

    A co klicove slove __thread ? Kazke vlakno ma svuj
    segment a thread promenne se ukladaji tohoto segmentu
    a jsou vzdy prefixovany registrem GS. Pri prepnuti vlaken dochazi ke zmene hodnoty v registru GS.
    Aplikace, ktere si neco ukladaji do tohoto registru
    musi pouzivat spec. verzi knihovny libc z adresare
    /lib/tls

  • 8. 5. 2004 19:30

    Martin (neregistrovaný)

    Bohužel jsem začal číst tuto sérii článků pozdě, takže mé dotazy by patřili spíše někam na začátek série článků, snad nebude vadit, když se zeptám až teď. Já osobně navrhuji hardware a o tohle se spíše zajímám jen ze zvědavosti, protože bych chtěl vědět jak to funguje pro mě někde ve "vyšších sférách". Spíše vytvářím "programy" ve VHDL pro hradlová pole a občas programuji v assembleru pro nějaké jednoduché
    mikrokontroléry, ale rychle k otázkám

    1) vlákna jsou vlastně užitečná pouze proto, že umožňují rozdělit nějaký vykonávaný algoritmus nebo program na více částí, který pak v případě vykonávání na jednom procesoru běží jakoby "současně"? Takže velmi hypotetický příklad: program příjme požadavek na náročný výpočet a zároveň požadavek na vykreslení nějakého náročného vektorového obrázku (předpokládám, že úlohy jsou na sobě nezávislé, ale realizované jedním programem). Spustím tedy dvě vlákna, jedno na výpočet a druhé na vykreslení obrázku. Obě úlohy se řeší "současně", ale relativně pomaleji (jsou spuštěny dvě vlákna a mezi nimi OS přepíná). Nicméně to jde udělat i tak, že nejprve provedu výpočet relativně rychleji než v předchozím případě a pak relativně rychleji vykreslím obrázek. Je tedy nějaký druh úloh, které by se bez použití vláken neobešli nebo by se realizovali bez použití vláken velmi těžko?

    2) kdysi jsem psal nějaký program pro mikrokontrolér v assembleru, který řešil několik úloh "najednou" v reálném čase (kvůli bezpečnosti jsem nepoužíval přerušení). Napsal jsem si tedy prográmek, který obíhal jednu úlohu po druhé a vždy ji v případě potřeby spustil. Spuštěná úloha nicméně vždy musela bezpodmínečně a v co nejkratším čase vrátit řízení prográmku, který obíhal úlohy. Pokud byla úloha špatně napsaná a z nějakého důvodu nevrátila řízení, tak byl samozřejmě průšvih, protože se nemohla nikdy spustit jiná další úloha. Takže ten prográmek co obíhal a spouštěl úlohy podle mě pracoval podobně jako nějaký OS s multitaskingem. Zajímalo by mě jak se to řeší v OS. Myslím to, že OS přidělí na určitý čas procesor nějaké úloze a pak OS úlohu přeruší a přidělí procesor jiné úloze. Zajímá mě hlavně to, jak může OS nějakým způsobem zasáhnout a přerušit úlohu, když právě procesor vykonává instrukce procesoru, které patří programu nějaké úlohy. To se pravidelně spouští nějaké přerušení, které přeruší spuštěnou úlohu a spouští nějakou funkci, která vrací řízení OS. Nebo se při překladu programu do instrukcí procesoru pro určitý OS vkládají nějaké funkce, na které když program narazí, tak se vrátí řízení OS?

    Omlouvám se za poněkud delší otázky, ale snažil jsem se to popsat tak, abyste konkrétně věděli co mám na mysli. Díky za případné odpovědi.

  • 9. 5. 2004 12:23

    Jerry III (neregistrovaný)

    1) V podstate spravne, vlakna sou takovy procesy v procesu (sdileji pamet a tak dal narozdil od opravdovych procesu). Na vice procesorovych systemech muzou bezet dve vlakna jednoho procesu najednou, coz je neco co zvlaste programatorum ovladacu HW dela hodne problemy, protoze pokud se to stane (a je to opravdu bezna vec) tak ten kdo ten kod psal musi opravdu vedet co dela aby si neprepisoval pamet.

    2) To co si napsal ty je primitivni kooperativni multitasking, dnesni systemy pouzivaj preemptivni, kterej je opravdu rizenej prerusenima (takze zadna aplikace nemuze nevratit kontrolu). Opet, cela problematika toho co se pusti je podstatne slozitejsi, ale to uz si najdi sam (hezky to bylo popsane v serialu o BSD zde na rootu).

  • 12. 5. 2004 12:43

    anonymní

    Existuje nejakej jednoduchej zpusob jak v Linuxu zkontrolovat zda vlakno skoncilo a pokud ne tak necekat, ale hned pokracovat (asi jako waitpid s WNOHANG u procesu) ?

  • 24. 9. 2004 16:08

    JeRRy (neregistrovaný)

    Jakto ze se to musi resit takto ?
    Prece funkce thread_function je handler tohoto vlakna
    a kazdy vlakno bude mit svuj vlastni zasobnik
    NE?
    takze lokalni promene
    char thread_log_filename[20];
    FILE *thread_log;
    budou pro kazde vlakno rozdilne a nebudou si ovlivnovat navzajem ne ?
    prece neni ANI GLOBALNI ANI STATIC viz manualove stranky (A NEBO JSEM TO SPATNE POCHOPIL).