<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Hery's Devlog</title>
	<atom:link href="http://pdziepak.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pdziepak.wordpress.com</link>
	<description></description>
	<lastBuildDate>Thu, 02 Apr 2009 10:32:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='pdziepak.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Hery's Devlog</title>
		<link>http://pdziepak.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://pdziepak.wordpress.com/osd.xml" title="Hery&#039;s Devlog" />
	<atom:link rel='hub' href='http://pdziepak.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Very Concurrent Garbage Collection</title>
		<link>http://pdziepak.wordpress.com/2009/03/31/very-concurrent-garbage-collection/</link>
		<comments>http://pdziepak.wordpress.com/2009/03/31/very-concurrent-garbage-collection/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 21:38:42 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[grabage collector]]></category>
		<category><![CDATA[inferno]]></category>
		<category><![CDATA[mark and sweep]]></category>
		<category><![CDATA[marker]]></category>
		<category><![CDATA[mutator]]></category>
		<category><![CDATA[odśmiecanie pamięci]]></category>
		<category><![CDATA[sweeper]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=60</guid>
		<description><![CDATA[Jednym z głównych problemów związanych z wykorzystaniem garbage collectora jest możliwość dość drastycznego spadku wydajności w nieoczekiwanych momentach. Z tego powodu odśmiecanie pamięci zwykle nie może zostać zastosowane w systemach czasu rzeczywistego, a także w innych sytuacjach gdzie wydajność programu jest istotna. Twórcy systemu Inferno stworzyli algorytm Very Concurrent Garbage Collection (VCGC), którego zadaniem jest [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=60&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Jednym z głównych problemów związanych z wykorzystaniem <em>garbage collectora</em> jest możliwość dość drastycznego spadku wydajności w nieoczekiwanych momentach. Z tego powodu odśmiecanie pamięci zwykle nie może zostać zastosowane w systemach czasu rzeczywistego, a także w innych sytuacjach gdzie wydajność programu jest istotna. Twórcy systemu Inferno stworzyli algorytm <em>Very Concurrent Garbage Collection</em> (VCGC), którego zadaniem jest zminimalizowanie tych problemów.</p>
<h3>Równoległe przetwarzanie</h3>
<p>System Inferno jest systemem rozproszonym. Powoduje to, że programowanie równoległe jest zalecanie i potrafi przynieść dość duży wzrost wydajności. Dlatego też istotą VGCG jest możliwość wykonywania procesu odśmiecania na wielu wątkach. Każdy z trzech elementów garbage collectora typu <em>mark &amp; sweep</em> (jakim jest VGCG) jest całkowicie niezależny od pozostałych i może działać w oddzielnym wątku bez potrzeby używania dodatkowych mechanizmów synchronizacji.</p>
<p>Niezależność poszczególnych operacji związanych z odśmiecaniem pozwala przenieść je na inny procesor dzięki czemu właściwe wykonywanie programu nie jest w żaden sposób dodatkowo spowalniane i działa tak samo wydajnie jak w sytuacji gdy garbage collector nie jest używany.</p>
<h3><em>Mark &amp; sweep</em></h3>
<p>Najpopularniejszym rodzajem algorytmów odśmiecania pamięci jest <em>mark &amp; sweep.</em> Polega on na zlokalizowaniu i oznaczeniu wszystkich używanych obszarów pamięci (czyli takich do których istnieją odwołania) a następnie zwolnieniu pozostałego miejsca. Zwykle garbage collector tego typu składa się z trzech elementów:</p>
<ul>
<li><em>mutator</em> &#8211; właściwy kod programu, w nim znajduje się kod zajmujący się przydzielaniem pamięci na żądanie aplikacji</li>
<li><em>marker</em> &#8211; wyszukuje i oznacza nieużywane obiekty w pamięci</li>
<li><em>sweeper</em> &#8211; zwalnia obiekty które <em>marker</em> uznał za nieużywane</li>
</ul>
<h3>Epoki</h3>
<p>Czas działania programu jest podzielony na epoki. Podczas każdej z nich w osobnych wątkach uruchomione zostają poszczególne elementy garbage collectora (muatator, marker i sweeper). Dodatkowo każdej epoce jest przyporządkowany jeden z trzech kolorów: <code>COLOR(epoch) = epoch mod 3</code>.</p>
<h3>Przydzielanie pamięci</h3>
<p>Pamięć jest przydzielana przy użyciu <em>free lists</em>. Jest to lista wskazujących na siebie wolnych bloków pamięci. Dzięki temu, że każdy wolny blok zawiera wskaźnik na następny, nie ma potrzeby tworzenia dodatkowych struktur danych do przechowywania tego typu informacji. Każdy przydzielany w ten sposób obiekt jest oznaczony kolorem aktualnie trwającej epoki.</p>
<h3>Marker</h3>
<p>W każdej epoce marker porusza się po wskazujących na siebie obiektach. Jeżeli kolor obiektu jest inny niż kolor aktualnej epoki marker uaktualnia go a następnie rekursywnie przegląda wszystkie bloki na które wskazuje dany obiekt. Gdy marker zakończy działanie wszystkie używane obiekty mają kolor danej epoki.</p>
<p>Warto zauważyć że mutator i marker w żaden sposób nie wpływają na swoje działanie. Mutator oznacza wszystkie nowe obiekty kolorem aktualnej epoki, a ten jest przez markera ignorowany. Istotny jest także fakt, że marker nigdy nie spotka bloku oznaczonego kolorem innym niż kolor aktualnej, bądź poprzedniej epoki.</p>
<h3>Sweeper</h3>
<p>Sweeper przegląda listę przydzielonych bloków w poszukiwaniu obiektów oznaczonych kolorem epoki <code>COLOR(epoch-2)</code>. Jeśli natrafi na taki obszar pamięci to jest on zwalniany. Jest to operacja całkowicie bezpieczna ponieważ ani marker ani mutator nie mają dostępu do obiektów oznaczonych takim kolorem.</p>
<p>W przypadku natrafienia przez sweeper bloków o innym kolorze są one ignorowane, ponieważ wciąż mogą być w użyciu przez pozostałe elementy programu.</p>
<h3>Zakończenie epoki</h3>
<p>Gdy sweeper i marker zakończą pracę program przechodzi do kolejnej epoki o nowym kolorze i cały proces zaczyna się od nowa. Dzięki całkowitej niezależności poszczególnych elementów od siebie mutator, marker i sweeper mogą działać równolegle bez potrzeby wprowadzania blokad, co korzystnie wpływa na wydajność systemu.</p>
<h3>Podsumowanie</h3>
<p>Obecnie bardzo wiele języków programowania oferuje wbudowany <em>garbage collector</em> dlatego rozwój algorytmów tego typu nie jest niczym dziwnym. Dlatego taż warto dowiedzieć się na jakiego rodzaju rozwiązania można w tej dziedzinie natrafić.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=60&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/03/31/very-concurrent-garbage-collection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Inferno, Plan 9 i maszyny wirtualne</title>
		<link>http://pdziepak.wordpress.com/2009/03/24/inferno-plan-9-i-maszyny-wirtualne/</link>
		<comments>http://pdziepak.wordpress.com/2009/03/24/inferno-plan-9-i-maszyny-wirtualne/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 21:52:56 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[bell labs]]></category>
		<category><![CDATA[dis]]></category>
		<category><![CDATA[garbage collector]]></category>
		<category><![CDATA[inferno]]></category>
		<category><![CDATA[limbo]]></category>
		<category><![CDATA[maszyna wirtualna]]></category>
		<category><![CDATA[plan 9]]></category>
		<category><![CDATA[styx]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=57</guid>
		<description><![CDATA[Historia Uniksa sięga końca lat 60 XX wieku. Tymczasem wiele systemów operacyjnych wciąż opiera się na przyjętych w nim, często już nieaktualnych, założeniach. Oczywiście takie systemy jak Solaris czy rodzina *BSD wprowadzają dużo dodatkowych technologii, ale wciąż są w pewien sposób ograniczane przez swoich poprzedników i oparte na nich standardy. Jest to główną przyczyną powstawania [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=57&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Historia Uniksa sięga końca lat 60 XX wieku. Tymczasem wiele systemów operacyjnych wciąż opiera się na przyjętych w nim, często już nieaktualnych, założeniach. Oczywiście takie systemy jak Solaris czy rodzina *BSD wprowadzają dużo dodatkowych technologii, ale wciąż są w pewien sposób ograniczane przez swoich poprzedników i oparte na nich standardy.</p>
<p>Jest to główną przyczyną powstawania systemów eksperymentalnych. Brak zgodności ze standardami czy brak nacisku na niektóre aspekty (najczęściej jest to wydajność) powodują, że z reguły nie nadają się one do użytku codziennego, czy to jako serwer czy jako desktop. W żaden sposób nie zmniejsza to jednak wartości takich projektów. Są nimi, między innymi rozwijane przez Bell Labs systemy <em>Plan 9</em> oraz <em>Inferno</em>, które w założeniu mają być następcami Uniksa.</p>
<h3>Zasoby i pliki</h3>
<p>W systemach Inferno i Plan 9 każdy zasób jest reprezentowany przez plik. Przypomina to założenia projektowe Uniksa ale jest na to kładziony jeszcze większy nacisk. Każde urządzenie, proces, sieć, połączenie sieciowe czy nawet otwarte okno jest osobnym plikiem. Dodatkowo zawartość tych plików może być generowana dynamicznie w zależności od stanu zasobu lub konkretnego klienta.</p>
<p>Wyspecjalizowane sterowniki najczęściej są reprezentowane przez katalog zawierający pliki <code>data</code> i <code>ctl</code>. Pierwszy z nich służy do operacji wejścia-wyjścia, podczas gdy drugi jest używany do konfiguracji i kontroli urządzenia. Innym ciekawym przykładem jest nawiązywanie połączeń TCP, które odbywa się poprzez serię zapisów do odpowiednich plików reprezentujących konkretny sterownik.</p>
<p>Także, wszelkie usługi i serwery są reprezentowane jako pliki. Jeżeli program w celu nawiązania połączenia internetowego potrzebuje adresu IP serwera obsługującego daną domenę otwiera plik reprezentujący usługę DNS i za jego pomocą uzyskuje odpowiednie informacje. Najczęściej dzieje się to poprzez wpisanie do pliku nazwy domeny, a następnie odczytanie adresu IP. To rozwiązanie jest szczególnie wygodne, zwracając uwagę na fakt, że zarówno lokalne i jak i zdalne zasoby są w ten sposób reprezentowane. Wspomniany serwer DNS wcale nie musi działać na tym samym komputerze.</p>
<p>Prawa dostępu do plików pozwalają jednocześnie dokładnie określić prawa dostępu do poszczególnych usług, zasobów i urządzeń. Natomiast przechowywanie wszystkich obiektów (także np. połączeń sieciowych czy procesów) w postaci plików upraszcza wewnętrzną budowę systemu. Jedyny sztywno zapisany interfejs dotyczy samej obsługi systemu plików podczas gdy cała reszta jest oparta na plikach.</p>
<h3>Styx</h3>
<p>Traktowanie każdego zasobu czy usługi jako osobnego pliku wymaga odpowiedniego protokołu usprawniającego komunikację w systemach rozproszonych. Jego zadanie jest zbliżone do NFS, lecz można wskazać pewne wyraźne różnice. Przede wszystkim NFS jest przystosowany głównie do obsługi zwykłych plików, a nie np. generowanych w <em>procfs</em>. Styx jest przystosowany do obsługi każdego rodzaju plików.</p>
<p>Każde odwołanie się klienta do systemu plików jest tłumaczone na szereg komunikatów protokołu Styx. Dla zapewnienia bezpieczeństwa wspierana jest autoryzacja klientów przy pomocy certyfikatów, a także szyfrowanie transmisji. Jest to mechanizm całkowicie niewidoczny dla aplikacji korzystających z protokołu Styx.</p>
<h3>Limbo</h3>
<p>Programy dla systemów Plan 9 oraz Inferno są pisane w specjalnie do tego zaprojektowanym języku programowania Limbo. Jest on kompilowany do kodu pośredniego wykonywanego następnie przez maszynę wirtualną <em>Dis</em>. Limbo jest także językiem bezpiecznym oferującym silną kontrolę zgodności typów.</p>
<p>Limbo oferuje także kanały jako mechanizm komunikacji między procesami. Każdy kanał ma ściśle określony typ. Wymiana danych jest synchronizowana: proces, który chce wysłać lub odebrać dane musi czekać na gotowość drugiego procesu. Możliwe jest także utworzenie buforowanych kanałów które nie wymagają blokowania procesów z nich korzystających.</p>
<p>Programy są zbudowane z modułów. Każdy moduł oferuje określony publiczny interfejs. Możliwe jest załadowanie wielokrotnie tego samego modułu z różnymi implementacjami. Kod jest wykonywany przez procesy, które przypominają swoim wyglądem i zachowaniem wątki w innych systemach operacyjnych.</p>
<h3>Dis</h3>
<p>Do uruchamiania programów napisanych w języku <em>Limbo</em> Inferno używa maszyny wirtualnej <em>Dis</em>. Podczas gdy większość języków programowania tego typu, domyślnie używa stosowych maszyn wirtualnych, Dis jest maszyną rejestrową. Twórcy tłumaczą to nieznacznie wyższą wydajnością oraz łatwością przystosowania maszyny do działania na innej platformie sprzętowej. Uważają, także że maszyna wirtualna powinna jak najbardziej przypominać architektury na których pracuje.</p>
<p>Kod może być przez Dis kompilowany <em>just-in-time</em> lub interpretowany przez odpowiednią bibliotekę. Niezależnie od tego jest on umieszczony w osobnym obszarze pamięci do którego nie można uzyskać dostępu żadną z instrukcji oferowanych przez Dis.</p>
<p>Dane są podzielone na globalne, wspólne dla całego kodu zawartego w danym module oraz lokalne dla danej funkcji, umieszczone na stosie. Dostęp do nich uzyskuje się korzystając z adresów bazowych zawartych odpowiednio w rejestrach <code>mp</code> (<em>module pointer</em>) i <code>fp</code> (<em>frame pointer</em>). Można także podawać bezpośrednie adresy w przestrzeni danych programu, nie korzystając z tych rejestrów.</p>
<p>Dis oferuje zestaw instrukcji podobny do procesorów CISC. Różni się on głównie o wiele wyższym poziomem abstrakcji. Oprócz podstawowych instrukcji takich jak <code>jmp</code> czy <code>mov</code> oferowany jest także zestaw instrukcji wspomagający operacje na tablicach, alokację pamięci, czy ładowanie modułów.</p>
<h3>Format plików</h3>
<p>Dis obsługuje własny format plików wykonywalnych, stworzony specjalnie po to aby dostosować się do jego szczególnych właściwości. Każdy taki plik wykonywany przez maszynę wirtualną składa się z sześciu części:</p>
<ul>
<li><strong>nagłówek</strong> &#8211; zawiera sygnaturę pozwalającą rozpoznać format pliku, a także sprawdzić czy jest podpisany (i ewentualnie zawiera także podpis). Z tej sekcji Dis odczytuje wszystkie wymagania programu odnośnie środowiska w jakim będzie uruchomiony. Możliwe opcje to np. wymuszenie kompilacji JIT lub interpretacji kodu. Inne informacje przechowywane w nagłówku to rozmiary pozostałych sekcji oraz punkt wejścia programu.</li>
<li><strong>kod</strong> &#8211; jest to sekcja zawierająca ciąg instrukcji maszyny wirtualnej. Każda instrukcja składa się z <em>opcode</em>, sposobu adresowania i trzech argumentów.</li>
<li><strong>sekcja typów</strong> &#8211; umieszczone są w niej deskryptory umożliwiające lokalizację wszelkich wskaźników i referencji w każdym obiekcie. Każdy deskryptor zawiera mapę bitową w której każdy bit reprezentuje jedno słowo. Jeżeli bit jest ustawiony oznacza to, że dane słowo jest wskaźnikiem na inny obiekt.</li>
<li><strong>dane</strong> &#8211; ta sekcja zawiera dane dostępne później przy użyciu rejestru <code>mp</code>. Każdy wpis w tej sekcji opisuje rodzaj danych, ich położenie, typ i ewentualnie ilość obiektów.</li>
<li><strong>nazwa modułu</strong></li>
<li><strong>sekcja linków</strong> &#8211; jest to sekcja używana do dynamicznej konsolidacji modułów. Zawiera informacje o wszystkich eksportowanych funkcjach: nazwę, wskaźnik oraz informację o typie argumentów.</li>
</ul>
<h3>Odśmiecanie</h3>
<p>Przechowywane informacje o typach pozwalają na realizację systemu odśmiecania pamięci. W celu polepszenia wydajności składa się on z dwóch mechanizmów. Pierwszy z nich to zwykłe zliczanie referencji &#8211; proste i stosunkowo szybkie. Nie nadaje się jednak do usuwania obiektów wzajemnie do siebie odwołujących się. Z tego powodu jest także stosowany algorytm <em>Very Concurrent Garbage Collection</em> (VCGC). Pozwala on na zrównoleglenie procesu odśmiecania i tym samym wykorzystania faktu, że Inferno jest systemem rozproszonym. Dzięki temu, że odśmiecanie nie przerywa działania głównego programu możliwe jest zbudowanie systemu czasu rzeczywistego. Sam algorytm VCGC jest tematem na osobny artykuł. Dis umożliwia wykorzystywanie zliczania referencji, VCGC lub hybrydy obu tych rozwiązań.</p>
<h3>Podsumowanie</h3>
<p>Inferno i Plan 9 mają za zadanie rozwinąć technologie mogące zastąpić Uniksa. Pod pewnymi względami kontynuują przyjęte w nim założenia (<em>&#8220;wszystko jest plikiem&#8221;</em>), lecz z drugiej strony maszyna wirtualna jest odmienną technologią wykorzystywaną w wielu nowoczesnych językach programowania. Są to systemy niewątpliwie bardzo ciekawe i warto im się bliżej przyjrzeć.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=57&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/03/24/inferno-plan-9-i-maszyny-wirtualne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Programowanie aspektowe</title>
		<link>http://pdziepak.wordpress.com/2009/03/17/programowanie-aspektowe/</link>
		<comments>http://pdziepak.wordpress.com/2009/03/17/programowanie-aspektowe/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 20:53:07 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[advice]]></category>
		<category><![CDATA[aspectc++]]></category>
		<category><![CDATA[aspectj]]></category>
		<category><![CDATA[aspekt]]></category>
		<category><![CDATA[joinpoint]]></category>
		<category><![CDATA[klasa]]></category>
		<category><![CDATA[obiekt]]></category>
		<category><![CDATA[obserwator]]></category>
		<category><![CDATA[pointcut]]></category>
		<category><![CDATA[programowanie aspektowe]]></category>
		<category><![CDATA[programowanie obiektowe]]></category>
		<category><![CDATA[weaver]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=52</guid>
		<description><![CDATA[Jednym z niepożądanych zjawisk dość często pojawiających się przy tworzeniu aplikacji w oparciu o programowanie zorientowane obiektowo jest nadmierny rozrost metod. Najczęściej muszą one wykonać szereg dodatkowych operacji (sprawdzenie uprawnień, poprawności danych, logowanie czynności, itp.) zanim przystąpią do wykonywania głównego zadania. Często można sobie z tym poradzić uwzględniając takie ewentualności w projekcie aplikacji, zwykle nie [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=52&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Jednym z niepożądanych zjawisk dość często pojawiających się przy tworzeniu aplikacji w oparciu o programowanie zorientowane obiektowo jest nadmierny rozrost metod. Najczęściej muszą one wykonać szereg dodatkowych operacji (sprawdzenie uprawnień, poprawności danych, logowanie czynności, itp.) zanim przystąpią do wykonywania głównego zadania. Często można sobie z tym poradzić uwzględniając takie ewentualności w projekcie aplikacji, zwykle nie jest to jednak idealne rozwiązanie. W tym celu powstała idea <em>programowania zorientowanego aspektowo</em>, które jest przystosowane właśnie do radzenia sobie z tego typu problemami.</p>
<h3>Podstawowe założenia</h3>
<p>Programowanie zorientowane aspektowo w żadnej swojej formie nie wyklucza programowania obiektowego. Właściwie to jest jego uzupełnieniem dostarczającym dodatkowe elementy pozwalające inaczej spojrzeć na projekt aplikacji. Aspektowe języki programowania pozwalają na wskazanie miejsc w kodzie obiektowym w których mają zostać wykonane dodatkowe operacje. Istnieje wiele implementacji tego, lecz zdecydowanie najbardziej popularny jest <em>AspectJ</em> stworzony dla Javy. Wprowadza on następujące elementy:</p>
<ul>
<li><strong>pointcut</strong> &#8211; ogólny opis miejsca przecięcia kodu w którym mają zostać wykonane operacje definiowane przez aspekt. W większości sytuacji jest to wywołanie lub wykonanie kodu funkcji składowej, ale możliwe jest także zdefiniowanie pointcuta przy każdej operacji wykonanej przez metody w danej klasie. Pointcuty mogą także dotyczyć każdego dostępu do pola lub tworzeniu obiektu.</li>
<li><strong>joinpoint</strong> &#8211; konkretne miejsce przecięcia kodu w którym zostaną wstawione dodatkowe operacje definiowane przez dany aspekt.</li>
<li><strong>advice</strong> &#8211; definiuję operację jaka ma zostać wykonana w <em>joinpointach</em>. Kod opisany w <em>advices</em> jest najczęściej wstawiany przed lub po wywołaniu metody w klasie, ale także w przypadku rzucenia wyjątku lub oryginalna funkcja składowa zostaje całkowicie przez niego zastąpiona.</li>
</ul>
<p>W przypadku AspectJ a także wielu innych języków aspekt jest traktowany jak klasa. Oprócz wyżej opisanych elementów może zawierać funkcje składowe lub pola. Mogą być tworzone ich instancje, ale najczęściej aspekt jest singletonem. Dodatkowo można utworzyć hierarchię aspektów korzystając z dziedziczenia. Wiele implementacji pozwala także na istnienie abstrakcyjnych aspektów oraz wirtualnych <em>pointcutów</em>.</p>
<h3>Realizacja</h3>
<p>W przypadku Javy i AspectJ aspekty są realizowane w czasie kompilacji z niewielkim wsparciem refleksyjności dzięki czemu nie wpływają w dużym stopniu na wydajność. W przypadku AspectC++ w związku brakiem wsparcia dynamicznego metaprogramowania ze strony C++ kod aspektowy (napisany w AspectC++) jest najpierw tłumaczony do kodu obiektowego (C++) i dopiero wtedy kompilowany. Bibliotek wprowadzająca aspekty w C# LOOM.NET wykonuje wszystkie operacje z tym związane podczas działania programu, podobnie rzecz się ma w przypadku modułu Perla <em>Aspect</em>. Generalnie sposób realizacji jest inny dla różnych bibliotek i także powinien być świadomym wyborem ponieważ, może w dość dużym stopniu wpłynąć na wydajność programu.</p>
<h3>Zastosowanie</h3>
<p>Najbardziej oczywistymi zastosowaniami programowania aspektowego to wszelkiej maści loggery i narzędzia diagnostyczne. Można także użyć ich do kontrolowania zgodności otrzymanych danych z kontraktami, ale należy pamiętać, że wiele zalet aspektów jest zauważalna dopiero wtedy gdy odnoszą się do tych samych operacji wykonywanych w wielu metodach. Przykładem może być realizacja wzorca Obserwator, gdzie każda zmiana stanu obiektu obserwowanego wymaga poinformowania o niej obiekty obserwujące. W tym przypadku najlepszym rozwiązaniem jest wstawienie po wywołaniu każdej metody (nie oznaczonej jako <code>const</code>) klasy obiektu obserwowanego wywołania metody uaktualniającej obiekty obserwujące.</p>
<h3>Przykład</h3>
<p>Warto przedstawić prosty przykład użycia aspektów w realizacji wzorca Obserwator. Zwykłe podejście wymagałoby czegoś podobnego do kodu poniżej:</p>
<pre>
class Obserwowany {
	// ...
	public void metoda1(int wartość) {
		// ... operacje ...

		uaktualnijObserwatorów();
	}

	public void metoda2(string tekst) {
		// ... operacje ...

		uaktualnijObserwatorów();
	}
}
</pre>
<p>W przypadku AspectJ kod realizujący te same funkcje mógłby wyglądać następująco:</p>
<pre>
class Obserwowany {
	// ...
	public void metoda1(int wartość) {
		// ... operacje ...
	}

	public void metoda2(string tekst) {
		// ... operacje ...
	}
}

aspect WzorzecObserwator {
	pointcut operacja() : execution(public * Obserwowany.*(..));
	after() : operacja() {
		uaktualnijObserwatorów();
	}
}
</pre>
<p>Ten przykład bardzo dobrze prezentuje główne założenie aspektów. Jest nim pozbycie się często powtarzanego kodu niezwiązanego z głównym przeznaczeniem metody z jej kodu. Taka izolacja ma na celu sprawienie kodu bardziej przejrzystym i ułatwienie wprowadzenia ewentualnych zmian.</p>
<h3>Problemy</h3>
<p>Głównym problemem związanym z programowaniem aspektowym jest fakt, że sam pomysł jest stosunkowo młody i w związku z tym wsparcie jest wciąż niewielkie. O ile ze znalezieniem odpowiednich narzędzi nie powinno być problemów to kwestia przyzwyczajenia programistów i to, że języki modelowania takie jak UML nie zostały stworzone z myślą o aspektach sprawiają, że wciąż nie zyskało dużej popularności.</p>
<h3>Podsumowanie</h3>
<p>Programowanie aspektowe, mimo że z niskopoziomowego punktu widzenia nie zmienia praktycznie niczego, to bez wątpienia jest w stanie wprowadzić pewne uporządkowanie w miejscu gdzie typowe programowanie obiektowe pozostawiło dużą swobodę. Rozwiązanie ciekawe, ale jest tylko jednym z wielu sposobów na ominięcie pewnych problemów co sprawia, że nie odnosi, jak na razie, spektakularnych sukcesów.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=52&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/03/17/programowanie-aspektowe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Choices</title>
		<link>http://pdziepak.wordpress.com/2009/03/10/choices/</link>
		<comments>http://pdziepak.wordpress.com/2009/03/10/choices/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 17:34:39 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[choices]]></category>
		<category><![CDATA[microreboot]]></category>
		<category><![CDATA[mikrorestart]]></category>
		<category><![CDATA[server state region]]></category>
		<category><![CDATA[serwer]]></category>
		<category><![CDATA[ssr]]></category>
		<category><![CDATA[transakcje]]></category>
		<category><![CDATA[wyjątek]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=49</guid>
		<description><![CDATA[Jedną z cech systemów operacyjnych na którą zwykle kładzie się duży nacisk jest ich niezawodność i stabilność. W tym celu starano się rozwijać mikrojądra, które dzięki większej izolacji poszczególnych elementów systemu zmniejszają podatność na błędy. Także wykorzystanie bezpiecznych języków (jak np. w Singularity) jest pewnym krokiem w kierunku zwiększenia niezawodności systemów. Innym projektem wykorzystującym pewne [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=49&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Jedną z cech systemów operacyjnych na którą zwykle kładzie się duży nacisk jest ich niezawodność i stabilność. W tym celu starano się rozwijać mikrojądra, które dzięki większej izolacji poszczególnych elementów systemu zmniejszają podatność na błędy. Także wykorzystanie bezpiecznych języków (jak np. w <em>Singularity</em>) jest pewnym krokiem w kierunku zwiększenia niezawodności systemów. Innym projektem wykorzystującym pewne ciekawe mechanizmy jest eksperymentalny system operacyjny <em>Choices</em> rozwijany na Uniwersytecie Illinois w Urbana-Champaign.</p>
<h3>Ogólna budowa</h3>
<p>Choices jest napisanym w C++ systemem operacyjnym zorientowanym obiektowo. Jako całość jest tworzony z wielu odrębnych obiektów współpracujących ze sobą. Składa się z frameworków definiujących poszczególne aspekty jego działalności. Dziedziczenie jest wykorzystywane do łatwego przenoszenia systemu na inne platformy i do stosowania zależnych od sprzętu optymalizacji. Choices wspiera SPARC, x86 oraz ARM, a także istnieje możliwość jego uruchomienia w trybie użytkownika na Solarisie i Linuksie.</p>
<h3>Wyjątki procesora</h3>
<p>Chocies korzysta z dobrodziejstw języków programowania wysokiego poziomu także w przypadku wyjątków procesora. Każde przerwanie jest obsługiwane przez <em>InterruptManager</em>a. Przekazuje on stosowne informacje do odpowiednich elementów systemu operacyjnego, lub jeżeli przerwanie jest wyjątkiem procesora zgłasza błąd. <em>InterruptManager</em> rzuca wtedy wyjątek C++ (model jego obsługi nie ma znaczenia), w taki sposób, aby stos wskazywał, że został on rzucony z miejsca w którym wystąpił wyjątek procesora. Dzięki temu kod obsługi wyjątków może zlokalizować błędną operację i wykonać odpowiednie czynności.</p>
<h3>Odzyskiwanie po awarii</h3>
<p>Choices wspiera mechanizmy odzyskiwania stanu programu (bądź jądra) w przypadku ewentualnych błędów spowodowanych wadliwym kodem lub nieprawidłowym funkcjonowaniem sprzętu.</p>
<ul>
<li><em>przeładowanie kodu</em> &#8211; jest to mechanizm uaktywniający się, gdy procesor zasygnalizuje próbę wykonania nieprawidłowej operacji, które są najczęściej oznaką błędu sprzętowego związanego z pamięcią operacyjną. W tej sytuacji wadliwa instrukcja jest ponownie ładowana z innego źródła danych (np. obrazu jądra trzymanego w pamięci flash). Dodatkowo, możliwe są okresowe kontrole poprawności kodu opierające się na zgodności sum kontrolnych. Ten mechanizm może być zastosowany jedynie do kodu, który nie jest generowany run-time.</li>
<li><em>mikrorestart</em> jest wykonywany najczęściej gdy błąd wystąpi podczas wykonywania funkcji dostarczanej przez komponent. Polega na ponownym załadowaniu, przygotowaniu do działania i kolejnej próbie wywołania funkcji. W odróżnieniu od poprzedniego mechanizmu, mikrorestart skupia się głównie na próbie odzyskania uszkodzonych struktur danych, gdzie pomocne są także opisane w dalszej części artykułu <em>Server State Regions</em>.</li>
<li><em>automatyczny restart usługi</em> &#8211; dotyczy głównie serwerów działających jako procesy w trybie użytkownika. Polega właściwie na tym samym co mikrorestart, z tym, że także próbuje radzić sobie z ewentualnymi problemami wynikającymi z utrzymywanych przez proces blokad oraz dostępu do pamięci współdzielonej. W celu umożliwienia skutecznego restartu usługi, Choices monitoruje wszystkie blokady utrzymywane przez procesy. W sytuacji gdy proces ulegnie awarii, blokady są zwalniane, tak aby nie powodowały problemów po wznowieniu działania programu.
</p>
</li>
<li><em>transakcje</em> &#8211; jest to sposób radzenia sobie z ewentualnymi błędami szeroko wykorzystywany w bazach danych. Transakcje polegają na zachowaniu kopii danych, tak aby można było całkowicie anulować wykonywaną operację, jeżeli którykolwiek z jej elementów się nie powiedzie. Innymi słowy, w przypadku napotkania błędu, dane pozostają niezmienione. Dzięki temu ewentualne błędy, nie mogą naruszyć integralności danych.</li>
</ul>
<h3>Kontrolowane restarty</h3>
<p>Innym istotnym mechanizmem, co prawda jeszcze niezaimplementowanym, są <em>policy-driven restarts</em>. Dają programistom możliwość dokładnego opisania sposobu ponownego uruchamiania programu, tak aby dostosować go do konkretnych potrzeb. Możliwe jest także zdefiniowanie pewnych operacji jako reakcję na określony błąd zastępującą zwykły restart programu.</p>
<h3><em>Server State Regions</em></h3>
<p>Część mikrojąder jest zaprojektowana w taki sposób, że każdy serwer przetrzymuje wszystkie potrzebne mu dane na temat każdego z klientów. Jest to rozwiązanie proste i wygodne zarówno dla jądra jak i poszczególnych serwerów działających w przestrzeni użytkownika. Sprawia to jednak, że działanie programu jest uzależnione od przypisanych mu danych obecnych w usługach z których korzysta. W rezultacie, mimo izolacji poszczególnych komponentów, błąd w kodzie serwera wciąż może doprowadzić do błędu aplikacji z niego korzystających.</p>
<p>Rozwiązanie tego problemu, jakie zastosowano w Choices polega na przeniesieniu wszystkich danych aplikacji poza przestrzeń adresową serwera. Tworzy się w ten sposób tak zwane <em>Server State Regions</em>, obszary pamięci przechowujące wymagane przez konkretną usługę dane na temat aplikacji. SSR pomimo że są tworzone z pamięci dostępnej klientom, są dla nich ze względów bezpieczeństwa niedostępne. Dzięki temu, serwer może bezpiecznie umieścić w nich wszystkie informacje jakie dotyczą konkretnych aplikacji.</p>
<p>Gdy aplikacja po raz pierwszy skorzysta z usług oferowanych przez dany serwer, zostanie utworzony dla niej osobny SSR. Następnie przy każdym wywołaniu funkcji serwera odpowiedni SSR jest tymczasowo mapowany do jego przestrzeni adresowej<sup><a href="#przyp1">1</a></sup>. Po wykonaniu wszystkich potrzebnych operacji i powrocie do kodu aplikacji serwer ponownie traci dostęp do SSR.</p>
<p>W przypadku awarii serwera zostaje on automatycznie uruchomiony ponownie. Dzięki SSR błąd serwera może naruszyć poprawność danych co najwyżej jednej aplikacji, podczas gdy wszystkie pozostałe nie odczują żadnych skutków awarii. Dodatkowo po restarcie serwer może uzyskać informacje na temat swojego poprzedniego stanu i spróbować naprawić ewentualne błędy w przetwarzanym SSR.</p>
<p>Zastosowanie SSR ma także szereg dodatkowych zaleta. Wykorzystywanie pamięci aplikacji do tworzenia SSR znacząco ogranicza możliwe sposoby przeprowadzenia ataku <abbr title="Denial of Service">DoS</abbr> na serwer. SSR są także niezależne od klienta, dzięki czemu mogą zostać wykorzystane do odzyskania dawnego stanu aplikacji przed jej ewentualną awarią. Oczywiście wymaga to dodatkowego wsparcia ze strony klienta i nie jest wspierane przez jądro w takim stopniu jak odzyskiwanie serwera, ale pozwala np. na niezerwanie połączeń TCP w przypadku błędu klienta.</p>
<p style="font-size:.8em;"><sup>1</sup> Warto zaznaczyć, że nie wpływa to w znaczący sposób na wydajność, ponieważ każde wywołanie funkcji udostępnianych przez serwer i tak powoduje unieważnienie TLB.</p>
<h3>Podsumowanie</h3>
<p>Choices nie jest projektem przeznaczonym do użytku. Należy na niego patrzeć jak na system edukacyjny i eksperymentalny, który łączy w sobie wiele różnych mechanizmów zapewniających większą niezawodność. Wiele z tych rozwiązań zostało już zastosowanych w innych mikrojądrach, ale w Choices stara się stworzyć z nich spójny system współpracujących ze sobą elementów. Projekt niestety zdaje się być obecnie martwy, ostatnie aktualizacje jego strony miały miejsce latem 2007 r. Innym problemem jest fakt, że wiele mechanizmów zostało szczegółowo opisanych, ale nie są jeszcze zaimplementowane.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=49&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/03/10/choices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Singularity</title>
		<link>http://pdziepak.wordpress.com/2009/03/03/singularity/</link>
		<comments>http://pdziepak.wordpress.com/2009/03/03/singularity/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 21:57:07 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[bartok]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[contract]]></category>
		<category><![CDATA[endpoint]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[msil]]></category>
		<category><![CDATA[safe]]></category>
		<category><![CDATA[sing]]></category>
		<category><![CDATA[singularity]]></category>
		<category><![CDATA[sip]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=46</guid>
		<description><![CDATA[Większość obecnych systemów operacyjnych w mniejszym lub większym stopniu bazuje na dość podobnych założeniach. Nawet jeżeli architektura jądra znacząco się różni (jądra monolityczne, mikrojądra) to i tak wiele pozostałych elementów pozostaje w niewiele zmienionej formie. Istnieją jednak pewne eksperymentalne projekty, mające na celu sprawdzić, jak nowe koncepcje sprawują się w praktyce. Jednym z nich jest [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=46&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Większość obecnych systemów operacyjnych w mniejszym lub większym stopniu bazuje na dość podobnych założeniach. Nawet jeżeli architektura jądra znacząco się różni (jądra monolityczne, mikrojądra) to i tak wiele pozostałych elementów pozostaje w niewiele zmienionej formie. Istnieją jednak pewne eksperymentalne projekty, mające na celu sprawdzić, jak nowe koncepcje sprawują się w praktyce. Jednym z nich jest rozwijany przez Microsoft Research system operacyjny <em>Singularity</em>.</p>
<h3>C# i Sing#</h3>
<p>Projekt jest w przeważającej większości napisany w C#. Według danych Microsoftu 95% kodu mikrojądra jest napisana w tym języku. Pozostałe to assembler x86 oraz C++ wykorzystane przy niskopoziomowej obsłudze pewnych podstawowych elementów systemu, o czym później. W tym miejscu nie można nie wspomnieć o Sing#. Jest to zestaw rozszerzeń do C# wspierający wiele dodatkowych mechanizmów często wykorzystywanych w kodzie Singularity. Dodatkowe elementy zawarte w Sing# to między innymi:</p>
<ul>
<li><em>kontrakty</em> &#8211; pozwalają na zachowanie bezpieczeństwa typologicznego podczas komunikacji międzyprocesowej realizowanej przez kanały (<em>channels</em>). Kontrakty definiują jakie wiadomości mogą być przesyłane, typy oraz wymagania co do wartości ich argumentów oraz kierunek w jakim są wysyłane. Kontrakty pozwalają także na ustalenie oczekiwanych komunikatów na każdym etapie transmisji.</li>
<li><em>endpoints</em> &#8211; każdy kontrakt definiuje endpointy przeznaczone dla obu stron komunikacji. Zawierają one wszystkie metody opisane w kontrakcie jako możliwe wiadomości i służa do wygodnego ich odbierania i wysyłania.</li>
<li><em>exchange heap</em> &#8211; Sing# pozwala na alokację obiektów w specjalnym miejscu przestrzeni adresowej zwanym stertą wymiany (<em>exchange heap</em>), która jest wykorzystywana przez wszelkie rodzaje komunikacji międzyprocesowej. Dodatkowo wykonywane są wszystkie informacje związane z zachowaniem informacji o właścicielu danego obiektu.</li>
<li><em>konstrukcja switch-receive</em> &#8211; razem z endpointami pozwala na wygodne odbieranie wiadomości opierając się na standardowej konstrukcji switch.</li>
</ul>
<pre>switch receive {
	case endpoint.Message1() :
		...
		break;
	case endpoint.Message2() :
		...
		break;
}</pre>
<h3>Bezpieczeństwo</h3>
<p>C# (a także wszystkie rozszerzenia związane z Sing#) jest językiem bezpiecznym pod wieloma względami, na czym bazują główne założenia systemu Singularity. Można rozróżnić dwa obszary w których ograniczona została możliwość występowania błędów:</p>
<ul>
<li><em>bezpieczeństwo typów</em> zapewnia, że wszystkie operacje wykonywane na obiekcie są zgodne z jego typem</li>
<li><em>bezpieczeństwo pamięci</em> zapewnia, że wszystkie odwołania do pamięci są poprawne. Wiąże się to z zerowymi wskaźnikami, odwołaniom poza rozmiar tablicy lub do nieistniejących obiektów.</li>
</ul>
<h3>Bartok</h3>
<p>Programy pisane w C# lub innych językach związanych z platformą .NET zwykle są tłumaczone do pośredniego (także bezpiecznego) języka <abbr title="Microsoft Intermediate Language">MSIL</abbr>. Zadaniem kompilatora Bartok, będącego jedną z najważniejszych części Singularity jest tłumaczenie MSIL do kodu natywnego, zachowując przy tym bezpieczeństwo kodu. Odpowiednie optymalizacje pozwalają na stworzenie jak najbardziej wydajnego kodu wykorzystującego wszystkie możliwości danego komputera, co chociaż w pewnym stopniu jest w stanie zrekompensować straty wydajności spowodowane procedurami wsparcia runtime.</p>
<h3>Jednolite procesy</h3>
<p>Zapewnienie pełnego bezpieczeństwa kodu natywnego wymaga od Singularity wprowadzenie jeszcze dodatkowych ograniczeń w stosunku do procesów (a także i jądra):</p>
<ul>
<li>Kod programu nie może zostać zmodyfikowany w trakcie jego działania.
<p>Wyklucza to kompilację <em>just-in-time</em> (obecną np. na platformie .NET), a wszystkie dynamicznie konsolidowane biblioteki muszą zostać załadowane przed rozpoczęciem pracy programu.</li>
<li>Żaden obiekt nie może należeć do więcej niż jednego procesu w tym samym czasie.
<p>To ograniczenie ułatwia synchronizację między procesami upraszczając sposób komunikacji między nimi.</li>
</ul>
<p>Wymaga to między innymi udziału systemu operacyjnego w większości operacji mogących stanowić zagrożenie i tym samym wymusza użycie mechanizmów typu wspomniane wcześniej kontrakty. Istotne jest, że jądro także podlega tym ograniczeniom.</p>
<p>Dzięki tym ograniczeniom możliwe jest także zastosowanie refleksyjności czasu kompilacji (<em>Compile Time Reflection</em>). Żaden element kodu nie może zostać zmieniony w trakcie działania programu, dlatego też refleksyjność realizowana podczas kompilacji (czyli de facto w ostatnim momencie w którym kod może się zmienić) jest w zupełności wystarczająca.</p>
<h3>Ochrona pamięci</h3>
<p>Najczęstszym obecnie stosowanym mechanizmem mającym za zadanie ochronę przestrzeni adresowej poszczególnych procesów jest stronicowanie. Jako element realizowany sprzętowo <abbr title="Hardware Isolated Processes">HIP</abbr> wiąże się z pewnymi spadkami wydajności, szczególnie w przypadku komunikacji międzyprocesowej, która wymaga operacjach na katalogu/tablicy stron skutkujących unieważnieniem TLB. Także wywłaszczenie procesu w większości sytuacji unieważnia przynajmniej część wpisów w TLB. Przez bardzo długi czas była to jedna z ważniejszych przyczyn małej popularności mikrojąder.</p>
<p>Każdy program (a także i kernel) w Singularity jest napisany w bezpiecznym języku programowania. Nie może on samodzielnie utworzyć lub unieważnić referencji do obiektów w pamięci a także wykonać żadnych innych operacji, które mogłyby zagrozić bezpieczeństwu systemu. Jedynie alokacja pamięci oraz garbage collector nie spełniają tej zasady, ale są to mechanizmy dostarczane przez system operacyjny i tym samym w pełni zaufane.</p>
<p>Skoro sam język programowania ogranicza programistę do podobnego stopnia jak HIP, sprzętowa ochrona pamięci staje się niepotrzebna. Jej rolę pełnią wszystkie funkcje kontrolne wsparcia runtime, które tym samym tworzą <abbr title="Software Isolated Processes">SIP</abbr>. Wiąże się z tym także założenie, że każdy obiekt może należeć tylko do jednej przestrzeni adresowej. Z tego powodu pamięć współdzielona, a także wszelkie inne sposoby komunikacji międzyprocesowej inne niż kanały (<em>channels</em>) są niedozwolone.</p>
<h3>Komunikacja międzyprocesowa</h3>
<p>Komunikacja międzyprocesowa w Singularity opiera się na kanałach (<em>channels</em>). Wykorzystują one dodatkowe elementy Sing# opisane wcześniej: kontrakty i endpointy. Dzięki nim utrzymane jest bezpieczeństwo operacji związanych w komunikacją. Cała komunikacja odbywa się przy pomocy endpointów które dostarczają odpowiedni interfejs dla obu uczestników transmisji.</p>
<p>Dane przekazywane są przy użyciu sterty wymiany (<em>exchange heap</em>). W tym miejscu nie funkcjonuje garbage collector, zamiast niego wykorzystywane są liczniki referencji. Jest to obszar pamięci do którego ma dostęp każdy proces, ale zgodnie z zasadami dotyczącymi bezpieczeństwa każdy obiekt przez cały czas ma przyporządkowanego mu właściciela. Przekazanie obiektu odbywa się przez dostarczenie endpointowi odbiorcy wskaźnika na przesyłany obiekt (wewnątrz sterty wymiany).</p>
<p>Sterta wymiany ma też ograniczenia co do obiektów znajdujących się w niej. Przede wszystkim muszą być one <em>wymiennego typu</em> czyli nie mogą zawierać żadnych referencji do innych, nieprzesyłanych obiektów.</p>
<h3>Podsumowanie</h3>
<p>Singularity jest bez wątpienia bardzo ciekawym, ale też i bardzo rozbudowanym projektem. Ten artykuł opisuje jedynie najbardziej istotne cechy tego systemu, sprawiające, że wyróżnia się on na tle obecnie często stosowanych systemów. Jest to projekt eksperymentalny w którym nie wszystkie rzeczy są jeszcze w pełni ukończone, ale mimo to już zawiera wiele interesujących rozwiązań.</p>
<p>Najprawdopodobniej, w najbliższym czasie pojawi się kolejny artykuł opisujący mniej popularne ale wciąż bardzo istotne elementy systemu Singularity. Być może także pokuszę się o dokładniejsze opisanie któregoś z mechanizmów, bo projekty eksperymentalne zawsze warte są szczególnej uwagi.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/46/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=46&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/03/03/singularity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Obiekty, klasy i metody w Objective-C</title>
		<link>http://pdziepak.wordpress.com/2009/02/24/obiekty-klasy-i-metody-w-objective-c/</link>
		<comments>http://pdziepak.wordpress.com/2009/02/24/obiekty-klasy-i-metody-w-objective-c/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 22:18:11 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[dispatch table]]></category>
		<category><![CDATA[dtable]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[openstep]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[SEL]]></category>
		<category><![CDATA[selector]]></category>
		<category><![CDATA[virtual]]></category>
		<category><![CDATA[vtable]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=41</guid>
		<description><![CDATA[Programowanie zorientowane obiektowo w czystym C, mimo że możliwe, rzadko kiedy jest proste i przyjemne, a powstały kod jest zwykle bardzo zagmatwany. Dlatego też na bazie C powstały kompatybilne z nim języki dodające wygodne w użyciu wsparcie dla kodu zorientowanego obiektowo. Pierwszy z nich to niezwykle popularny C++, w którym większość tych rozszerzeń to różnego [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=41&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Programowanie zorientowane obiektowo w czystym C, mimo że możliwe, rzadko kiedy jest proste i przyjemne, a powstały kod jest zwykle bardzo zagmatwany. Dlatego też na bazie C powstały kompatybilne z nim języki dodające wygodne w użyciu wsparcie dla kodu zorientowanego obiektowo. Pierwszy z nich to niezwykle popularny C++, w którym większość tych rozszerzeń to różnego rodzaju dodatkowe operacje wykonywane podczas kompilacji. Drugi to niszowy <em>Objective-C</em>, który (oprócz składni) od C++ różni się tym, że dodatkowe elementy jakie zostały do niego wprowadzone są odpowiednimi operacjami wykonywanymi podczas działania programu. Dzięki temu udaje się uzyskać w języku kompilowanym do kodu natywnego część udogodnień znanych z technologii takich jak .NET czy Java.</p>
<h3>Klasy</h3>
<p>W języku Objective-C każda klasa jest także obiektem zawierające podstawowe informacje wymagane przez pozostałe funkcje wsparcia runtime. Najważniejsze z danych przechowywanych przez obiekty opisujące klasy to:</p>
<ul>
<li>nazwa klasy</li>
<li>rozmiar instancji klasy (z uwzględnieniem klas bazowych)</li>
<li>lista zmiennych składowych klasy</li>
<li>lista funkcji składowych klasy</li>
<li>wskaźnik na klasę bazową</li>
<li>lista klas pochodnych</li>
<li>realizowane protokoły</li>
</ul>
<p>Traktowanie klasy jako obiektu (inspirowane Smalltalkiem) pozwala znacząco poszerzyć możliwości języka szczególnie jeżeli chodzi o refleksyjność. Struktury opisujące klasy najczęściej są przechowywane w wewnętrznych danych runtime. Odpowiednie informacje są wydobywane przy okazji tworzenia instancji danej klasy, a następnie wiązane nowym obiektem. Dlatego też poniższy kod:</p>
<pre>array = [NSArray new]</pre>
<p>zostanie w większości implementacji, już przez kompilator zamieniony na konstrukcję podobną do tej:</p>
<pre>array = [(objc_get_class("NSArray")) new]</pre>
<p>Funkcja <code>objc_get_class</code> przegląda listę wszystkich klas w poszukiwaniu żądanej i w przypadku jej odnalezienia zwraca wskaźnik do niej. Cała operacja ma miejsce już podczas działania programu, dlatego też istotna jest szybkość działania takich podstawowych operacji. Jednym ze sposobów na przyśpieszenie kodu jest cachowanie wskaźników na obiekty opisujące klasy. W rezultacie funkcja <code>objc_get_class</code> jest wykonywana jeden raz dla każdej klasy, a w każdym kolejnym przypadku używany jest zwrócony przez nią wskaźnik.</p>
<h3>Obiekty</h3>
<p>Wszystkie klasy w Objective-C dziedziczą po <code>NSObject</code>. Jest to klasa która realizuje większość operacji pozwalających na korzystanie przez programistę z informacji jakie są przechowywane o każdej klasie. Oferowana funkcjonalność to między innymi:</p>
<ul>
<li>sprawdzenie czy klasa odpowiada na selektor</li>
<li>sprawdzenie czy klasa realizuje protokół</li>
<li>podanie funkcji odpowiadającej na selektor</li>
<li>wykonanie podanego selektora</li>
<li>podanie nazwy klasy</li>
</ul>
<h3>Selektory</h3>
<p>Selektory identyfikują wysyłaną do obiektu wiadomość, czyli innymi słowy, nazywają funkcję składową która powinna zostać wywołana. W większości jest to po prostu ciąg znaków odpowiadających nazwie funkcji, chociaż w niektórych implementacjach zawiera także unikalny numer identyfikacyjny. W celu usprawnienia operacji tłumaczenia ciągu znaków na selektor i odwrotnie istnieją odpowiednie tablice przechowujące listy wszystkich zarejestrowanych danych. Jako że mimo tego, może to być kosztowna operacja, umożliwiane jest (wręcz zalecane) tłumaczenie nazw do selektorów podczas kompilacji.</p>
<h3>Wywołanie funkcji składowych</h3>
<p>Wywołanie funkcji składowych, a właściwie zgodnie z nomenklaturą Objective C: wysyłanie wiadomości obiektom jest przeprowadzany w całkowicie dynamiczny sposób. Warto także zaznaczyć, że ponieważ klasy także są traktowane jako obiekty, statyczne funkcje składowe wywoływane są w taki sam sposób. Oto przykładowy kod wysyłania komunikatu do obiektu:</p>
<pre>[obiekt metoda]</pre>
<p>zostaje zamieniony na:</p>
<pre>objc_msgSend(obiekt, @selector(metoda))</pre>
<p>Funkcja <code>objc_msgSend</code>, na podstawie informacji zawartych w opisie klasy której instancją jest <code>object</code>, wywołuje odpowiednią metodę. Każda klasa zawiera listę selektorów oraz przypisanych im adresów funkcji. Procedura przekazująca wiadomość przeszukuje tę listę (z uwzględnieniem klas bazowych) w poszukiwaniu adresu odpowiedniej metody, która następnie zostaje wywołana.</p>
<p>Często, w celu przyśpieszenia tej bardzo częstej operacji, wykorzystywane są tak zwane <em>dispatch tables</em>. Właściwie pod każdym względem przypominają one tablice funkcji wirtualnych wykorzystywane np. w C++. Każda taka tablica zawiera jedynie adresy kolejnych funkcji składowych klasy. W tej implementacji unikalny numer identyfikacyjny selektora służy także jako indeks wskazujący na odpowiedni adres w tej tablicy. Najważniejszą różnicą między <em>dispatch table</em> a tablicami funkcji wirtualnych jest fakt, że <em>dispatch tables</em> najczęściej są tworzone już podczas działania programu na podstawie listy funkcji składowych zawartej w obiekcie opisującym klasę.</p>
<h3>Pozostałe dane dotyczące klasy</h3>
<p>Często zdarza się, że wpisy z adresami funkcji składowych i odpowiadającymi im selektorami zawierają także informację o przyjmowanych przez metodę argumentach. Jest to przydatne przy debuggingu. Podobnie rzecz się ma z wpisami dotyczącymi zmiennych składowych. Obiekt opisujący klasę przechowuję listę struktur zawierających nazwę każdej takiej zmiennej, jej typ (dla ułatwienie debuggingu) i przesunięcie w stosunku do bazowego adresu instancji.</p>
<h3>Podsumowanie</h3>
<p>Objective-C prezentuje inne podejście co do sposobu implementacji rozszerzeń związanych z OOP w C niż C++. Opiera się bardziej na wykonywaniu operacji podczas działania programu, co zmniejsza jego wydajność, ale z drugiej strony oferuje szereg dodatkowych możliwości. Niech za przykład posłużą tutaj choćby systemy rozproszone. W Objective-C przy odrobinie wysiłku ze strony osoby implementującej taki system, można tworzyć obiekty rozproszone w banalnie prosty sposób. Możliwe jest to właśnie dzięki dużej ilości informacji które zostają w kodzie po kompilacji, oraz wielu możliwościach wstawienia dodatkowego kodu podczas działania programu. Oczywiście takie rozwiązania są też możliwe w C++ czy innych językach, ale nie zawsze jest to aż takie proste.</p>
<p>Główną wadą Objective-C jest jego niewielka popularność. Przed śmiercią chroni go właściwie jedynie OpenStep. Warto jednak zwrócić uwagę na jego możliwości, ponieważ jest on gdzieś pomiędzy innymi językami kompilowanymi do kodu natywnego a kompilowanymi do kodu pośredniego. Z jednej strony wsparcie runtime jest bardzo rozbudowane, ale wciąż istnieje możliwość uzyskania maksymalnej możliwej wydajności w krytycznych miejscach, przez ograniczenie używania niektórych z jego funkcji.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=41&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/02/24/obiekty-klasy-i-metody-w-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Quarn OS 0.0.90</title>
		<link>http://pdziepak.wordpress.com/2009/02/22/quarn-os-0-0-90/</link>
		<comments>http://pdziepak.wordpress.com/2009/02/22/quarn-os-0-0-90/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 00:12:27 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[Quarn OS]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[operating system]]></category>
		<category><![CDATA[system operacyjny]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=62</guid>
		<description><![CDATA[Po długim okresie prac nad Quarnem (niestety nie obyło się bez przerw), w końcu zdecydowałem się na wydanie wersji 0.0.90. Warto zaznaczyć, że nie jest to wersja nadająca się do użytkowania. Jej głównym zadaniem jest wyznaczenie osiągniętego milestone. Zainteresowani mogą ściągnąć Quarna tutaj lub bezpośrednio tutaj. Możliwe jest także ściągnięcie gotowego obrazu dyskietki w tym [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=62&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Po długim okresie prac nad Quarnem (niestety nie obyło się bez przerw), w końcu zdecydowałem się na wydanie wersji <strong>0.0.90</strong>. Warto zaznaczyć, że nie jest to wersja nadająca się do użytkowania. Jej głównym zadaniem jest wyznaczenie osiągniętego milestone.</p>
<p>Zainteresowani mogą ściągnąć Quarna <a href="http://quarnos.org/?id=releases">tutaj</a> lub bezpośrednio <a href="http://downloads.sourceforge.net/quarnos/quarnos_0.0.90.tar.gz">tutaj</a>. Możliwe jest także ściągnięcie gotowego obrazu dyskietki w <a href="http://downloads.sourceforge.net/quarnos/quarnos_fdimg_0.0.90.tar.gz">tym</a> miejscu. Uprzedzam, że w wielu częściach kod jest jeszcze niedopracowany i czasami wręcz razi błędami, jednak głównym celem tego wydania było ustabilizowanie pewnej podstawy na bazie której będą prowadzone dalsze prace. W najbliższej przyszłości planuję po kolei zająć się poszczególnymi elementami systemu znacząco je dopracowując. Obecnie, są one jedynie zalążkami, których głównym zadaniem jest wykorzystanie możliwości podsystemu <em>Manes</em>.</p>
<p>Quarn w wersji 0.0.90 posiada zaimplementowane między innymi:</p>
<ul>
<li>Managed Execution System</li>
<li>Execution Flow Controller</li>
<li>podstawowe sterowniki (klawiatura, dma, fdc, pic, pit, rs232, pci)</li>
<li>wielozadaniowość z planistą round-robin (wywłaszczanie)</li>
<li>alokator pamięci O(1)</li>
<li>podstawowe elementy interfejsu Hydra</li>
<li>port Hydry do POSIX</li>
<li>podstawowe wsparcie dla FAT12</li>
<li>wsparcie dla RTTI w C++</li>
<li>wsparcie dla plików ELF, dynamiczny konsolidator</li>
<li>ładowanie modułów kernela</li>
<li>wykonywanie zewnętrznych plików</li>
<li>systemu zasobów, urządzeń i usług</li>
</ul>
<p>W tym momencie należą się pewne wyjaśnienia co do niektórych elementów Quarna. Co prawda w przyszłości zamierzam napisać o nich dużo więcej, jednak teraz przynajmniej podam ogólny zarys ich działania.</p>
<h3>Manes</h3>
<p><em>Managed Execution System</em> (Manes) jest systemem rozproszonej dystrybucji obiektów i komponentów (przypomina systemy typu CORBA czy COM). Jest sercem Quarna, rozwiązującym wszelkie kwestie związane z modułowością i komunikacją pomiędzy poszczególnymi elementami systemu. W przyszłośći Manes wspierać będzie także szereg dodatkowych technologii jak na przykład programowanie aspektowe.</p>
<p>Kolejnym elementem bardzo mocno związanym z Manes jest <em>Execution Flow Controller</em>. Wykorzystuje on tablice metod wirtualnych do wstrzykiwania kodu, który zostanie wykonany przed wywołaniem takiej funkcji składowej. Pozwala to na implementację większości funkcji dostarczanych przez Manes.</p>
<h3>Hydra</h3>
<p>Innym istotnym elementem Quarna jest <em>Hydra</em> czyli główne API jakie jest dostarczane aplikacjom. Obejmuje między innymi interfejs użytkownika (obecnie tylko w trybie tekstowym, w przyszłości także i w graficznym), operacje wejścia-wyjścia, wielowątkowość itp. Możliwe jest uruchomienie programów napisanych przy wykorzystaniu Hydry na każdym systemie zgodnym z POSIX dzięki specjalnej warstwie pośredniczącej. W Quarnie 0.0.90 jest to zaprezentowane za pomocą domyślnego shella.</p>
<h3>Podsumowanie</h3>
<p>Quarn jest projektem amatorskim w związku z czym prace nad nim czasowo ulegają większemu spowolnieniu. Nie skupiam się w nim na uzyskiwaniu jak największej funkcjonalności lecz na zastosowaniu ciekawych, nowych rozwiązań. Dlatego też obecna wersja nie powala swoimi możliwościami i służy głównie ułatwieniu w utrzymaniu porządku w kodzie.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=62&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/02/22/quarn-os-0-0-90/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Programowanie oparte na komponentach</title>
		<link>http://pdziepak.wordpress.com/2009/02/17/programowanie-oparte-na-komponentach/</link>
		<comments>http://pdziepak.wordpress.com/2009/02/17/programowanie-oparte-na-komponentach/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 22:07:33 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[data-driven]]></category>
		<category><![CDATA[entity system]]></category>
		<category><![CDATA[komponenty]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=38</guid>
		<description><![CDATA[Programowanie zorientowane obiektowo jest niewątpliwie jednym z najpopularniejszych obecnie paradygmatów. Powstało bardzo wiele opracowań na jego temat wprowadzających chociażby techniki znane jako wzorce projektowe. Nie jest to jednak rozwiązanie idealne i w pewnych zastosowaniach wiążą się z nim pewne trudności. Chodzi tutaj o tworzenie gier komputerowych gdzie coraz częściej można się spotkać z programowaniem opartym [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=38&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Programowanie zorientowane obiektowo jest niewątpliwie jednym z najpopularniejszych obecnie paradygmatów. Powstało bardzo wiele opracowań na jego temat wprowadzających chociażby techniki znane jako wzorce projektowe. Nie jest to jednak rozwiązanie idealne i w pewnych zastosowaniach wiążą się z nim pewne trudności. Chodzi tutaj o tworzenie gier komputerowych gdzie coraz częściej można się spotkać z programowaniem opartym na komponentach.</p>
<h3>Uzasadnienie</h3>
<p>Praktycznie w każdej grze występuje główna baza obiektów w niej występujących. Zwykle są to instancje klas ściśle ze sobą powiązanych odpowiednią hierarchią. Wspólna funkcjonalność, zgodnie z duchem OOP, jest w miarę możliwości przenoszona do klas znajdujących się wyżej w hierarchii. Wszelkie odstępstwa od domyślnego zachowania są implementowane przy użyciu polimorfizmu.</p>
<p>Wraz ze wzrostem stopnia skomplikowania projektu coraz trudniej jest unikać dziedziczenia wielobazowego i wszystkich związanych z nim niedogodności, w trakcie pozbywania się duplikowanego kodu. Innym problemem który się pojawia jest powstanie bardzo dużych klas bazowych, które są zwykle wysoce niezalecane. Dochodzi do sytuacji gdzie programowanie zorientowane obiektowo najwyraźniej nie jest najlepszy sposobem na rozwiązanie danego problemu.</p>
<h3>Podstawowe założenia</h3>
<p>W powyższych sytuacjach bardziej istotnym od zarządzania obiektami jest wygodne zarządzanie logiką kodu. Realizowane jest to za pomocą dwóch podstawowych elementów programowania opartego na komponentach:</p>
<ul>
<li><strong>jednostka</strong> (<em>entity</em>) &#8211; identyfikuje to co w OOP zostałoby nazwane obiektem. Nie posiada pól ani metod, jest jedynie czymś w rodzaju nazwy. Swoim przeznaczeniem przypomina klasę, ponieważ definiuje konkretne zachowanie, lecz ilościowo odpowiada obiektom.</li>
<li><strong>komponent</strong> (<em>component</em>) &#8211; definiują logikę operacji. Każdy komponent opisuje inne fragmenty zachowania jednostki. Najważniejszą różnicą między klasami a komponentami jest to, że klasy opisują pełną funkcjonalność, podczas gdy pojedynczy komponent tylko jej część. W większości implementacji komponenty są obiektami globalnymi realizowanymi przy pomocy wzorca <em>singleton</em>, jednakże nie jest to sztywną regułą.</li>
</ul>
<p>Niezwykle istotnym elementem całego systemu jednostek jest przyporządkowywanie im konkretnych komponentów. Może to odbywać się na dwa sposoby, zależnie od implementacji. Także umieszczenie kodu i danych jest sprawą zależną od samej implementacji. Warto jednak pamiętać, że podstawowym założeniem programowania opartego na komponentach jest utrzymanie minimalnego rozmiaru jednostki. W rezultacie jest to najczęściej liczba całkowita.</p>
<h3>Dane</h3>
<p>W systemach opartych na tym paradygmacie dane są umieszczane w komponentach. W zależności od możliwych zastosowań jednostki, komponenty przechowują dane potrzebne do realizowania przez nie odpowiednich funkcji. Wymaga to dodatkowego mechanizmu komunikowania się pomiędzy komponentami różnych typów w sytuacji gdy potrzebna jest modyfikacja danych innego komponentu. Powinno to być jednak unikane. Główną zaletą jest uproszczenie mechanizmów związanych z synchronizacją w przypadku systemów wielowątkowych. Każdy komponent zajmuje się tylko swoimi danymi dzięki czemu można ograniczyć ilość blokad.</p>
<p>Dodatkowo najczęściej to komponenty przechowują informację o przyporządkowanym im jednostką. Dzięki temu zlokalizowanie wszystkich jednostek jest proste i nie wymaga istnienia dodatkowych struktur danych. W tej kwestii wiele jednak zależy od implementacji, bo nie da się ukryć, że zdarza się także sytuacja w której każda jednostka przechowuje listę przypisanych komponentów.</p>
<h3>Kod</h3>
<p>W przypadku kodu najpopularniejszym rozwiązaniem jest umieszczenie go także w komponentach. Wtedy co prawda jest on powiązany z danymi, co może przypominać OOP, jednak uzyskuje się duże rozdrobnienie funkcjonalności co ułatwia wiele kwestii. Oprócz wspomnianego ominięcia problemu synchronizacji, możliwa jest dynamiczna zmiana właściwości i metod obiektu (reprezentowanego przez jednostkę) co pozwala na ograniczenie ilości zajmowanej pamięci. Istotny jest także inny sposób zapisu kodu co jest główną cechą odróżniającą od siebie paradygmaty programowania. Znacząco ułatwia to dodanie dodatkowej funkcjonalności poprzez wprowadzenie kolejnego komponentu.</p>
<p>Komponenty ułatwiają także masowe wykonywanie operacji. Jeżeli dana funkcja powinna być wykonana na wszystkich obiektach danego typu, komponent potrafi to zrobić korzystając z posiadanej listy przyporządkowanych mu jednostek. Kluczowe jest tutaj ustalenie odpowiedniej kolejności wykonywania komponentów w odpowiedzi na zdarzenia.</p>
<h3>Przykład realizacji</h3>
<p>Przykładowe zastosowanie komponentów w grze polega na stworzeniu wystarczającej ich ilości do pokrycia każdego możliwego zachowania obiektów. Oczywiście, z reguły nie stosuje się tutaj żadnej hierarchii komponentów, ponieważ zwykle nie przynosi to żadnych korzyści. Każdy obiekt obecny w grze jest zarejestrowany w komponencie <em>Render</em> który udostępnia procedury związane z jego wyświetlaniem. Oprócz tego łódki mogą być zarejestrowane w komponencie <em>Boat</em>. Po ich zniszczeniu zostają usunięte z komponentu <em>Boat</em> a zarejestrowane w <em>Wreck</em>.</p>
<p>Główna pętla programu w odpowiedniej kolejności, często w odpowiedzi na konkretne zdarzenia wykonuje żądane komponenty. Dla przykładu, jeżeli samochód jest sterowany przez gracza, to należy do komponentu <em>PlayerControl</em>, którego procedury są wywoływane w odpowiedzi na zdarzenia z urządzeń zewnętrznych.</p>
<h3>Podsumowanie</h3>
<p>Programowanie oparte na komponentach zwane także bardziej szczegółowo <em>Entity System</em> jest bez wątpienia bardzo ciekawym spojrzeniem na sposób rozwiązania problemów związanych z dużą ilością podobnych obiektów, których implementacja zawiera jednak pewne różnice. Pozwalają one w takiej sytuacji na uporządkowanie kodu i co za tym idzie ułatwienia jego dalszej rozbudowy.</p>
<p>Jest to technika stosowana najczęściej w przypadku produkcji gier komputerowych co nie oznacza, że w innych dziedzinach nie może znaleźć ona zastosowania. Istnieje wiele różnych podejść do takich kwestii jak umieszczenie kodu czy sposób kojarzenia komponentów z jednostkami. Dzieje się tak, ponieważ nie ma tutaj uniwersalnego rozwiązania i każdy dostosowuje to do swoich potrzeb. Podobnie rzecz się ma gdy porównać komponenty do OOP. Trudno powiedzieć żeby jeden paradygmat był lepszy od drugiego. Ich zastosowanie jest odmienne i należy tak je używać, aby wykorzystać jak najwięcej ich zalet.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=38&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/02/17/programowanie-oparte-na-komponentach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Protokół SOAP</title>
		<link>http://pdziepak.wordpress.com/2009/02/10/protokol-soap/</link>
		<comments>http://pdziepak.wordpress.com/2009/02/10/protokol-soap/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 22:39:57 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[mep]]></category>
		<category><![CDATA[message exchange pattern]]></category>
		<category><![CDATA[remote procedure call]]></category>
		<category><![CDATA[simple object access protocol]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xul]]></category>
		<category><![CDATA[xup]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=65</guid>
		<description><![CDATA[W każdym systemie rozproszonym, niezależnie od tego czy jest to CORBA, DCOM, .NET Remoting czy cokolwiek innego, niezbędny jest pewny protokół zdalnego wywoływania kodu. Java posiada swój RMI, CORBA &#8211; GIOP/IIOP, DCOM &#8211; własny protokół, ponadto w Uniksach często stosuje się RPC firmy Sun Microsystems. Ten ostatni próbowano pogodzić z językiem XML i w rezultacie [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=65&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>W każdym systemie rozproszonym, niezależnie od tego czy jest to CORBA, DCOM, .NET Remoting czy cokolwiek innego, niezbędny jest pewny protokół zdalnego wywoływania kodu. Java posiada swój <abbr title="Remote Method Invocation">RMI</abbr>, CORBA &#8211; GIOP/IIOP, DCOM &#8211; własny protokół, ponadto w Uniksach często stosuje się <abbr title="Remote Procedure Call">RPC</abbr> firmy Sun Microsystems. Ten ostatni próbowano pogodzić z językiem XML i w rezultacie stworzono XML-RPC, zwany protokołem XML pierwszej generacji. Jego następcą jest niewątpliwie jeden z ciekawszych protokołów zdalnego wywoływania procedur (i nie tylko) &#8211; SOAP.</p>
<h3>Podstawowe założenia</h3>
<p>SOAP zakłada, że każda wiadomość jest wysyłana od konkretnego nadawcy do przynajmniej jednego odbiorcy przy opcjonalnym udziale jednego lub więcej pośredników. Każdy z elementów uczestniczących w przekazaniu wiadomości (tj. nadawca, pośrednik i odbiorca) jest nazywany węzłem i posiada swój własny adres URI. Dodatkowo, każda przesyłana wiadomość jest całkowicie niezależna od pozostałych, a protokół nie wspiera żadnych mechanizmów synchronizacji.</p>
<h3>Budowa wiadomości</h3>
<p>Każda wiadomość składa się z nagłówka (<em>header</em>) i ciała (<em>body</em>). Pierwszy z tych elementów może być analizowany przez każdego z pośredników, a także przez ostatecznych odbiorców. Ciało wiadomości jest zarezerwowane jedynie dla odbiorców. Poniżej przedstawiono strukturę wiadomości:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
        xmlns:m="http://www.example.org/timeouts"
        xmlns:xml="http://www.w3.org/XML/1998/namespace"&gt;
        &lt;env:Header&gt;
                ...
        &lt;/env:Header&gt;
        &lt;env:Body&gt;
                ...
                &lt;env:Fault&gt;
                        ...
                &lt;/env:Fault&gt;
        &lt;/env:Body&gt;
&lt;/env:Envelope&gt;</pre>
<p>Nagłówek jest podzielony na bloki. Każdy blok posiada informację o roli do której jest przeznaczony, informacje czy musi być analizowany przez węzeł, informacje dotyczące warunków w których ma on być przekazany dalej oraz właściwe dane. Nagłówki służą głownie do realizacji przez pośredników dodatkowych zadań takich jak autoryzacja, logowanie czy dodatkowe mechanizmy bezpieczeństwa. Nagłówki są opcjonalne.</p>
<p>Ciało wiadomości jest częścią wymaganą przez standard, mimo że jej zawartość jest praktycznie dowolna. To właśnie w tym miejscu umieszczana jest treść wiadomości. Jedyną istotną rzeczą jest <code>env:Fault</code> jest to opcjonalny element używany do przekazywania informacji o błędach.</p>
<h3>Cechy (<em>features</em>)</h3>
<p>Niezwykle istotnym elementem protokołu SOAP są cechy (<em>features</em>), opisują one w dokładny sposób niemalże każdy aspekt całego procesu zdalnego wywołania procedury. Implementacje mają tutaj dość dużą dowolność, dzięki czemu mogą nadać pożądane w danym przypadku dodatkowe właściwości, które pozwolą lepiej wykorzystać możliwości protokołu SOAP.</p>
<h3>Role (<em>roles</em>)</h3>
<p>Role opisują zachowanie węzła po otrzymaniu danej wiadomości. Każdy blok w nagłówku posiada informację do jakiej roli jest przeznaczony, co decyduje czy węzeł powinien analizować zawartość danego bloku. Podobnie jak węzły i cechy, role także posiadają swój adres URI, który służy do ich identyfikacji. Wersja 1.2 standardu SOAP definiuje trzy role, lecz możliwe jest wprowadzenie dodatkowych.</p>
<ul>
<li><strong>next</strong> &#8211; każdy pośrednik oraz odbiorca musi przeanalizować nagłówek wiadomości</li>
<li><strong>none</strong> &#8211; nagłówek wiadomości nie może być analizowany</li>
<li><strong>ultimateReceiver</strong> &#8211; nagłówek wiadomości jest analizowany jedynie przez ostatecznych odbiorców, jest to domyślna rola</li>
</ul>
<h3>Właściwości (<em>properties</em>)</h3>
<p>Kolejnym istotnym elementem protokołu SOAP są właściwości. Przechowują one istotne informacje dotyczące wiadomości nie będące jednak jej częścią. Najczęściej dotyczą one szczegółów związanych z transmisją danych. Podobnie jak większość innych elementów SOAP właściwości także identyfikowane są adresami URI.</p>
<p>Istnieją dwa konteksty właściwości: kontekst węzła (<em>environment context</em>) i kontekst wiadomości (<em>message exchange context</em>). Pierwszy zawiera informacje dotyczące konkretnego węzła, takie jak jego numer IP czy lokalną datę i czas. Drugi oprócz standardowego opisu wiadomości takiego jak jej ID zawieta także informacje zależne od konkretnego MEP-a.</p>
<h3>Wzorce wymiany wiadomości (MEP)</h3>
<p><abbr title="Message Exchange Pattern">MEP</abbr> jest wzorcem według którego węzły SOAP wymieniają miedzy sobą informację. Każdy wzorzec tego typu posiada swój własny adres URI. Ich implementacja jest ściśle zależna od rodzaju wykorzystywanego protokołu niższej warstwy. Dodatkowo w zależności od schematu wg którego przesyłane są dane transmisja jest podzielona na poszczególne etapy. Dwa schematy wymienione w standardzie (które muszą być implementowane przez obsługę HTTP) to <em>Response Message Exchange Pattern</em> i <em>Request-Response Message Exchange Pattern</em>. Zasadnicza różnica między nimi jest taka, że pierwszy schemat nie zakłada przesyłania szczegółowego żądania. Ogranicza się ono do prostego wywołania zależnego od używanego protokołu niższej warstwy (np. HTTP). W obu przypadkach odpowiedź jest pełnowartościową wiadomością SOAP.</p>
<h3>Przetwarzanie wiadomości</h3>
<p>Po otrzymaniu wiadomości każdy węzeł analizuje ją w poszukiwaniu informacji, które są dla niego przeznaczone. Wygląda to w następujący sposób.</p>
<ol>
<li>Nagłówek wiadomości jest przeszukiwany pod kątem istnienia bloków przeznaczonych do roli jaką spełnia węzeł.</li>
<li>Odnajdywane są bloki nagłówka obowiązkowe do przetworzenia.</li>
<li>Jeżeli węzeł nie jest w stanie przetworzyć któregokolwiek z bloków znalezionych w powyższych punktach wysyłana jest zwrotna informacja o błędzie.</li>
<li>W przeciwnym wypadku węzeł przetwarza w odpowiedni dla siebie sposób znalezione bloki. Jeżeli jest jednocześnie ostatecznym odbiorcą przetwarza także ciało wiadomości.</li>
<li>W sytuacji gdy węzeł nie jest odbiorcą oraz nie wystąpił żaden błąd wiadomość jest przekazywana dalej z pominięciem przetworzonych bloków w nagłówku.</li>
</ol>
<h3>Transmisja wiadomości</h3>
<p>W większości przypadków SOAP wykorzystuje do przesyłania danych protokół HTTP. Dzięki temu łatwiej jest zbudować system oparty na SOAP w sieci z firewallami i serwerami proxy. Warto także zauważyć, że HTTP idealnie odpowiada specyfice SOAP. Każda wiadomość SOAP, podobnie jak każde żądanie HTTP, jest całkowicie niezależna od pozostałych. Naturalnie, możliwe jest także wykorzystywanie HTTPS do transmisji wymagających większego bezpieczeństwa. Inną alternatywą, choć dość rzadko spotykaną i omawianą, jest wykorzystanie protokołu SMTP. Spotyka się także implementacje które dla zwiększenia wydajności operują bezpośrednio na niższej warstwie &#8211; protokole TCP.</p>
<p>Jak zostało to wspomniane w paragrafie o wzorcach wymiany wiadomości, transmisja jest podzielona na stany. Oto przykładowy przebieg transmisji <em>Request-Response Message Exchange Pattern</em> z użyciem protokołu HTTP.</p>
<ul>
<li><strong>init</strong>Odpowiednia właściwość kontekstu wiadomości zawiera adres HTTP węzła do którego należy się połączyć. Wykorzystywana jest w zależności od konfiguracji i/lub implementacji metoda GET lub POST. W żądaniu HTTP umieszczone zostają wszystkie informacje dotyczące kodowania znaków. W tym czasie nasłuchujący adresat przyjmuje połączenie i jeżeli nie wystąpi żaden błąd oczekuje na zakończenie transmisji ze strony nadawcy.</li>
<li><strong>requesting</strong>Używając metody określonej w poprzednim etapie przesyłana jest treść żądania do adresata. W zależności od odpowiedzi algorytm może powrócić do stanu <em>init</em> aby ponowić próbę (ma to miejsce np. przy przekierowaniach), <em>fail</em> jeżeli wystąpił bład lub <em>sending+receiving</em> jeżeli wszystko przebiegło pomyślnie. W tym samym czasie adresat jest w stanie <strong>responding</strong> w którym oczekuje na dane od nadawcy i po ich odebraniu wysyła odpowiedź.</li>
<li><strong>sending+receiving</strong>W tym stanie adresat przetwarza otrzymaną wiadomość. Transmisja danych jest zakończona.</li>
<li><strong>success</strong> lub <strong>fail</strong>W zależności od wyniku przeprowadzonej operacji węzeł kończy przesyłanie danych z informacją o sukcesie lub porażce.</li>
</ul>
<h3>Serializacja danych</h3>
<p>Niezbędnym elementem w każdym systemie zdalnych wywołań procedur jest mechanizm serializacji przekazywanych danych, takich jak argumenty funkcji. Nazwy występujące w programie wykorzystującym SOAP są modyfikowane w taki sposób aby mogły zostać użyte w każdym elemencie języka XML. Dlatego niedozwolone znaki zastępuje się ich wartością szestnastkową w UTF-16 (lub UTF-8) dla przykładu <code>Hello world</code> zostanie zamienione na <code>Hello_x0020_world</code>.</p>
<p>Wywołanie jest przedstawiane w ciele wiadomości jako element o nazwie takiej jak nazwa funkcji (oczywiście po zakodowaniu znaków niedozwolonych w XML-u) zawierający wszystkie wejściowe i wejściowo-wyjściowe argumenty. Każdy argument jest przedstawiany jako element o tej samej nazwie zawierający jego wartość (także po przekształceniu w formę akceptowalną dla XML-a). Odpowiedzią jest element o dowolnej nazwie zawierający wszystkie argumenty wyjściowe oraz wejściowo-wyjściowe. Sposób ich zapisu jest taki sam jak w przypadku wywołania. Do RPC wykorzystywane są wzorce <em>Response Message Exchange Pattern</em> i <em>Request-Response Message Exchange Pattern</em>, chociaż standard zezwala także na inne.</p>
<h3>Zastosowanie</h3>
<p>SOAP jest jednym z elementów pozwalającym na rozproszoną dystrybucję komponentów. Razem z technologiami takimi jak WSDL pozwala on na stworzenie rozbudowanego systemu podobnego do CORBA i DCOM. W rezultacie zostało to uczynione w <em>Java 2 Enterprise Edition</em> (gdzie SOAP występuje obok <em>Java RMI</em>) oraz platformie <em>.NET</em>, gdzie SOAP ma za zadanie całkowicie wyprzeć DCOM. Często też spotyka się tę technologię w aplikacjach webowych z racji wykorzystania typowych dla tej dziedziny technologii jak XML i HTTP. Trwają także prace nad standardem <abbr title="Extensible User Interface Protocol">XUP</abbr>, który jest czymś w rodzaju połaczenia SOAP i <abbr title="XML User Interface Language">XUL</abbr>. Zakłada on wykorzystanie SOAP do przekazywania informacji o zdarzeniach dotyczących interfejsu opartego na XML (na przykład wspomniany XUL).</p>
<h3>Podsumowanie</h3>
<p>SOAP jest niewątpliwie ciekawym protokołem, mimo że oparcie się na XML-u ogranicza jego wydajność. Co prawda trwają pracę nad technologiami takimi jak <em>Binary XML</em>, który pozwolą przyśpieszyć pracę z XML-em, lecz jak na razie w starciu wydajnościowym CORBA czy DCOM bez problemu są w stanie pokonać SOAP.</p>
<p>To co jest wadą jest także i zaletą, fakt, że SOAP opiera się na XML-u pozwala na wykorzystanie w nim wielu istniejących już technologii (chociażby XSLT czy algorytmy serializacji danych). Stawia on na modułowość i łatwość dostępu co niejednokrotnie jest ważniejsze od wydajności. Jednak niezależnie od tego, jest to bez wątpienia bardzo interesująca technologia.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=65&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/02/10/protokol-soap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
		<item>
		<title>Komunikacja międzyprocesowa w QNX</title>
		<link>http://pdziepak.wordpress.com/2009/02/03/komunikacja-miedzyprocesowa-w-qnx/</link>
		<comments>http://pdziepak.wordpress.com/2009/02/03/komunikacja-miedzyprocesowa-w-qnx/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 22:22:19 +0000</pubDate>
		<dc:creator>Pawel Dziepak</dc:creator>
				<category><![CDATA[Polish Archive]]></category>
		<category><![CDATA[ipc]]></category>
		<category><![CDATA[komunikacja międzyprocesowa]]></category>
		<category><![CDATA[messages]]></category>
		<category><![CDATA[mikrojądro]]></category>
		<category><![CDATA[qnx]]></category>

		<guid isPermaLink="false">http://pdziepak.wordpress.com/?p=34</guid>
		<description><![CDATA[Na desktopach oraz serwerach niewątpliwie królują jądra monolityczne. Kernele systemów takich jak *BSD, (Open)Solaris czy Linux z grubsza opierają się na tej samej architekturze. Podobnie rzecz się ma w stosunku do Windowsa, mimo że w jego budowie jest już parę ciekawych różnic. Właściwie jedynym popularnym na tego typu maszynach systemem bazującym na mikrojądrze jest Mac [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=34&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Na desktopach oraz serwerach niewątpliwie królują jądra monolityczne. Kernele systemów takich jak *BSD, (Open)Solaris czy Linux z grubsza opierają się na tej samej architekturze. Podobnie rzecz się ma w stosunku do Windowsa, mimo że w jego budowie jest już parę ciekawych różnic. Właściwie jedynym popularnym na tego typu maszynach systemem bazującym na mikrojądrze jest Mac OS X korzystający z jądra Mach.</p>
<p>Zupełnie inaczej rzecz się ma w przypadku systemów wbudowanych, a także wielu systemów czasu rzeczywistego. Tam mikrojądra odgrywają znacznie większą rolę. Jednym z popularniejszych systemów opartych na mikrojądrze jest QNX korzystający z jądra QNX Neutrino. Jego wewnętrzna architektura jest zupełnie inna od tej znanej z Linuksa czy też Uniksów. Wynika to głównie z tego, że nacisk jest położony na zupełnie elementy systemu. Jedną z najistotniejszych kwestii we wszystkich mikrojądrach jest komunikacja międzyprocesowa.</p>
<h3>Wiadomości (<em>messages</em>)</h3>
<p>Podobnie jak w innych systemach opartych na mikrojądrach, także w QNX tym co łączy wszystkie elementy systemu w jedną całość jest <abbr title="InterProcess Comunication">IPC</abbr>. Podstawowym mechanizmem IPC udostępnianym przez QNX Neutrino są wiadomości (<em>messages</em>). Są to synchroniczne komunikaty na które adresat <em>zawsze</em> odpowiada. Warto przyjrzeć się sposobowi w jaki Neutrino przekazuje wiadomości.</p>
<ul>
<li>Wątek będący klientem wykonuje procedurę <em>MsgSend()</em>. Przechodzi on w stan <em>SEND blocked</em>, co jest równoważne jego wstrzymaniu. Jeżeli wątek będący adresatem czeka na wiadomość, jest on wznawiany automatycznie, bez udziału planisty.</li>
<li>W momencie w którym wątek będący serwerem wywoła procedurę <em>MsgReceive()</em> dostanie on informację o otrzymanej wiadomości, a nadawca przejdzie w stan <em>REPLY blocked</em>. Jeżeli procedura <em>MsgReceive()</em> zostanie wywołana w sytuacji, kiedy nie ma żadnych wiadomości w kolejce do przetworzenia, wątek przejdzie w stan <em>RECEIVE blocked</em> i zostanie wstrzymany do momentu otrzymania wiadomości.</li>
<li>Po wykonaniu operacji związanych z obsługą otrzymanego komunikatu, serwer wykonuję procedurę <em>MsgReply()</em>, która przekazuje klientowi odpowiedź lub <em>MsgError()</em>, która przekazuje informacje o błędzie. Obie te funkcje powodują przejście klienta w stan <em>READY</em>, a więc wznowienie jego działania.</li>
</ul>
<h3>Przesyłanie danych</h3>
<p>Obok synchronizacji działania realizowanej przez przechodzenie wątków w różne stany drugą kwestią jest sam sposób przesłania danych. Jeżeli ilość przesyłanych danych jest niewielka (najczęściej poniżej 256 bajtów) są one buforowane w przestrzeni jądra i w ten sposób przenoszone między przestrzeniami adresowymi dwóch wątków. W przeciwnym razie Neutrino tymczasowo mapuje fragment przestrzeni adresowej serwera w przestrzeni klienta co pozwala na przeniesienie danych między nimi w bardzo wydajny sposób. Dzięki temu prędkość kopiowania wiadomości jest zależna jedynie od przepustowości pamięci operacyjnej urządzenia. Neutrino pozwala także na wysyłanie wiadomości złożonych z bloków o różnych rozmiarach rozmieszczonych w różnych obszarach przestrzeni adresowej.</p>
<h3>Kanały (<em>channels</em>) i połączenia</h3>
<p>W QNX Neutrino wątek, który chce otrzymywać wiadomości musi utworzyć kanał (<em>channel</em>). Nadawca, przed wysłaniem danych nawiązuje połączenie z tym kanałem. W przestrzeni użytkownika zarówno kanały jak i połączenia są reprezentowane przez liczby całkowite. Dodatkowo liczby identyfikujące połączenia używa się zamiennie z deskryptorami plików. Do każdego kanału przyporządkowane są trzy struktury danych przechowujące informacje o klientach.</p>
<ul>
<li><strong>receive</strong> &#8211; bufor <abbr title="Last In First Out">LIFO</abbr> wątków oczekujących na wiadomość</li>
<li><strong>send</strong> &#8211; kolejka (<abbr title="First In First Out">FIFO</abbr>) wątków, które wysłały jeszcze nieodebrane wiadomości</li>
<li><strong>reply</strong> &#8211; nieuporządkowana lista wątków, które wysłały wiadomość na którą nie udzielono jeszcze odpowiedzi</li>
</ul>
<h3>Podsumowanie</h3>
<p>Oprócz wyżej wymienionych <em>messages</em> QNX wspiera także wiele innych rodzajów komunikacji międzyprocesowej. Są to sygnały, kolejki, <em>pipes</em>, pamięć dzielona, itp. Ich implementacja opiera się jednak głównie na <em>messages</em>, które to w najbardziej dobitny sposób przedstawiają cechy charakterystyczne QNX jeżeli chodzi o przesyłanie komunikatów. Wykorzystany został w nich przemyślany system synchronizacji, pozwalający uniknąć opóźnienia związanego z wywołaniem planisty CPU oraz mechanizm kopiowania danych wybierający optymalną metodę dla określonej ich ilości. Nie dziwi nacisk jaki położono właśnie na IPC, skoro jest to jeden z najważniejszych elementów mikrojądra QNX Neutrino.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pdziepak.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pdziepak.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pdziepak.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pdziepak.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pdziepak.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pdziepak.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pdziepak.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pdziepak.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pdziepak.wordpress.com&amp;blog=7106463&amp;post=34&amp;subd=pdziepak&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pdziepak.wordpress.com/2009/02/03/komunikacja-miedzyprocesowa-w-qnx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6995c749b211f2c934dcb321f935dd80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pdziepak</media:title>
		</media:content>
	</item>
	</channel>
</rss>
