niedziela, 25 maja 2014

Informatyka uczy i bawi cz. II - "real time in the virtual world, czyli rzecz o czasie i priorytetach"

Zbieram się do napisania tego posta już od czasu opublikowania poprzedniego i zebrać się nie mogę. Takie już moje przekleństwo, że czasu nie mam nigdy. Rzecz o tyle zabawna, że właśnie o poszukiwaniu czasu chciałabym napisać. Tak, wiem. W tytule stoi jak byk, że jeszcze o priorytetach. Rzecz w tym, że moim skromnym zdaniem, te dwie rzeczy łączą się ze sobą nierozerwalnie.
O organizacji czasu napisano już tomiska materiałów, a ludzie nadal mają z tym problem i prawdopodobnie będą mieć po wieki wieków amen. Jeżeli jest się człowiekiem mojego pokroju w tym sensie, że ma się zainteresowań i pomysłów na tyle wiele, że nie ma najmniejszej szansy na to, aby doby starczyło na wszystko, stworzenie sobie satysfakcjonującego planu działania, a co ważniejsze - trzymanie się go, często graniczy z niemożliwością. Odpowiedzi na to jak sobie radzić, dostarcza nam przedziwna dziedzina nauki jaką jest informatyka (ha! Tego się nie spodziewaliście!).

Pierwszym i podstawowym problemem na jaki się natyka człowiek chcący 'zaprogramować' samego siebie do zrealizowania danego planu, wcale nie jest brak motywacji, dezorganizacja czy lenistwo. To po prostu zderzenie z rzeczywistością, naszym realnym życiem, o wyglądzie i zasadach działania którego często zapominamy tworząc swoją listę "TO DO". Czy tego chcemy czy nie, nie możemy traktować siebie jak wyizolowanej maszyny z ciągłym dostępem do źródła energii i w dodatku nie psującej się, dla której wystarczy napisać program punkt po punkcie, a potem tylko szybciutko skompilować, załadować i... voilà! Tylko patrzyć jak się wykonuje. Zapominamy nie tylko o swoich słabościach, ale również, przede wszystkim, o czynnikach zewnętrznych, które nieustannie wpływały, wpływają i wpływać na nas będą.
Jeżeli mimo wszystko chcielibyśmy porównywać się do maszyny, pamiętać należy, że ważniejsze niż zewnętrzna powłoka jest to, co wewnątrz, czyli nasz system operacyjny ("zbiór programów pośredniczących między użytkownikiem, a sprzętem")*. System operacyjny ma za zadanie zarządzać pamięcią, czasem przydzielanym przez procesor ("mózg" maszyny) poszczególnym zadaniom. Jednak system systemowi nie równy i tu zaczyna się cała bajka. Cytując naszą kochaną Wikipedię:
"Najszerszym, ale najbardziej podstawowym kryterium podziału systemów operacyjnych jest podział na:
  • system operacyjny czasu rzeczywistego (RTOS)
  • systemy operacyjne czasowo niedeterministyczne
Podział ten odnosi się do najbardziej podstawowej funkcjonalności systemu operacyjnego jakim jest planowanie i przydział czasu procesora poszczególnym zadaniom."
Zbyt często traktujemy nasz system operacyjny jako ten drugiego rodzaju, co prowadzi do problemów z planowaniem czasu, przydzielaniem priorytetów odpowiednim zadaniom, a w konsekwencji do co najmniej frustracji. Moim zdaniem kluczową kwestią jest zrozumienie, że jeżeli nasz zbiór "programów" siedzących w mózgu składa się na jakiś system, to stanowczo jest to system czasu rzeczywistego. Samo to jednak nic nie mówi, więc omówię pokrótce (tak krótkiej "krótce" jak tylko się da) na czym to mniej więcej polega:

"Systemem czasu rzeczywistego określa się taki system, którego wynik przetwarzania zależy nie tylko od jego logicznej poprawności, ale również od czasu, w jakim został osiągnięty"** - mówiąc prościej - nie tylko to co robimy ma znaczenie, ale równie ważne jest to kiedy to robimy (a raczej zrobimy, bo sprawdza się rezultat). Co się stanie, gdy przez korek na drodze zbyt późno przybędziesz na lotnisko? Co kiedy nie złożysz wymaganych dokumentów w określonym terminie? Co da Ci przypomnienie sobie odpowiedzi na pytanie dawno po wyjściu z egzaminu? Czy kiedy wstajesz rano do pracy ma znaczenie tylko to, że wstałeś, czy również to, o której godzinie?

Należy przy tym pamiętać, że "System czasu rzeczywistego jest systemem który współpracuje z zewnętrznym procesem. Musi on zapewniać wymagany czas reakcji na zewnętrzne zdarzenia."*** - Dla poprawnego i skutecznego działania systemu konieczna jest zatem ścisła współpraca z otoczeniem i płynne reagowanie na zmieniające się okoliczności. Chyba nigdy nie jest tak, że wszystko ułożyło się tak, jak sobie zaplanowaliśmy. Zawsze gdzieś coś nagle "wyskoczy". Musimy jednak być przygotowani właśnie na to, że coś się nie uda. Mieć w zanadrzu odpowiedni schemat działania, aby odpowiednio zachować się w każdej sytuacji. Systemy czasu rzeczywistego mają to do siebie, że muszą w sposób deterministyczny reagować na niedeterministyczne zdarzenia, a my jesteśmy twórcami tego systemu, jego programistami,**** musimy więc zadbać o to, aby mieć na podorędziu zawsze właściwą instrukcję. 

Systemy czasu rzeczywistego dzielimy również wewnętrznie na rygorystyczne, łagodne i mocne. W systemie rygorystycznym nie dotrzymanie terminu wykonania danego działania niesie za sobą katastrofalne skutki (na czele z zagrożeniem ludzkiego życia i zdrowia - tak może być np. w systemach obsługi rakiet) a wykonanie zadania po terminie nie ma całkowicie żadnego znaczenia - odpowiedź systemu jest już nieprzydatna. Nieco inaczej rzecz ma się w łagodnym typie systemów czasu rzeczywistego - tam zadanie przydaje się również po terminie, jednak z czasem jego przydatność gwałtownie spada. Ostatnia wersja to systemy mocne, w których przekroczenie terminu wykonania zadania skutkuje brakiem jego przydatności, jednak nie niesie za sobą straszliwych konsekwencji. Myślę, że nietrudno znaleźć przykłady z życia codziennego, które dopasować można do każdej z tych definicji (zbyt późne hamowanie na drodze, spożycie przeterminowanego produktu, nieterminowe złożenie wniosku na uczelni, sprawiające, że niestety nie uzyskasz stypendium, ale nikt przez to nie zginie... ), można więc powiedzieć, że działamy we wszystkich tych systemach jednocześnie i jest to zależne właściwie głównie od tego jakie zadania mamy do wykonania, oraz jakie wartości nadajemy ich skutkom (dla jednej osoby coś może być katastrofą,a dla innej będzie czymś mało istotnym). Skąd jednak system ma wiedzieć, czy w danym czasie wykonywane jest odpowiednie zadanie? Mówią mu o tym priorytety.

Priorytet jaki jest każdy widzi i chyba nikomu nie trzeba tłumaczyć, że mówi on nam o tym jak bardzo jest coś ważne. W informatyce przyjęło się, że najwyższy priorytet jest opisywany najniższą liczbą (więc zadanie o priorytecie nr. 1 będzie ważniejsze, niż zadanie o priorytecie nr. 3). Działa to więc mniej więcej tak, że zadanie, które otrzymało większy priorytet będzie wykonywane jako pierwsze (skończenie go w terminie ma większe znaczenie, niż skończenie innych). Kwestia właściwego operowania priorytetami jest głównym filarem zarządzania nie tylko swoim czasem, ale generalnie całym życiem. Na podstawie priorytetów ustalamy własne cele, wybieramy studia, pracę, dokonujemy codziennych wyborów itd (w każdym razie tak to wygląda w nieco być może idealistycznym założeniu). Za rozdzielanie zasobów pomiędzy poszczególne procesy w komputerze odpowiedzialny jest planista (algorytm szeregujący). W swoim życiu rolę planisty pełnisz Ty (sorry, znów wszystko na Twojej głowie). Czyż więc zarządzanie priorytetami miało być drogą do sukcesu? Tak. Przy założeniu, że zarządza się nimi właściwie:

  • Po pierwsze, w każdej sytuacji trzeba umieć określić co jest najważniejsze. Zazwyczaj nie jest to proste. Każdego dnia priorytety poddawane są rotacji - przy względnie stałych priorytetach "życiowych", priorytety chwilowe zależne będą głównie od czynników zewnętrznych i aktualnych potrzeb oraz terminów określających do kiedy należy zrealizować pewne zadania. 
  • Niezmiernie ważne jest pamiętanie o konieczności wywłaszczania zasobów procesora dla procesów/ zadań o charakterze krytycznym. Inwersja priorytetów w przypadku konieczności reagowania na zewnętrzne zdarzenia nie jest powodem do plucia sobie w brodę - wyrzuty sumienia związane z tym, że ze względu na pojawienie się sytuacji krytycznej, na którą trzeba było zareagować, nie wykonało się jakiejś innej zaplanowanej czynności, są zwyczajnie nie na miejscu ;)
  • Jeżeli chcemy aby nasz system działał prawidłowo, musimy być przygotowani na obsługę przerwań i wyjątków czyli wszelkich zdarzeń pochodzących zarówno z wnętrza maszyny jak i jej otoczenia, które wpływają często w znaczący sposób na przebieg wykonywanych procesów zaburzając je. Sytuacje takie to chleb powszedni nawet najlepiej działających maszyn opartych na najbardziej niezawodnych systemach - ich niezawodność polega bowiem m.in. na sprawnej obsłudze przerwań i wyjątków, dzięki czemu system nie "zdycha" przy każdym najmniejszym zaburzeniu wstępnie założonych planów. 

Aby nie przedłużać mojego wpisu, pozwolę sobie w tym miejscu na krótkie podsumowanie. Do sprawnej organizacji swojego czasu, a przez to wpływania na osiągane wyniki, konieczne są dwie rzeczy - świadomość tego, że system na którym pracujemy nie jest wyizolowany od otoczenia, ale ściśle z nim współpracuje, oraz sprawne zarządzanie priorytetami. Pozwala nam to lepiej przygotować się na sytuacje, na które wydawałoby się, przygotowanie jest niemożliwe oraz dużo łatwiej zaakceptować to jak żyjemy, działamy i kim jesteśmy (na pewno nie maszyną ściśle realizującą punkt po punkcie "program" z listy "to do"). Z systemami czasu rzeczywistego związane jest wiele komplikacji i założeń, które musi on spełniać (np. umożliwienie wykonywania procesów wielowątkowych) co sprawia, że każdy mocno uproszczony model działania mający na celu organizację czasu, będzie obarczony długą listą wad. Z drugiej strony zbytnia komplikacja modelu sprawiłaby, że nie dałoby się z niego korzystać. Dlatego należy znaleźć swój własny model o właściwym poziomie uproszczenia, który będzie miał szansę zadziałać w naszym przypadku.

Na sam koniec jeszcze jedna rzecz - dobrze działający system czasu rzeczywistego to niekoniecznie system szybki. To po prostu system, który w odpowiednim czasie generuje stosowną odpowiedź. Jaki to odpowiedni czas zależy tak naprawdę głównie od Ciebie. Aby być spełnionym, nie potrzebujesz być szybszym od innych, sprawniejszym w reagowaniu na pewne zdarzenia i nabywaniu umiejętności. Jedyne co się liczy, to spójność i bezpieczeństwo Twojego systemu, a on ma swój własny czas na wszystko.

c.d.n.


*http://pl.wikibooks.org/wiki/Informatyka_dla_gimnazjum/System_operacyjny** "Systemy czasu rzeczywistego" - slajdy z wykładu na Katedrze Mikroelektroniki i Technik Informatycznych DMCS
*** J. Ułasiewicz Komputerowe systemy sterowania
**** Hej, hej. To jesteśmy maszynami, procesorami, adminami i jeszcze programistami? Ktoś tu jest niespójny? Nie. Sorry. Takie jest życie, czasem trzeba być wszystkim na raz, bo nikt inny za nas roboty nie odwali. Owszem, swoich procesów nie programujemy całkowicie samodzielnie. Na wiele rzeczy mamy mocno ograniczony wpływ. Stosuję tu swego rodzaju uproszczenie. Na domiar złego okaże się, że jesteśmy nie tylko tym wszystkim co wymieniłam, ale jeszcze czymś innym, o czym piszę nieco dalej. 

Brak komentarzy:

Prześlij komentarz