eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingjak napisać szybki program › Re: jak napisać szybki program
  • Data: 2009-05-20 08:55:46
    Temat: Re: jak napisać szybki program
    Od: Maciej Sobczak <s...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 19 Maj, 23:08, Michoo <m...@v...pl> wrote:

    > > char my_buffer[my_size];
    >
    > > Niezależnie od metody dane muszą być przetransferowane z/do my_buffer.
    >
    > W przypadku dobrej implementacji (na gruncie czystej teorii - nie chce
    > mi się teraz zastanawiać gdzie to jak jest zaimplementowane - chodzi mi
    > o sam fakt, że jest to jedyny zysk jaki można osiągnąć) i/o kopiowanie
    > danych na drodze dysk->ram, bufor karty sieciowej-> ram, etc powinno być
    > robione "na zewnątrz" procesora (i to w trybie nie odcinającym go od szyny).

    Tak i jest to możliwe zarówno przy synchronicznym jak i
    asynchronicznym I/O.
    Różnica między nimi jest tylko w tym, że pierwszy czeka na zakończenie
    procesu a drugi jest "powiadamiany".

    Oczywiście można sobie też wyobrazić, że w jednym z przypadków system
    korzysta z dodatkowych buforów i wykonuje dodatkowe kopie danych, ale
    to jest kwestia jakości implementacji i nie ma związku z samym
    aspektem synchro/asynchro.

    Dlatego nie ma sensu twierdzić, że AIO daje jakiś zysk w kontekście
    zarządzania buforami.

    > synchroniczne i/o: program robi wywołanie systemowe "czytaj" system
    > wywala wątek z kolejki procesów gotowych i zleca kontrolerowi transfer,
    > po otrzymaniu przerwania od kontrolera proces wraca do kolejki i w
    > najbliższym czasie wraca z wywołania

    Tak.

    > asynchroniczne i/o: program robi wywołanie systemowe "czytaj" system
    > zleca kontrolerowi transfer, wątek powraca z wywołania i może pracować.
    > po otrzymaniu przerwania od kontrolera system powiadamia wątek o
    > zakończeniu operacji.

    To duży skrót myślowy [*], ale przyjmijmy roboczo, że tak jest.
    Trwa to dokładnie tyle samo (bo dysk się kręci tak samo szybko).

    [*] Skrót myślowy polega na tym, że w językach sekwencyjnych nie ma
    czegoś takiego jak "powiadamianie wątku". Są dwa możliwe mechanizmy:
    1. Sygnalizacja (notify) jakiegoś wskazanego obiektu
    synchronizacyjnego. Pozwala to właściwym wątkom roboczym zorientować
    się (blokująco bądź nie), że operacja się zakończyła.
    2. Wywołanie przez callback - to wywołanie odbywa się w *innym* wątku,
    z osobnym stosem, przynajmniej koncepcyjnie (tu wliczamy wszystko od
    sygnałów w C po AsyncHandler w Javie). Zwykle jedyna rzecz jaką można
    w takim callbacku sensownie zrobić to... ręcznie punkt 1.

    To żadna magia, dlatego też w ostatecznym rozrachunku SIO i AIO
    mogą robić to samo, z dokładnością do ilości *śpiących* wątków
    userlandu. W szczególności istnieją implementacje, które robią SIO
    jako nakładkę (!) na AIO albo odwrotnie. To właśnie sprawia, że AIO
    nie jest cudownym rozwiązaniem a ponieważ jest intruzywne i słabo
    komponowalne (nie da się go zastosować do *istniejącego* kodu), to
    powinno być stosowane... ostrożnie.

    > W drugim przypadku wątek może pracować w trakcie kopiowania danych.

    Czyli cały czas mówimy o użyciu współbieżności w celu lepszego
    wykorzystania zasobów sprzętowych. Powtórzę: to nie jest wyłączna
    cecha AIO. Współbieżność jest narzędziem bardziej ogólnym.

    --
    Maciej Sobczak * www.msobczak.com * www.inspirel.com

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: