W .NET istnieje twór zwany AppDomain. W systemie operacyjnym mamy kilka podobnych pojęć takich jak proces czy wątek. AppDomain w dużej mierze przypomina proces – służy do izolowania aplikacji bezpośrednio niezwiązanych ze sobą. Dwa różne procesy mają przede wszystkim różną przestrzeń pamięciową. Adres zmiennej w procesie A, odnosi się już do innego obszaru w procesie B – alokacja zaczyna się w różnych miejscach. Z tego względu uruchomienie nowego procesu jest czasochłonną operacją i wiąże się z alokacją pewnych zasobów.
Czym różni się zatem AppDomain od procesu? Wiemy, że stopień izolacji jest podobny do procesu. Różnica polega na tym, że jeden proces może mieć kilka AppDomain. Poza tym AppDomain jest znacznie szybszy od procesu i jego uruchomienie nie wymaga alokacji aż tylu zasobów. Zatem jeśli ze względów bezpieczeństwa chcemy wykonać jakiś kod w izolacji, lepiej uruchomić nowy AppDomain a nie proces. Ponadto, jak wiemy, bibliotek załadowanych nie można ponownie usunąć z tego samego procesu. Za pomocą AppDomain można uniknąć tego problemu: tworzymy nowy AppDomain, ładujemy potrzebne biblioteki, wykonujemy kod a na końcu usuwamy AppDomain wraz z wszystkimi nadmiarowymi bibliotekami.
Jeśli piszemy aplikację serwerową i chcemy aby każdy request został wykonany w środowisku odizolowanych wtedy warto zastanowić się nad uruchamianiem AppDomain – jest to dużo szybsze niż uruchamianie nowego procesu. Podsumowują dzięki AppDomain :
-
Kod w jednym AppDomain nie wpływa na drugi – jakakolwiek awaria nie wpływa na wykonanie kodu w innej domenie.
-
Istnieje możliwość wyładowania z pamięci kodu, nie kończąc tym samym działania całej aplikacji.
-
Kod z jednego AppDomain nie może korzystać ani odwoływać się do zasobów drugiej domeny.
-
Pozwolenia mogą być nadawane niezależnie.
Tak jak w procesach i w przeciwieństwie do wątków jeden AppDomain nie może odwoływać się do zmiennych z drugiego AppDomain. Istnieje jednak pewien sposób komunikacji ale o tym w przyszłym poście – podobny jest do zdalnej komunikacji a nie do bezpośredniej adresacji.
To tyle teoretycznego wstępu. W następnym poście pokażę jak to wygląda od strony programistycznej i API.