Zarządzanie procesami pod Windows

Programy, które uruchamiamy, są widziane przez system operacyjny jako tzw. procesy. Każdy proces posiada swój plik wykonywalny, czyli plik z którego został uruchomiony. Pliki te mają rozszerzenie .exe. Przykładowo Notatnik uruchamiany jest z pliku notepad.exe. Gdy włączamy program, system operacyjny ładuje do pamięci dany plik .exe i analizuje jego zawartość. Wczytuje z niego właściwy kod programu, informacje o używanych bibliotekach (pliki .dll), które też ładuje, oraz inne dane związane z wykonywaniem danego programu. Po uruchomieniu proces otrzymuje swój identyfikator - PID. Po tych identyfikatorach można rozróżniać uruchomione procesy, szczególnie jeśli jakiś program został uruchomiony kilkukrotnie i działa kilka jego kopii. Każdy proces ma też przydzieloną pamięć, w której trzymane są dane wykorzystywane przez program. Każdemu procesowi przydzielany jest również czas procesora. Ponieważ w danej chwili uruchomionych jest wiele procesów, procesor musi się szybko między nimi przełączać, poświęcając ułamek czasu na wykonywanie kodu każdego z nich. Jak duży jest ten ułamek, decyduje system operacyjny na podstawie czynności wykonywanej w danej chwili przez proces (oczekiwanie na dane użytkownika, przeprowadzanie obliczeń itd). Użytkownik może wpływać na przydział czasu ustawiając priorytety dla procesów.

Procesy pod Windows mogą wyświetlać okna, z większością programów pracujemy właśnie w ten sposób. Programy działające jako usługi nie wyświetlają z reguły żadnych okien. Są też programy konsolowe, przeznaczone do uruchamiania z wiersza polecenia (cmd.exe). Działają one w trybie tekstowym i korzystają z konsoli (wiersza polecenia) do komunikacji z użytkownikiem. Należy uruchamiać je właśnie z konsoli, a nie przez dwukrotne kliknięcie na pliku .exe albo przez okienko Uruchamianie, które wywołuje się przez Start -> Uruchom. Przykładem takiego programu jest ipconfig, który służy m.in. do wyświetlania konfiguracji interfejsów sieciowych. Gdy zostanie uruchomiony bez żadnych parametrów, wyświetla konfigurację i kończy pracę. Dlatego nie ma sensu uruchamiać go inaczej jak z wiersza polecenia, np. przez Start -> Uruchom, bo wtedy program tylko mignie na chwilę.

Z uruchamianiem procesów mamy do czynienia bardzo często, dzieje się to za każdym razem gdy uruchamiamy jakiś program, np. ze skrótu albo klikając plik exe. Do uruchomienia procesu (programu) możemy też wykorzystać wiersz polecenia (konsolę) i okienko Uruchamianie. Przy uruchamianiu procesu można określić jego priorytet oraz parametr, który zostanie do niego przekazany. Ustawianie priorytetu dostępne jest tylko z konsoli. Można wykorzystać tutaj polecenie start:

start /LOW calc.exe

Spowoduje ono uruchomienie programu Kalkulator z priorytetem niskim. Parametr także można przekazywać z konsoli:

notepad.exe C:\plik.txt

Polecenie to spowoduje, że Notatnik zostanie uruchomiony z parametrem C:\plik.txt. Notatnik traktuje otrzymany parametr jako ścieżkę do pliku, który ma otworzyć. Jeśli więc ten plik istnieje, to zostanie otworzony przez Notatnik. Działają tak praktycznie wszystkie programy, które otwierają jakieś pliki. Gdy klikamy na jakiś plik, z którym skojarzony jest jakiś program, to ścieżka do tego pliku zostanie przekazana do uruchamianego procesu. Parametr można przekazywać też przez skrót. Jeśli zrobimy skrót do pliku exe, to możemy potem otworzyć jego właściwości i w polu Element docelowy dopisać dowolny parametr. Pewną formą przekazania parametru jest też przeciągnięcie ikonki dowolnego pliku na ikonkę pliku exe. Wtedy ten plik .exe zostanie uruchomiony a jako parametr otrzyma ścieżkę do przeciąganego pliku. Parametry można też wpisywać w okienku Uruchamianie.

Uwaga, krótkie przypomnienie zasad pracy z konsolą:
1. Ścieżki zawierające spacje muszą być w cudzysłowie, np.

"C:\Program Files\Internet Explorer\iexplore.exe" http://www.google.pl/

2. Jeśli chcemy uruchomić program, który nie leży w katalogu bieżącym, ani w żadnym z wymienionych w zmiennej PATH, musimy podać pełną ścieżkę do niego.
3. Przy pracy z programem start trzeba pamiętać, że tekst ujęty w cudzysłowy może zostać potraktowany jako parametr oznaczający tytuł okna. Dlatego trzeba użyć dodatkowego cudzysłowu, np.

start "" "C:\Program Files\Internet Explorer\iexplore.exe"

Oczywiście proces może być uruchomiony także przez inny proces. I de facto praktycznie zawsze tak jest, bo jeśli nawet uruchamiamy coś ręcznie, to i tak dany proces jest uruchamiany przez narzędzie, którego użyliśmy, zwykle będzie to powłoka systemowa (explorer.exe) w przypadku klikania albo konsola (cmd.exe).

Po omówieniu uruchamiania procesów, trzeba też wspomnieć o ich zakańczaniu. W przypadku programów okienkowych możemy zamknąć główne okno programu albo skorzystać z menu. Proces zostaje wtedy o tym powiadomiony i wykonuje procedurę kończącą jego działanie. W przypadku programów konsolowych można zazwyczaj wcisnąć Ctrl+C, a jeśli program posiada np. linię komend, wpisać odpowiednie polecenie. Co jednak zrobić, jeśli program nie daje się normalnie zamknąć? Wtedy pozostaje zabicie procesu. Zwykle wykonujemy je z Menedżera zadań, wybierając proces i klikając przycisk Zakończ proces. Sam menedżer zadań można włączyć na kilka sposobów. Można wcisnąć Ctrl+Alt+Del i wybrać uruchomienie menedżera zadań. Jest to sposób popularny, ale można go przyspieszyć, wciskając Ctrl+Shift+Esc, wtedy Menedżer zadań zostanie uruchomiony od razu. Można także kliknąć prawym przyciskiem myszy na pasku zadań i wybrać Uruchom Menedżera zadań. A jak zabić proces z konsoli? Służy do tego polecenie taskkill. Może ono zabijać procesy po identyfikatorze albo po nazwie pliku .exe. W tym pierwszy przypadku używamy przełącznika /PID, w drugim /IM, np.

taskkill /pid 1234
taskkill /im notepad.exe

Polecenie taskkill ma też możliwość filtrowania po parametrach takich jak np. nazwa okna, zużycie pamięci czy numer sesji.

Najpopularniejszą alternatywą dla systemowego Menedżera zadań jest program Process Explorer. Dostarcza on wielu szczegółowych informacji na temat działających procesów. Można np. sprawdzić, przez jaki proces został uruchomiony dany proces, i z jakim parametrem. Można wyświetlić też listę załadowanych bibliotek lub uchwytów do plików, kluczy rejestru czy zdarzeń. Uchwyty te można zamykać, co czasem może być pomocne, np. gdy jakiś program trzyma otwarty plik, który chcemy skasować. Jeśli znamy nazwę pliku, ale nie znamy procesu, który go trzyma, możemy wyszukać go klikając na ikonkę lornetki. Przełączanie między widokiem bibliotek a uchwytów wykonuje się przez menu View -> Lower Pane View. Ciekawą funkcją Process Explorera jest możliwość wstrzymywania wątków, dzięki której można zatrzymać działanie programu. We właściwościach danego procesu trzeba przejść do zakładki Threads. Po wybraniu wątku można go zatrzymać klikając na Suspend. Można też go zabić klikając na Kill. Jeśli program jest jednowątkowy, wstrzymanie wątku spowoduje zamrożenie całej aplikacji. W przypadku programu wielowątkowego, wyłączone zostaną funkcje realizowane przez ten wątek.

W przypadku konsoli listę procesów można wyświetlić poleceniem tasklist. Jeśli potrzebne byłoby bardziej zaawansowane narzędzie, np. pokazujące pełne ścieżki do plików exe, można wykorzystać WMI. Służy do tego polecenie wmic, za pomocą którego możemy wyświetlić właściwości obiektów klasy Win32_Process. Przykładowo:

wmic path win32_process get Processid,ParentProcessId,CommandLine

Polecenie to wyświetli listę identyfikatorów procesów, ich procesów-rodziców, oraz ścieżkę z parametrami. Jeśli dla niektórych procesów nie będą widoczne dane takie jak ścieżka, wówczas wiersz polecenia trzeba najpierw uruchomić z uprawnieniami administracyjnymi i dopiero potem wydać w nim komendę wmic. Jeśli wynik komendy będzie nieczytelny przez zawijające się długie linijki, wyjście komendy można przekierować do pliku:

wmic path win32_process get Processid,ParentProcessId,CommandLine > procesy.txt
start procesy.txt

Szczegółowe informacje na temat poleceń start, tasklist i taskkill można znaleźć w pomocy do Windows oraz uruchamiając je z parametrem /? (np. start /?).