Jak system operacyjny widzi IE8

Spogladacie czasem na aktywne w systemie procesy? Mi sie zdarza. Wprawdzie nie tylko dzieki takiemu spogladaniu wiem, ze kazda zakladka w IE8 to oddzielny proces, ale gdyby ktos jeszcze nie wiedzial – latwo to sam zauwazy. Ostatnio jednak, przyjrzalem sie procesom dokladniej i zauwazylem jeszcze jedna rzecz:

IE_process

Podany w poleceniu parametr to PID (zwany w WinDBG dla niepoznaki Cid) jednego z procesów Internet Explorera.

W wyniku wyraznie widac pole Job. Nie wiem jak po polsku fachowo nazywa sie obiekty tego typu. Moge latwo znalezc polski odpowiednik, jednak pozostane przy "obiekt Job" bo dzieki temu unikne niejasnosci. Job jest specyficznym obiektem grupujacym procesy po to, zeby sprawnie nimi zarzadzac traktujac je w pewnych aspektach jak jedna calosc. Opisany jest w MSDN, wiec zainteresowanych odsylam. W kazdym razie uwazam, ze wlasnie takiego grupowania trzeba przegladarce! Niby to oddzielne procesy (pozostawie na inna okazje polemike czy to dobrze czy zle) ale w sumie tez jakby jedna calosc z punktu widzenia uzytkownika. Stad idea wspólnego zarzadzania bardzo mi sie podoba.

Poniwaz Job jest grupa procesów, mozemy latwo odczytac pewne parametry dla calej grupy. Wymienic tu mozna miedzy innymi:

  • Sumaryczny czas procesora (zliczany oddzielnie dla trybu kernel i user)
  • Laczna ilosc bledów stron
  • Ilosc procesów (oddzielnie dla aktywnych i w ogóle kiedykolwiek istniejacych)
  • Ilosc bajtów przeslanych do i z podsystemu I/O

Odczytanie takich danych nie jest specjalnym wyzwaniem nawet, gdybysmy nie mieli obiektu Job. Wystarczyloby zsumowac takie informacje dla wszystkich procesów, które nas interesuja i wynik wyszedlby taki sam. Powiedzmy, ze jakis problem mielibysmy tylko przy procesach, które ulegly zakonczeniu. Job o nich "pamieta" a inne mechanizmy niekoniecznie. Od odczytywania historii ciekawsze jest jednak nakladanie na obiekt Job ograniczen. Mozna to zrobic! Oznacza to, ze majac Job, mozemy powiedziec, ze nalezace do niego procesy moga robic co chca, na przyklad pod warunkiem, ze nie bedzie ich wiecej niz 10. Albo ze lacznie nie zuzyja wiecej niz 15s czasu procesora. Ograniczen jest wiele i do powyzszych przykladów dodac mozna chociazby:

  • Ograniczenie procesorów, na których maja sie wykonywac istniejace i nowe procesy nalezace do tego samej grupy (obiektu Job)
  • Laczna ilosc pamieci dla wszystkich procesów w grupie
  • Minimalny i maksymalny rozmiar WorkingSet dla procesów (de facto oznacza to ilosc faktycznie zajetej pamieci RAM)
  • Zakazy dotyczace jednej z osmiu mozliwych akcji (JOBOBJECT_BASIC_UI_RESTRICTIONS) w systemie. Biorac pod uwage, ze obiekt Job, o którym tu mówimy dotyczy przegladarki, dojdziemy do wniosku, ze moze to nie byc takie glupie.

Warto wiec w przypadku IE8 spojrzec glebiej na wlasciwosci obiektu Job:

IE_job

Niestety wydaje sie, ze domyslnie zadne ograniczenia nie sa narzucone. Moze to zle a moze dobrze... Wazne, ze procesy sa polaczone w grupe, wiec mozna nia zarzadzac, jezeli tylko zajdzie taka potrzeba. Teoretycznie to proste. Wystarczy odwolac sie do obiektu Job przy pomocy OpenJobObject. Proste, bo wystarczy podac nazwe obiektu (uwaga bo duze / male litery ma znaczenie). Nazwe obiektu...? Wezmy na przyklad obiekt Job dla procesu wmiprvse.exe. W tym przypadku, w obiekcie Job wyraznie widac nalozone ograniczenia.

wmiprvse_job

Jego nazwa to \BaseNamedObjects\WmiProviderSubSystemHostJob. Ale dla IE8 nazwy takiej nie ma! Jest to jak najbardziej dozwolone, ale w praktyce oznacza jedno: do takiego obiektu nie mozna sie oficjalnymi kanalami dostac z zewnatrz. Oficjalnymi. Kernel debugger trudno uznac za oficjalny kanal, ale zawsze mozemy spróbowac:

ie_limited

Wychodzi na to, ze udalo nam sie ograniczyc grupe procesów IE do 2 sztuk, choc to nieco zlozona metoda, zwlaszcza dla uzytkownika bez praw administratora.

Warto jeszcze spojrzec na tak zwane "konkurencyjne przegladarki". W firefoxie jest prosto. Skoro twórcy tak dlugo nie pojeli, czym sa integrity levels, to trudno sie dziwic, ze wszystkie zakladki pracuja w jednym procesie jak w wersji 1.0. Nalezy jednak przyznac, ze jest to konsekwentna polityka. Niezaleznie od ilosci okien, proces nadal pozostaje tylko jeden.

Ciekawiej jest w Chrome. Tu kazda zakladka jest oddzielnym procesem. Sprawdzenie takich procesów daje bardzo interesujace rezultaty. Wprawdzie prawie kazdy (wcale nie wszystkie!) proces nalezy do grupy, ale kazdy do oddzielnej! O co chodzi – nie wiem. Obiekty Job podobnie jak w IE8 nie maja nazwy, maja jednak domyslnie narzucone ograniczenia dozwolonych dzialan.

chrome_job

Skupiajac sie jednak na IE8, warto stwierdzic, ze o ile podejscie jedna zakladka = jeden proces moze budzic kontrowersje, o tyle polaczenie tych procesów w jedna grupe (obiekt Job) jest pomyslem zdecydowanie dobrym. Co wiecej, w jedna grupe laczone sa nie tylko zakladki jednego okna, ale wszystkie procesy zwiazane z IE8, niezaleznie od tego ile okien zajmuja. Wprawdzie w chwili obecnej (wersja 8.0.6001.18702) trudno sie do takiego obiektu z zewnatrz "dobrac", ale wydaje sie, ze funkcjonalnosci bedace efektem zastosowanego podejscia dostepne sa na wyciagniecie reki.

Autor: Grzegorz Tworek [MVP]

PS. Gdyby ktos znal metode uzyskania uchwytu do Job Object bez nazwy – bede wdzieczny za podpowiedz. Programista ze mnie zaden a wyszukiwarki jakos niewiele pomogly.