Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie Aplikacji Lokalnych w Środowisku .NET

Podobne prezentacje


Prezentacja na temat: "Programowanie Aplikacji Lokalnych w Środowisku .NET"— Zapis prezentacji:

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

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

3 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

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

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

6 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

7 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

8 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

9 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)

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

11 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

12 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

13 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

14 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

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

16 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

17 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

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

19 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

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

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

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

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

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

25 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

26 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

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

28 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

29 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

30 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

31 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

32 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

33 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

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

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

36 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

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

38 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 ()

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

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

41 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

42 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

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

44 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

45 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

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

47 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

48 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

49 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

50 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

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

52 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)

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

54 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)


Pobierz ppt "Programowanie Aplikacji Lokalnych w Środowisku .NET"

Podobne prezentacje


Reklamy Google