440 likes | 606 Views
Programowanie Aplikacji Lokalnych w Środowisku .NET. Architektura systemu , jądro systemu , obiekty jądra , uchwyty Wielozadaniowość , procesy , zadania , wątki , szeregowanie zadań. Zarys architektury systemu. Systemowe procesy pomocnicze np . menedźer sesji , proces logowania.
E N D
ProgramowanieAplikacjiLokalnychw Środowisku .NET Architekturasystemu, jądrosystemu, obiektyjądra, uchwyty Wielozadaniowość, procesy, zadania, wątki, szeregowaniezadań
Zarysarchitekturysystemu Systemoweprocesypomocnicze np. menedźersesji, proceslogowania Procesy usługowe Aplikacje użytkownika: Win 32win16DOSPOSIX/OS/2 Podsystemy środowiskowe win32*** OS/2 POSIX biblioteki podsystemów trybuż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
Jądrosystemuoperacyjnego Podstawowezadania • Identyfikacjaizarządzanieobiektamisystemowymi • Zarządzaniepamięcią • Zarządzaniesystememplików • Zarządzanieprocesamii wątkamiwykonania • Synchronizacja • Komunikacja
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 • Systemowyidentyfikatorwewnętrznejstrukturydanychreprezentującejobiektsystemowy • obiektyjądrasystemowego (np.: proces, wątek, zadanie, plik, nazwanypotok, semafor, gniazdo) • obiekty GDI (np.: czcionka, obraz, pisak, pędzel) • obiekty USR (np.: okno, menu, kursor, tablicaskrótówklawiszowych) • Powielenieuchwytuobiektujądrasystemowego (NT/2K/XP) DuplicateHandle • Unieważnienieuchwytuobiektujądrasystemowego (NT/2K/XP) CloseHandle
Obiekty jądra h = 2 h = CreateXXX(”Nazwa”,..., sd, ...) Tablica uchwytów h = OpenXXX(”Nazwa”,..., sdo, ...) 1 2 Jądro h = 6 Tablica uchwytów
Sposobywspółdzieleniaobiektówjądra • dziedziczenieuchwytów .Net -> wołanie • DuplicateHandle.Net -> wołanie • nazywanieobiektów
Obiekt jądra • Nazwa, jeśli jest, ma charakterglobalny • Terminal server: oddzielneprzestrzenienazw: • przestrzeńglobalna - serwisy, • sesje • Duplikowanieuchwytu: • NTSTATUSDuplicateHandle( HANDLE SourceHandle, PHANDLE DestinationHandle ); • BOOLDuplicateHandle(HANDLEhSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE hTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions); • dwOptions: DUPLICATE_SAME_ACCESS, DUPLICATE_CLOSE_SOURCE
Dostęp do obiektów jądra • Windows 98x/Me ignorujądeskryptoryzabezpieczeń • Jeśliniewyspecyfikujemyu SD=NULL– domyślnypoziomuprawnień (Właściciel+Administratorzy) • Przyotwieraniuobiektujądrasprawdzana jest przynależnośćużytkownika do odpowiednichgrup • CreateFileMapping(......., LPSECURITY_ATTRIBUTES lpSecurityAttributes, ....); • CreateFile(......., LPSECURITY_ATTRIBUTES lpSecurityAttributes, ....);
Security Descriptor typedefstruct _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
Wielozadaniowość Wielozadaniowośćw 32-bitowym systemie(Windows NT/2000/XP/7, Windows 9x/ME) • wywłaszczaniewątków • priorytetydostępu do procesora • przetwarzanie w tle: • dodatkowewątkiprocesu • (peekMessage) • Systemoweprymitywy: • proces- program w trakciewykonywania • wątek - podstawowywykonywalnyskładnikprocesu • zadanie(job) – grupaprocesówzarządzanarazem • włókna
Proces • Obiektjądrareprezentującyproces • Przestrzeńadresowaprzydzielonaprocesowi (oddzielnadlaposzczególnychprocesów – w Win 9x procesywspołdzieliłyobszarniskiejpamięci) • Procesobejmuje co najmniejjedenwątek – wątekgłówny • Monitorowanieprocesow • ProcessExplorer.- stanprocesów w systemie • TaskManager • WMI
Kończenie procesu • ExitProces() - z wnętrzaprocesu • TerminateProcess() • Zakończeniewszystkichwątkówtypu foreground ->Exit/TerminateThread() • Dawniejpowrót z funkcjigłównejprocesu Pot. problem: destruktoryobiektów • Unieważnienieuchwytówprocesu/utworzonych/otwartychobiektów (likwidowanegdy # = 0) • Obiektprocesuzostajezasygnalizowany • Kodwyjściazgodny z argumentemExit/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 BOOLCreateProcess( LPCTSTRlpszApplicationName, // nazwaprogramu LPCTSTRlpszCommandLine*,// liniapolecenia LPSECURIlpProcessAttributes,** LPSECURIlpThreadAttributes, ** BOOLbInheritHandles***,// dziedziczenieobiektów DWORDdwCreationFlags, // rodzajipriorytetprocesu LPVOIDlpEnvironment, // zmienneśrodowiska LPTSTRlpszCurDir, // bieżącynapędikatalog LPSTARTUPINFOlpStartInfo, // stanoknapodstawowego LPPROCESS_INFORMATIONlpProcInfo// wynik ) ; * - niekiedymodyfikowaneprzezproces ** - atrybutydostępu *** - dziedziczenieuchwytó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 pozazadaniem(o ile konfiguracja zadania na to pozwala) priorytet: XX_PRIORITY_CLASS
Środowisko • Win2K/Xp • 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: Tworzenieprocesu • Otwarcieplikubinarnego • Utworzenieobiektucentrumwykonawczego • Utworzeniewątkupoczatkowego • Notyfikacjapodsystemu Win32 • Rozpoczęciewykonywaniawątku (CREATE_SUSPENDED) • dokończenieinicjalizacjiprzestrzeniadresowej (moduły DLL)* * istotnenp. przyzakładania „hooka” naprocespotomny
Dziedziczenieobiektujądra h = 5 Tablica uchwytów N D CreateProcess(..., true, ...) 1 IPC 2 Jądro h = ? Tablica uchwytów D h = CreateXXX(”Nazwa”, ..., sd, ...)
Dziedziczenie uchwytów CreateProcess(..., true, ...) – zezwolenienadziedziczenie • SD obiektu – musizezwalaćnadziedziczenie • ew. zmiana SD:Get/SetHandleInformation() Przekazywaniewartosciodziedziczonegouchwytu: • Liniapoleceń • Zmienneśrodowiska • IPC Wymagane wołanie api np. przez pInvoke
Zadania (Job objects) • Zarządzaniegrupąprocesów • Monitorowaniegrupy: • TotalUser / TotalKernelTime, Total / ActiveProcesses / TotalTerminatesProcesses, TotalPageFaults • Ograniczeniawspólnedlagrupyprocesów – „model piaskownicy” • Czas/pamięć per process/zadanie, Liczbaaktywnychprocesów • Dopuszczalne CPU, Priorytet, względnaczęśćczasu • Wylogowywanie/zamykaniesystemu, dostęp do schowka • Zmianaparametrówsystemu / ekranu • Tworzeniedesktpów/ dostęp do obiektów USER spozazadania • DIE_ON_UNHANDLED_EXCEPTION-> SEM_NOGPFAULTERRORBOX • MaskanakładananaSID • Wymagane wołanie API
Zadania (Job objects) WINAPI • tworzenienowegozadania:CreateJobObject • otwarciezadania:OpenJobObject • przypisanieprocesuAssignProcessToJobObject( -> CREATE_SUSPENDED) tejoperacjiniemożnacofnąć • likwidacjazadaniaCloseHandle • zakończeniewszyskichstowarzyszonychprocesówTerminateJobObject • informacje o zadaniuSet/QueryInformationJobObject • Informacje o procesachbezzadań GetProcessIoCounters
Powiadomienia WINAPI Przekroczenielimituczasu -> zasygnalizowaniezadania(idomyślniezabicieprocesówskładowych->) Monitorowaniezdarzeń -> portydokań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łaniefunkcjiunmanage – wymagaichzaimportowania: [DllImport("msvcrt.dll")] using System; using System.Runtime.InteropServices; class PlatformInvokeTest { [DllImport("msvcrt.dll")] public static extern intputs(string c); [DllImport("msvcrt.dll")] internal static extern int_flushall(); public static void Main() { puts("Test"); _flushall(); } } MSDN -> Platform Invoke Tutorial
Wątki wykonania • Współdzieląprzestrzeńadresową ( procesu ) • Indywidualny • stanrejestru • zestawzmiennychlokalnych • TLS (System.Threading.ThreadLocal<T> ) • Dużomniejkosztowneniżproces • Znaczniełatwiejszakomunikacja • Dużosłabszaseparacjaniżprocesów • Stan wątku: IsAlive
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łączaniewątkówwykonania szeregowanie oczekiwanie wykonywanie wątków SuspendThread GetMessage synchronizacja Sleep SuspendThread ResumeThread wstrzymanie CREATE_SUSPENDED
Szeregowanie zadań • Wykonywany jest wątek o najwyższympriorytecie • Po zawieszeniu/wykorzystaniuczasuuaktualniany jest jegokontekst • Wybierany jest kolejnywątek o najwyższympriory-teciegotowy do wykonania (byćmoże ten sam) • Sporadyczniewybieranesąrównieżwątki o niskimpriorytecie • Długośćkwantuczasu: • równykwant d. każdegoprocesu ok 20ms • dłuższydlaproces. pierwszoplan. o priorytecieNormalny
Zawieszaniewątkow • WywołaniaSuspendiResumepowinnybyćzbilansowane • API: SwitchToThread() – umożliwiawznowieniewatek o niższympriorytecienp. dlazwolnienieprzezniegozasobu • Zawieszeniewszystkichwątków – pot. problem dynamikawątków (powstawanie/usuwanie) wątków
Kończeniewątków • Interupt (wyjątekThreadInterruptedExceptionzostanierzuconyprzynajbliższymprzejściu w stanzablokowany wait, sleep, lub join) • Abort rzucawyjątekThreadAbortException – mozebycobsluzony ale automatycznie jest wyrzucanyponowniepozakonczeniu catch • AniInteruptani Abort niedzialajanawatkiczekajacenaunamanged wait. Na wait managed watek jest wybudzany.
Nieosłużonewyjątki niezatrzymujawątków z puli w watkachpowodująterminowanewątku Dla.Net>=2.0 powodująterminowanieprocesu Powinnybyćobsłużone!!! • AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurDomain_MyHandler); • Niezalecanewlaczeniezachowania legacy <legacyUnhandledExceptionPolicy enabled="1"/> SEH – StructuralExceptionHandling – niezarzadzalny handler - obejmujekażdywątek
Foreground vs Background Foreground utrzymująprocesprzyżyciu, Background: nie Przyzatrzymywaniu Background z powoduzamykaniaaplikacjinie jest rzucanywyjątek PrzyzwolnieniuAppDomainwyjatekAppDomainUnloadedException) jest rzucanydlaobutypówwątków Wątki z pulisątypu Background Thread.IsBackground = true/false
Proces > App Domain >Thread Izolacja Zabezpieczenia Kontrolowanewyładowanie Możnazaładować assembly do oddzielnejAppDomain
Priorytet procesu • zmiana/pobraniepriorytetuProcess.PriorityClass • proces w tle: IDLE_PRIORITY_CLASS • obniżonyprioryt: BELOW_NORMAL_PRIORITY_CLASS • procesnormalny: NORMAL_PRIORITY_CLASS • podwyższonypriorytet: ABOVE_NORMAL_PRIORITY_CLASS • wysokipriorytet: HIGH_PRIORITY_CLASS • procesczasurzeczywistego: REALTIME_PRIORITY_CLASS
Priorytet wątku • zmiana/pobraniepriorytetu: 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
Realtime High Above Normal Below Low Critical 31 15 15 15 15 15 Highest 26 15 12 10 8 6 Above n. 25 14 11 9 7 5 Normal 24 13 10 8 6 4 Below n. 23 12 9 7 5 3 Lowest 22 11 8 6 4 2 Iddle 16 1 1 1 1 1 Efektywnypriorytet P r o c e s y W ą t k i • jest określonyprzezkombinacjępriorytetówprocesuiwątku
Dynamicznypriorytet • timer/mysz/klawiatura – mogąwymuszaćdynamicznązmianępriorytetuwątku (dlawątków o prioryteciebazowym 0-15) • w Win NT/2K/XP użytkownikmożedecydować o dynamicznejzmianieprorytetuProcess.PriorityBoostEnabled
Włókna • Przenoszenieaplikacji z UNIXa • Wątekmożeobejmowaćwielewłókien • Tylkojednowłókno jest wykonywanenaraz • Przełączeniewiążesię z zapamiętaniemkontekstu, stanurejestrówitd • Przełączanie jest zarządzaneprzezkodużytkownika • Brakwywłaszczanianapoziomiewłókien (dostępne jest wywłaszczanienapoziomiewątków) • Włóknasąobsługiwane w trybieużytkownika (a niejądra)
Tworzenie włókien WINAPI Pierwszewłókno: PVOID ConvertThreeadToFiber(PVOID pvParam) Następne: PVOID CreateFiber(DWORD dwStackSize, PFIBER_START_ROUTINE pfnStartAdress, PVOID pvParam) Wynik:adreskontekstuwykonania Pobranieparametruwłókna:PVOID GetFiberData() Punktwejścia do włókna: VOID WINAPI FiberFunc(PVOIDpvParam) { ... }
Szeregowanie włókien Zmianabieżącegowłókna: voidSwitchToFiber(PVOID pvFiberExecutionContext) Pobraniebieżącegowłókna: PVOID GetCurrentFiber() Kończeniewłókna: void DeleteFiber(PVOID pvFiberExecutionContext)