Programowanie Aplikacji Lokalnych w Środowisku .NET

Slides:



Advertisements
Podobne prezentacje
System operacyjny i sterowniki urządzeń
Advertisements

Systemy Operacyjne.
C++ wykład 2 ( ) Klasy i obiekty.
SYSTEMY OPERACYJNE WSTĘP
Bezpieczeństwo wyjątków w C++: OpenGL
Systemy rozproszone W. Bartkiewicz
1 Linux jako system wielozadaniowy i wielodostępny.
ADAM Active Directory w trybie aplikacyjnym
WĄTKI I ICH SYNCHRONIZACJA Natalia Wyczislok. Proces Procesem określamy zazwyczaj wykonywany program w skład, którego wchodzą: kod programu, licznik rozkazów,
Programowanie wielowątkowe
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Wykład nr 3: Struktura systemu operacyjnego
Systemy operacyjne Wykład nr 4: Procesy Piotr Bilski.
Wykład nr 2: Struktura systemu komputerowego a system operacyjny
C++ wykład 2 ( ) Klasy i obiekty.
Systemy operacyjne.
Systemy operacyjne Bibliografia:
Systemy operacyjne Bibliografia:
Gniazda komunikacji sieciowej w języku Java
ZARZĄDZANIE PROCESAMI
Język Java Wielowątkowość.
Semafory według normy POSIX
9. KOORDYNACJA PROCESÓW WSPÓŁBIEŻNYCH PRZY UŻYCIU INTERPRETATORA
Systemów Operacyjnych
Programowanie systemowe. Architektura systemu Windows
Wieloprocesowy system operacyjny dla komputerów ATARI XL/XE
Wątki.
Pamięć wspólna Przegląd stosowanych rozwiązań Marcin Kamiński, Michał Kotra Wydział EAIiE Katedra Automatyki Kraków, 2008.
Budowa, przeglądanie i modyfikacja
Novell Account Management 3.0
C# Windows Forms Zastosowania Informatyki Wykład 3
C# Windows Forms Zastosowania Informatyki Wykład 2
SIEĆ P2P 1. Definicja sieci równouprawnionej. To taka sieć, która składa się z komputerów o takim samym priorytecie ważności, a każdy z nich może pełnić.
Zarządzanie dostępem do zasobów
Programowanie urządzeń mobilnych – wykład IV
Bootloader – program rozruchowy
Programowanie w Środowisku Windows
Tworzenie nowych kont lokalnych i domenowych, oraz zarządzanie nimi
Wielozadaniowowść systemu operacyjnego Linux
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Systemy operacyjne.
Budowa systemu komputerowego
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Rozdział 1: Wprowadzenie do systemu Windows 2000 i podstaw sieci
Rejestr systemu Windows
Programowanie obiektowe – zastosowanie języka Java SE
Narzędzia administracyjne
Przerwanie ang. interrupt.
M i k r o j ą d r o D e f i n i c j a. M i k r o j ą d r o to rodzaj jądra systemu operacyjnego, które zawiera tylko najbardziej niezbędne elementy, takie.
Spis treści Architektura systemu windows Pamięć wirtualna Plik wymiany
Etapy uruchamiania systemu Pliki konfiguracyjne
Systemy operacyjne Wykład 6a Procesy dr inż. Wojciech Bieniecki
W ą t e k (lekki proces) thread.
Przykłady implementacji planowania przydziału procesora
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Uprawnienia w Windows Server
Jacek Matulewski 7 kwietnia 2015
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Model współbieżności w Javie
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Systemy operacyjne Wykład 6 Procesy dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki 1.
Programowanie Obiektowe – Wykład 6
Wątki, programowanie współbieżne
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
Jacek Matulewski 7 kwietnia 2015
Aplikacje i usługi internetowe
Zapis prezentacji:

Programowanie Aplikacji Lokalnych w Środowisku .NET Architektura systemu, jądro systemu, obiekty jądra, uchwyty Wielozadaniowość, procesy, zadania, wątki, szeregowanie zadań

pptPlex Section Divider [Jądro i inni] pptPlex Section Divider The slides after this divider will be grouped into a section and given the label you type above. Feel free to move this slide to any position in the deck.

Literatura MSDN C. Petzhold Programowanie Windows 98/98/NT/Win2k J. Richter CLR via C# 3-rd ed. J. Richter Applied Microsoft .NET Framework Programming

ASCII vs UNICODE Strony kodowe, UTF8-32 Win98 - natulalna reprezentacja ASCII (istnieją funkcje UNICODE niestety sporo błędów/atrap) Win NT, 2K, XP,2003 - naturalna reprezentacja UNICODE funkcje istnieją w wersjach xxxxW i xxxxA (A->U) COM (+) - UNICODE (Win98 + COM = kłopoty ???) .NET – UTF 16 (niekiedy UTF8 wewnetrznie)

ASCII vs UNICODE CompareString, CharUpper, IsCharAlpha Systemowe API CompareString, CharUpper, IsCharAlpha IsTextUnicode, MultiByteToWideChar System.Text.Encoding.UnicodeEncoding IsMailNewsSave, WebName, WindowsCodePage, ... GetChars, GetBytes, GetByteCount, GetCharCount, GetDecoder, GetEncoder, GetString, ... .NET – UTF 16 (niekiedy UTF8 wewnetrznie) C# char c = '\u0066’

Zarys architektury systemu Systemowe procesy pomocnicze np. menedźer sesji, proces logowania Procesy usługowe Aplikacje użytkownika: Win 32 win16 DOS POSIX/ OS/2 Podsystemy środowiskowe win32*** OS/2 POSIX biblioteki podsystemów tryb użytkownika tryb jądra Centrum wykonawcze * System okien*** Grafika*** jądro * sterowniki urządzeń Warstwa niezalezna od sprzętu HAL ** *ntoskrnl.exe/ntkrnlpa.exe, ntdll.dll, ** hal.dll, *** kernel32.dll, adwapi32.dll,user32.dll, gdi32.dll, win32k.sys, csrss.exe

Centrum wykonawcze funkcje systemowe dostepne z trybu użytkownika za pośrednictwem NTDLL (np LPC) funkcje systemowe dostepne z trybu jadra funkcje wewnętrzne Menedżer konfiguracji Menedżer procesów i watków Monitor bezpieczeństwa Menedżery I/O, P&P, energii Procedury WMI Menedżery pamięci podręcznej/virtualnej Menedżery obiektów/LPC

Jądro systemu operacyjnego Podstawowe zadania Identyfikacja i zarządzanie obiektami systemowymi Zarządzanie pamięcią Zarządzanie systemem plików Zarządzanie procesami i wątkami wykonania Synchronizacja Komunikacja

Procesy systemowe Proces jałowy (jeden watek dla każdego procesora) Proces systemowy (większośc wątków trybu jądra) Menedzer sesji (smss.exe) Podsystem win32.exe (csrss.exe) Proces logowania (winlogon.exe) m.in. obsługa CTRL+ALT+DEL, uruchamia userinit.exe->explorer.exe Lokalny serwer bezpieczeństwa (lsas.exe) weryfikuje użytkownika podczas logowania, tworzy znaczniki dostępu Menedzer kontroli usług (services.exe)

Obiekty systemowe Tworzone i zarządzane przez system Użytkownik nie odwołuje się bezpośrednio do obiektu, manipuluje nim za pośrednictwem uchwytu Brak dostępu kodu użytkownika do obiektu (bezpieczeństwo) Czasu życia obiektu kontrolowany przez system (zliczanie referencji)

Uchwyt obiektu systemowego Systemowy identyfikator wewnętrznej struktury danych reprezentującej obiekt systemowy obiekty jądra systemowego (np.: proces, wątek, zadanie, plik, nazwany potok, semafor, gniazdo) obiekty GDI (np.: czcionka, obraz, pisak, pędzel) obiekty USR (np.: okno, menu, kursor, tablica skrótów klawiszowych) Powielenie uchwytu obiektu jądra systemowego (NT/2K/XP) DuplicateHandle Unieważnienie uchwytu obiektu jądra systemowego (NT/2K/XP) CloseHandle Ka¿dy obiekt systemowy taki jak proces, w¹tek, okno, obrazek, pêdzel itp. jest reprezentowany w systemie przez pewn¹ prywatn¹ strukturê danych. Program nie ma dostêpu do tej struktury danych, ale musi mieæ jakiœ sposób identyfikowania obiektu. W tym celu wprowadzono systemowy identyfikator obiektu nazywany niekiedy uchwytem obiektu (od ang. handle). Powody takiego podejœcia: zmiany struktury danych reprezentuj¹cej obiekt nie wp³ywaj¹ na program z ka¿dym obiektem mo¿na zwi¹zaæ prawa dostêpu

Obiekty jądra Jądro h = CreateXXX(”Nazwa”,..., sd, ...) Tablica uchwytów h = CreateXXX(”Nazwa”,..., sd, ...) h = OpenXXX(”Nazwa”,..., sdo, ...) 1 2 Jądro h = 6 Tablica uchwytów

Sposoby współdzielenia obiektów jądra dziedziczenie uchwytów .Net -> wołanie DuplicateHandle .Net -> wołanie nazywanie obiektów Ka¿dy obiekt systemowy taki jak proces, w¹tek, okno, obrazek, pêdzel itp. jest reprezentowany w systemie przez pewn¹ prywatn¹ strukturê danych. Program nie ma dostêpu do tej struktury danych, ale musi mieæ jakiœ sposób identyfikowania obiektu. W tym celu wprowadzono systemowy identyfikator obiektu nazywany niekiedy uchwytem obiektu (od ang. handle). Powody takiego podejœcia: zmiany struktury danych reprezentuj¹cej obiekt nie wp³ywaj¹ na program z ka¿dym obiektem mo¿na zwi¹zaæ prawa dostêpu

Obiekt jądra Nazwa, jeśli jest, ma charakter globalny Terminal server: oddzielne przestrzenie nazw: przestrzeń globalna - serwisy, sesje Duplikowanie uchwytu: NTSTATUS DuplicateHandle ( HANDLE SourceHandle, PHANDLE DestinationHandle ); BOOL DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE hTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions); dwOptions: DUPLICATE_SAME_ACCESS, DUPLICATE_CLOSE_SOURCE Ka¿dy obiekt systemowy taki jak proces, w¹tek, okno, obrazek, pêdzel itp. jest reprezentowany w systemie przez pewn¹ prywatn¹ strukturê danych. Program nie ma dostêpu do tej struktury danych, ale musi mieæ jakiœ sposób identyfikowania obiektu. W tym celu wprowadzono systemowy identyfikator obiektu nazywany niekiedy uchwytem obiektu (od ang. handle). Powody takiego podejœcia: zmiany struktury danych reprezentuj¹cej obiekt nie wp³ywaj¹ na program z ka¿dym obiektem mo¿na zwi¹zaæ prawa dostêpu

Dostęp do obiektów jądra Windows 98x/Me ignorują deskryptory zabezpieczeń Jeśli nie wyspecyfikujemyu SD=NULL– domyślny poziom uprawnień (Właściciel+Administratorzy) Przy otwieraniu obiektu jądra sprawdzana jest przynależność użytkownika do odpowiednich grup CreateFileMapping(......., LPSECURITY_ATTRIBUTES lpSecurityAttributes, ....); CreateFile(......., LPSECURITY_ATTRIBUTES lpSecurityAttributes, ....);

Security Descriptor NT, Win2K, XP typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle; } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES; BOOL InitializeSecurityDescriptor( PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision ); Set/GetSecurityDescriptorControl() SE_DACL_AUTO_INHERIT_REQ SE_DACL_AUTO_INHERITED SE_DACL_PROTECTED SE_SACL_AUTO_INHERIT_REQ SE_SACL_AUTO_INHERITED SE_SACL_PROTECTED ... Sacl() / ... Dacl() / ...Owner() / ...Group() NT, Win2K, XP Ka¿dy obiekt systemowy taki jak proces, w¹tek, okno, obrazek, pêdzel itp. jest reprezentowany w systemie przez pewn¹ prywatn¹ strukturê danych. Program nie ma dostêpu do tej struktury danych, ale musi mieæ jakiœ sposób identyfikowania obiektu. W tym celu wprowadzono systemowy identyfikator obiektu nazywany niekiedy uchwytem obiektu (od ang. handle). Powody takiego podejœcia: zmiany struktury danych reprezentuj¹cej obiekt nie wp³ywaj¹ na program z ka¿dym obiektem mo¿na zwi¹zaæ prawa dostêpu

Wielozadaniowość Wielozadaniowość w 32-bitowym systemie (Windows NT/2000/XP/7, Windows 9x/ME) wywłaszczanie wątków priorytety dostępu do procesora przetwarzanie w tle: dodatkowe wątki procesu (peekMessage) Systemowe prymitywy: proces - program w trakcie wykonywania wątek - podstawowy wykonywalny składnik procesu zadanie (job) – grupa procesów zarządzana razem włókna

pptPlex Section Divider [Procesy] pptPlex Section Divider The slides after this divider will be grouped into a section and given the label you type above. Feel free to move this slide to any position in the deck.

Proces Obiekt jądra reprezentujący proces Przestrzeń adresowa przydzielona procesowi (oddzielna dla poszczególnych procesów – w Win 9x procesy wspołdzieliły obszar niskiej pamięci) Proces obejmuje co najmniej jeden wątek – wątek główny Monitorowanie procesow ProcessExplorer.- stan procesów w systemie TaskManager WMI

Kończenie procesu ExitProces() - z wnętrza procesu TerminateProcess() Zakończenie wszystkich wątków typu foreground - >Exit/TerminateThread() Dawniej powrót z funkcji głównej procesu Pot. problem: destruktory obiektów Unieważnienie uchwytów procesu/utworzonych/otwartych obiektów (likwidowane gdy # = 0) Obiekt procesu zostaje zasygnalizowany Kod wyjścia zgodny z argumentem Exit/TerminateProcess() –> GetExitCode(hprocess, ...)

System.Diagnostics.Proces ProcessName, BasePriority, EnableRaisingEvents, StartInfo, StartTime, ExitCode, ExitTime, HasExited, Id ..., Processes Modules, MainModule, MainWindowHandle, MainWindowTitle... MaxWorkingSet, MinWorkingSet, NonpagedSystemMemorySize, PeakVirtualMemorySize, PagedMemorySize, TotalProcessorTime, UserProcessorTime.... PriorityBoostEnabled, PrivilegedProcessorTime ... StandardInput, StandardOutput, StandardError ... Handle, Threads ...

System.Diagnostics.Process Start() WaitForExit(), Kill() GetProcesses(), GetProcessesById(), Processes Process.ProcessStartInfo FileName, Arguments, PriorityClass CreateNoWindow, ErrorDialog, UseShellExecute, WindowStyle, WorkingDirectory RedirectStandardInput, RedirectStandardError, RedirectStandardOutput WorkingDirectory, WindowStyle

System.Diagnostics.Process Start() Start(ProcessStartInfo info) Start(string fileName, string arguments) Start(string fileName, string userName, SecureString password, string domain ) ...

Process - monitorowanie TotalProcessorTime, UserProcessorTime, VirtualMemorySize, WorkingSet Process. WaitForExit Process.WaitForInputIdle Exited -> event

CreateProcess - WINAPI BOOL CreateProcess( LPCTSTR lpszApplicationName, // nazwa programu LPCTSTR lpszCommandLine*, // linia polecenia LPSECURI lpProcessAttributes,** LPSECURI lpThreadAttributes, ** BOOL bInheritHandles***, // dziedziczenie obiektów DWORD dwCreationFlags, // rodzaj i priorytet procesu LPVOID lpEnvironment, // zmienne środowiska LPTSTR lpszCurDir, // bieżący napęd i katalog LPSTARTUPINFO lpStartInfo, // stan okna podstawowego LPPROCESS_INFORMATION lpProcInfo // wynik ) ; * - niekiedy modyfikowane przez proces ** - atrybuty dostępu *** - dziedziczenie uchwytów

CreationFlags - WINAPI DEBUG_PROCESS – przechw. zdarzeń z procesu i pot. DEBUG_ONLY_THIS_PROCESS – jw. ale tylko procesu CREATE_SUSPENDED - inicjalnie suspended DETACHED_PROCESS - zablokowana konsola rodz. CREATE_NEW_CONSOLE - nowa konsola CREATE_NO_WINDOW - bez konsoli CREATE_NEW_PROCESS_GROUP - grupa (^C, ^Break) CREATE_DEFAULT_ERROR_MODE - dziedziczy Er.m. CREATE_FORCEDOS - wymusza 16 bit CREATE_SEPARATE_WOW_VDM - 16bit., nowy VDM CREATE_SHARED_WOW_VDM - 16bit, wspólny VDM domyślnie: HKEYLOCAL_MACHINE\System\CurrentControlSet\ Control\WOW\DefaultSeparateVDM\default=yes CREATE_UNICODE_ENVIRONMENT CREATE_BREAKAWAY_FROM_JOB – proces poza zadaniem (o ile konfiguracja zadania na to pozwala) priorytet: XX_PRIORITY_CLASS

Środowisko Win2K/Xp WM_SETINICHANGE HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Control\Session Manager\Environment HKEY_CURRENT_USER\Environment WM_SETINICHANGE SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) TEXT(”Environment”) ) Get/GetEnvironmentVariable() ExpandEnvironmentStrings() wpisy w rejestrze %nazwa_zmiennej% np. %USERPROFILE%\My Documents

System: Tworzenie procesu Otwarcie pliku binarnego Utworzenie obiektu centrum wykonawczego Utworzenie wątku poczatkowego Notyfikacja podsystemu Win32 Rozpoczęcie wykonywania wątku (CREATE_SUSPENDED) dokończenie inicjalizacji przestrzeni adresowej (moduły DLL)* * istotne np. przy zakładania „hooka” na proces potomny

Dziedziczenie obiektu jądra h = CreateXXX(”Nazwa”, ..., sd, ...) h = 5 Tablica uchwytów N D CreateProcess(..., true, ...) 1 IPC 2 Ka¿dy obiekt systemowy taki jak proces, w¹tek, okno, obrazek, pêdzel itp. jest reprezentowany w systemie przez pewn¹ prywatn¹ strukturê danych. Program nie ma dostêpu do tej struktury danych, ale musi mieæ jakiœ sposób identyfikowania obiektu. W tym celu wprowadzono systemowy identyfikator obiektu nazywany niekiedy uchwytem obiektu (od ang. handle). Powody takiego podejœcia: zmiany struktury danych reprezentuj¹cej obiekt nie wp³ywaj¹ na program z ka¿dym obiektem mo¿na zwi¹zaæ prawa dostêpu Jądro h = ? Tablica uchwytów D

Dziedziczenie uchwytów CreateProcess(..., true, ...) – zezwolenie na dziedziczenie SD obiektu – musi zezwalać na dziedziczenie ew. zmiana SD: Get/SetHandleInformation() Przekazywanie wartosci odziedziczonego uchwytu: Linia poleceń Zmienne środowiska IPC Wymagane wołanie api np. przez pInvoke

Zadania (Job objects) Zarządzanie grupą procesów Monitorowanie grupy: TotalUser / TotalKernelTime, Total / ActiveProcesses / TotalTerminatesProcesses, TotalPageFaults Ograniczenia wspólne dla grupy procesów – „model piaskownicy” Czas/pamięć per process/zadanie, Liczba aktywnych procesów Dopuszczalne CPU, Priorytet, względna część czasu Wylogowywanie/zamykanie systemu, dostęp do schowka Zmiana parametrów systemu / ekranu Tworzenie desktpów/ dostęp do obiektów USER spoza zadania DIE_ON_UNHANDLED_EXCEPTION -> SEM_NOGPFAULTERRORBOX Maska nakładana na SID Wymagane wołanie API

Zadania (Job objects) WINAPI tworzenie nowego zadania: CreateJobObject otwarcie zadania: OpenJobObject przypisanie procesu AssignProcessToJobObject ( -> CREATE_SUSPENDED) tej operacji nie można cofnąć likwidacja zadania CloseHandle zakończenie wszyskich stowarzyszonych procesów TerminateJobObject informacje o zadaniu Set/QueryInformationJobObject Informacje o procesach bez zadań GetProcessIoCounters

Powiadomienia WINAPI Przekroczenie limitu czasu -> zasygnalizowanie zadania (i domyślnie zabicie procesów składowych->) Monitorowanie zdarzeń -> porty dokańczania GetQueuedCompletitionInfo JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO JOB_OBJECT_MSG_END_OF_PROCESS_TIME JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT JOB_OBJECT_MSG_JOB_MEMORY_LIMIT JOB_OBJECT_MSG_NEW_PROCESS JOB_OBJECT_MSG_EXIT_PROCESS JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS JOB_OBJECT_MSG_END_OF_JOB_TIME

.NET vs API Wołanie funkcji unmanage – wymaga ich zaimportowania: [DllImport("msvcrt.dll")] using System; using System.Runtime.InteropServices; class PlatformInvokeTest { [DllImport("msvcrt.dll")] public static extern int puts(string c); internal static extern int _flushall(); public static void Main() puts("Test"); _flushall(); } MSDN -> Platform Invoke Tutorial

pptPlex Section Divider [Wątki] pptPlex Section Divider The slides after this divider will be grouped into a section and given the label you type above. Feel free to move this slide to any position in the deck.

Wątki wykonania Współdzielą przestrzeń adresową ( procesu ) Indywidualny stan rejestru zestaw zmiennych lokalnych TLS (System.Threading.ThreadLocal<T> ) Dużo mniej kosztowne niż proces Znacznie łatwiejsza komunikacja Dużo słabsza separacja niż procesów Stan wątku: IsAlive

Diagnostics.ProcesThread BasePriority, CanRaiseEvents, Container, CurrentPriority, DesignMode, Events, Id, IdealProcessor, PriorityBoostEnabled, PriorityLevel, PrivilegedProcessorTime, ProcessorAffinity, Site, StartAddress, StartTime, ThreadState, TotalProcessorTime, UserProcessorTime, WaitReason

System.Threading.Thread Thread t = new Thread ( () => Console.WriteLine ("Hello!") ); t.Start(); Name, Priority, ThreadState IsAlive, IsBackground, IsThreadPoolThread CurrentThread, CurrentPrincipal Threads Start (), Join () , Sleep (), Resume (), Suspend (), SpinWait () Abort(), ResetAbort (), Interrupt (), VolatileRead (), VolatileWrite() GetDomain (), GetData (), AllocateNamedDataSlot (), AllocateDataSlot ()

System.Threading ... classes AutoResetEvent Interlocked ManualResetEvent Monitor Mutex ReaderWriterLock RegisteredWaitHandle WaitHandle Timer ThreadPool XXXXException

Przełączanie wątków wykonania szeregowanie wykonywanie oczekiwanie wątków SuspendThread GetMessage synchronizacja Sleep SuspendThread ResumeThread wstrzymanie CREATE_SUSPENDED

Szeregowanie zadań Wykonywany jest wątek o najwyższym priorytecie Po zawieszeniu/wykorzystaniu czasu uaktualniany jest jego kontekst Wybierany jest kolejny wątek o najwyższym priory-tecie gotowy do wykonania (być może ten sam) Sporadycznie wybierane są również wątki o niskim priorytecie Długość kwantu czasu: równy kwant d. każdego procesu ok 20ms dłuższy dla proces. pierwszoplan. o priorytecie Normalny

Zawieszanie wątkow Wywołania Suspend i Resume powinny być zbilansowane API: SwitchToThread() – umożliwia wznowienie watek o niższym priorytecie np. dla zwolnienie przez niego zasobu Zawieszenie wszystkich wątków – pot. problem dynamika wątków (powstawanie/usuwanie) wątków

Kończenie wątków Interupt (wyjątek ThreadInterruptedException zostanie rzucony przy najbliższym przejściu w stan zablokowany wait, sleep, lub join) Abort rzuca wyjątek ThreadAbortException – moze byc obsluzony ale automatycznie jest wyrzucany ponownie po zakonczeniu catch Ani Interupt ani Abort nie dzialaja na watki czekajace na unamanged wait. Na wait managed watek jest wybudzany.

Nieosłużone wyjątki Powinny być obsłużone!!! nie zatrzymuja wątków z puli w watkach powodują terminowane wątku Dla .Net>=2.0 powodują terminowanie procesu Powinny być obsłużone!!! AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurDomain_MyHandler); Niezalecane wlaczenie zachowania legacy <legacyUnhandledExceptionPolicy enabled="1"/> SEH – StructuralExceptionHandling – niezarzadzalny handler - obejmuje każdy wątek

Foreground vs Background Foreground utrzymują proces przy życiu, Background: nie Przy zatrzymywaniu Background z powodu zamykania aplikacji nie jest rzucany wyjątek Przy zwolnieniu AppDomain wyjatek AppDomainUnloadedException) jest rzucany dla obu typów wątków Wątki z puli są typu Background Thread.IsBackground = true/false

Proces > App Domain >Thread Izolacja Zabezpieczenia Kontrolowane wyładowanie Można załadować assembly do oddzielnej AppDomain

Priorytet procesu zmiana/pobranie priorytetu Process.PriorityClass proces w tle: IDLE_PRIORITY_CLASS obniżony prioryt: BELOW_NORMAL_PRIORITY_CLASS proces normalny: NORMAL_PRIORITY_CLASS podwyższony priorytet: ABOVE_NORMAL_PRIORITY_CLASS wysoki priorytet: HIGH_PRIORITY_CLASS proces czasu rzeczywistego: REALTIME_PRIORITY_CLASS

Priorytet wątku zmiana/pobranie priorytetu: Thread.Priority THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL

Efektywny priorytet P r o c e s y W ą t k i jest określony przez kombinację priorytetów procesu i wątku P r o c e s y 1 16 Iddle 2 4 6 8 11 22 Lowest 3 5 7 9 12 23 Below n. 10 13 24 Normal 14 25 Above n. 15 26 Highest 31 Critical Low Below Above High Real time W ą t k i

Dynamiczny priorytet timer/mysz/klawiatura – mogą wymuszać dynamiczną zmianę priorytetu wątku (dla wątków o priorytecie bazowym 0-15) w Win NT/2K/XP użytkownik może decydować o dynamicznej zmianie prorytetu Process.PriorityBoostEnabled

pptPlex Section Divider [Włókna] pptPlex Section Divider The slides after this divider will be grouped into a section and given the label you type above. Feel free to move this slide to any position in the deck.

Włókna Przenoszenie aplikacji z UNIXa Wątek może obejmować wiele włókien Tylko jedno włókno jest wykonywane na raz Przełączenie wiąże się z zapamiętaniem kontekstu, stanu rejestrów itd Przełączanie jest zarządzane przez kod użytkownika Brak wywłaszczania na poziomie włókien (dostępne jest wywłaszczanie na poziomie wątków) Włókna są obsługiwane w trybie użytkownika (a nie jądra)

Tworzenie włókien WINAPI Pierwsze włókno: PVOID ConvertThreeadToFiber(PVOID pvParam) Następne: PVOID CreateFiber(DWORD dwStackSize, PFIBER_START_ROUTINE pfnStartAdress, PVOID pvParam) Wynik: adres kontekstu wykonania Pobranie parametru włókna: PVOID GetFiberData() Punkt wejścia do włókna: VOID WINAPI FiberFunc(PVOID pvParam) { ... }

Szeregowanie włókien Zmiana bieżącego włókna: void SwitchToFiber(PVOID pvFiberExecutionContext) Pobranie bieżącego włókna: PVOID GetCurrentFiber() Kończenie włókna: void DeleteFiber(PVOID pvFiberExecutionContext)