1 / 44

Programowanie Aplikacji Lokalnych w Środowisku .NET

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.

yanni
Download Presentation

Programowanie Aplikacji Lokalnych w Środowisku .NET

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ProgramowanieAplikacjiLokalnychw Środowisku .NET Architekturasystemu, jądrosystemu, obiektyjądra, uchwyty Wielozadaniowość, procesy, zadania, wątki, szeregowaniezadań

  2. 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

  3. Jądrosystemuoperacyjnego Podstawowezadania • Identyfikacjaizarządzanieobiektamisystemowymi • Zarządzaniepamięcią • Zarządzaniesystememplików • Zarządzanieprocesamii wątkamiwykonania • Synchronizacja • Komunikacja

  4. 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)

  5. 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

  6. 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

  7. Sposobywspółdzieleniaobiektówjądra • dziedziczenieuchwytów .Net -> wołanie • DuplicateHandle.Net -> wołanie • nazywanieobiektów

  8. 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

  9. 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, ....);

  10. 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

  11. 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

  12. 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

  13. 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, ...)

  14. 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 ...

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

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

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

  18. 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

  19. 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

  20. Ś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

  21. System: Tworzenieprocesu • Otwarcieplikubinarnego • Utworzenieobiektucentrumwykonawczego • Utworzeniewątkupoczatkowego • Notyfikacjapodsystemu Win32 • Rozpoczęciewykonywaniawątku (CREATE_SUSPENDED) • dokończenieinicjalizacjiprzestrzeniadresowej (moduły DLL)* * istotnenp. przyzakładania „hooka” naprocespotomny

  22. 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, ...)

  23. 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

  24. 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

  25. 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

  26. 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

  27. .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

  28. 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

  29. 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()

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

  31. Przełączaniewątkówwykonania szeregowanie oczekiwanie wykonywanie wątków SuspendThread GetMessage synchronizacja Sleep SuspendThread ResumeThread wstrzymanie CREATE_SUSPENDED

  32. 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

  33. 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

  34. 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.

  35. 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

  36. 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

  37. Proces > App Domain >Thread Izolacja Zabezpieczenia Kontrolowanewyładowanie Możnazaładować assembly do oddzielnejAppDomain

  38. 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

  39. 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

  40. 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

  41. 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

  42. 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)

  43. 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) { ... }

  44. Szeregowanie włókien Zmianabieżącegowłókna: voidSwitchToFiber(PVOID pvFiberExecutionContext) Pobraniebieżącegowłókna: PVOID GetCurrentFiber() Kończeniewłókna: void DeleteFiber(PVOID pvFiberExecutionContext)

More Related