Windows NT/2000/XP Enjeux et contraintes techniques Deuxième partie Le noyau NT C. Casteyde Document diffusé sous licence GNU FDL
Plan ● Présentation du noyau ● Gestion de la mémoire ● Multitâche ● Entrées / Sorties ● Programmation réseau
Un noyau puissant ● Le noyau couvre les besoins : – de gestion de la mémoire virtuelle, – de gestion des processus et des threads, – de gestion des synchronisations, – d'entrées / sorties, – de sécurité.
Caractéristiques de l'API ● L'API est cohérente grâce aux handles ● Elle est riche et fonctionnelle ● Il y a inflation de paramètres
Notion de handles ● L'API est orientée « handles » et non fichier ● Un handle est un identifiant d'objet système ● La création des objets est spécifique ● Leur manipulation est uniformisée ● L'API est cohérente vis à vis de tous les objets
Paradigmes de programmation ● La programmation peut être : – simple et séquentielle, – asynchrone et événementielle. ● Pas de notion de signal : – utilisation intensive des threads, – simulation par callbacks sur des threads dédiés. ● Pas de parenté entre les programmes : – pas de fork(), – mécanismes de duplication des handles.
Programmation événementielle WaitForMultipleObjects Thread I/O Event Fichier ProcessusSocket SetEventAIODataFin
API Complexe : CreateProcess BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
API Complexe : CreateProcess typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO; typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION;
Plan ● Présentation du noyau ● Gestion de la mémoire ● Multitâche ● Entrées / Sorties ● Programmation réseau
Gestion de la mémoire ● Plusieurs niveaux de gestion de la mémoire ● Gestionnaire de mémoire virtuelle – VirtualAlloc, VirtualFree, VirtualProtect. ● Gestionnaire de tas – HeapCreate, HeapAlloc, HeapFree, HeapDestroy. ● Allocateurs C/C++ – malloc, free, – new, delete.
Gestion de la mémoire virtuelle ● Les fonctions Virtual*** permettent : – d'allouer des pages mémoire, – de fixer leurs attributs (protection et temps réel), – de gérer l'espace d'adressage. ● CreateFileMapping et MapViewOfFile servent : – à projeter un fichier dans l'espace d'adressage, – à réaliser des segments de mémoire partagés.
Les tas ● Les fonctions Heap*** permettent : – de créer des tas indépendants, – de contenir en partie les memory leaks, – d'éviter la fragmentation de l'espace d'adressage. ● Les fonctions de bibliothèques sont : – simples et classiques, – pour l'usage courant.
Plan ● Présentation du noyau ● Gestion de la mémoire ● Multitâche ● Entrées / Sorties ● Programmation réseau
Multithreading ● Windows utilise intensivement les threads ● La gestion des threads est intégrée ● L'absence de signaux et les handles facilitent leur usage ● Utiles pour les traitements longs asynchrones ● Permettent une montée en charge
Création des threads ● L'API de base est CreateThread ● Chaque bibliothèque fournit sa version – il faut les utiliser (initialisation des ressources), – ce n'est pas toujours faisable. ● Convention d'appel variées – Windows (WINAPI) pour CreateThread, – cdecl pour _beginthreadex.
Synchronisation ● Le Kernel fournit toutes les primitives classiques de synchronisation ● Certaines sont partageables entre processus : – mutex (CreateMutex), – sémaphores (CreateSemaphore). ● D'autres sont plus rapides mais locales : – sections critiques (InitializeCriticalSection), – compteurs atomiques (InterlockedIncrement).
Attentes d'événements ● Tout handle a un « alertable state » ● WaitForSingleObject permet d'attendre le signalement d'un événement ● (Msg)WaitForMultipleObects disponible ● Possibilité de définir ses propres événements : – CreateEvent, – partagés entre processus.
Gestion des interblocages ● À traiter au niveau de la conception ● Ne pas faire de requête externe avec une section critique prise ● Fixer l'ordre canonique de prise des ressources ● Isoler les sections critiques au maximum ● Assurer les réentrances
Plan ● Présentation du noyau ● Gestion de la mémoire ● Multitâche ● Entrées / Sorties ● Programmation réseau
Tour d'horizon des E/S ● Les entrées / sorties sont faisables : – sur les handles de fichiers (CreateFile), – sur les handles de pipes (CreateNamedPipe), – sur les sockets (socket, accept). ● Multiplexage par WaitForMultipleObjects ● E/S asynchrones et Scatter / Gather ● Fonctionnalités avancées pour serveurs
E/S fichier synchrones ● Les APIs de base sont CreateFile, ReadFile, et WriteFile ● De nombreux paramètres utilisables ● Possibilité de mapper les fichiers en mémoire – CreateFileMapping, MapViewOfFile. ● Le langage fournit ses propres mécanismes – fopen, fwrite, fclose, – à privilégier pour l'usage courant.
E/S asynchrones ● Utilisation d'un flag à la création – FILE_FLAG_OVERLAPPED dans CreateFile. ● Utilisation d'une structure OVERLAPPED – requis par ReadFile et WriteFile, – contient un événement pour attendre la fin, – résultat lisible avec GetOverlappedResult. ● Annulable avec CancelIO
E/S asynchrones ● Deuxième solution : ReadFileEx, WriteFileEx ● Ignorent l'événement de OVERLAPPED ● Appellent une callback à la fin de l'opération ● Le thread doit attendre sur les primitives spéciales – il est appelé lorsqu'il dort dans l'état « alertable », – APIs WaitFor*Ex et SleepEx.
E/S éclatées ● Les mécanismes Scatter/Gather évitent des copies de données ● Les APIs de base sont Read/WriteFileScatter ● Utilisent un tableau de structures FILE_SEGMENT_ELEMENT ● Utilisables en synchrone ou en asynchrone
Completion ports ● Technologie avancée pour les fortes charges ● Utilise un pool de threads utilisateurs d'E/S ● Réveille automatiquement les threads en fin d'opération ● Effectue un démultiplexage direct des E/S ● Extrêmement performant
Completion ports ● Un ou plusieurs threads se mettent en attente sur un port d'E/S – CreateIoCompletionPort, – GetQueuedCompletionStatus. ● Le système en reveille un à la fin de chaque opération d'E/S ● Le thread a immédiatement le contexte de l'opération
Principe des Completion ports Completion port Kernel Handle1 aio
Plan ● Présentation du noyau ● Gestion de la mémoire ● Multitâche ● Entrées / Sorties ● Programmation réseau
API de base ● L'API fondamentale est BSD-like – socket, bind, connect, accept, select, read, write, close. ● Il est possible d'utiliser les primitives d'E/S ReadFile et WriteFile ● Extension WinSock – extension des protocoles, – utilisation de messages Windows, – fonctions complémentaires.
E/S asynchrones ● WSAEventSelect associe un événement à une socket ● WSAAsyncSelect associe une fenêtre – conception étrange (fenêtre inutile), – utile pour les applications graphiques.
Conclusion ● Toutes les fonctions utiles sont présentes ● API riche, puissante et de haut niveau ● Conception claire et cohérente ● Complexe mais relativement facile d'utilisation ● Robuste et fiable ● Les performances laissent à désirer ● Au final, c'est une réussite