un logiciel système qui gère les ressources matérielles et logicielles d'un ordinateur et fournit des services communs aux programmes informatiques .
Les systèmes d'exploitation à temps partagé planifient les tâches pour une utilisation efficace du système et peuvent également inclure un logiciel de comptabilité pour la répartition des coûts du temps processeur , du stockage de masse , des périphériques et autres ressources.
Pour les fonctions matérielles telles que les entrées/sorties et l'allocation de mémoire , le système d'exploitation sert d'intermédiaire entre les programmes et le matériel informatique bien que le code applicatif soit généralement exécuté directement par le matériel et effectue fréquemment des appels système à une fonction du système d'exploitation ou soit interrompu par celui-ci. Les systèmes d'exploitation sont présents sur de nombreux appareils contenant un ordinateur , des téléphones portables et consoles de jeux vidéo aux serveurs web et supercalculateurs .
Microsoft Windows (33 %), iOS et iPadOS (15 %), macOS (4 %) et Linux (1 %). Android , iOS et iPadOS sont des systèmes d'exploitation pour appareils mobiles tels que les smartphones, tandis que Windows, macOS et Linux sont destinés aux ordinateurs de bureau. Les distributions Linux dominent les secteurs des serveurs et du supercalcul. D'autres catégories de systèmes d'exploitation spécialisés (systèmes d'exploitation dédiés), tels que les systèmes embarqués et temps réel, existent pour de nombreuses applications. Il existe également des systèmes d'exploitation axés sur la sécurité . Certains systèmes d'exploitation ont des exigences système faibles (par exemple, les distributions Linux légères ), tandis que d'autres peuvent avoir des exigences système plus élevées.
Certains systèmes d'exploitation nécessitent une installation ou peuvent être préinstallés sur les ordinateurs achetés ( installation OEM ), tandis que d'autres peuvent fonctionner directement à partir d'un support (par exemple, un CD live ) ou d'une mémoire flash (par exemple, une clé USB Live ).
couche logicielle qui gère les ressources d'un ordinateur pour ses utilisateurs et leurs applications » . Les systèmes d'exploitation comprennent le logiciel qui s'exécute en permanence, appelé noyau , mais peuvent également inclure d'autres logiciels . Les deux autres types de programmes pouvant s'exécuter sur un ordinateur sont les programmes système , associés au système d'exploitation mais n'appartenant pas nécessairement au noyau, et les applications, qui regroupent tous les autres logicielsUn système d’exploitation remplit trois objectifs principaux :
- Les systèmes d'exploitation répartissent les ressources entre les différentes applications, en décidant quand elles bénéficieront de temps processeur (CPU) ou d'espace mémoire . Sur les ordinateurs personnels modernes , les utilisateurs souhaitent souvent exécuter plusieurs applications simultanément. Afin d'éviter qu'un programme ne monopolise les ressources matérielles limitées de l'ordinateur, le système d'exploitation attribue à chaque application une part de ces ressources, soit en temps (CPU), soit en espace (mémoire). Le système d'exploitation doit également isoler les applications les unes des autres pour les protéger des erreurs et des failles de sécurité présentes dans le code d'une autre application, tout en permettant la communication entre elles.
- Les systèmes d'exploitation fournissent une interface qui masque les détails d'accès au matériel (comme la mémoire physique) afin de simplifier le travail des programmeurs. La virtualisation permet également au système d'exploitation de pallier la limitation des ressources matérielles ; par exemple, la mémoire virtuelle peut donner à un programme l'illusion d'une mémoire quasi illimitée, supérieure à la mémoire physique de l'ordinateur.
- Les systèmes d'exploitation fournissent des services communs, comme une interface d'accès aux périphériques réseau et disque. Cela permet à une application de s'exécuter sur différents matériels sans avoir à être réécrite. Les services inclus dans un système d'exploitation varient considérablement, et ces fonctionnalités constituent la grande majorité du code de la plupart des systèmes d'exploitation.
Types de systèmes d'exploitation
Systèmes d'exploitation multi-ordinateurs
Dans les systèmes multiprocesseurs, plusieurs unités centrales (CPU) partagent la mémoire. Un multicomputer , ou cluster de calcul, possède plusieurs CPU, chacune disposant de sa propre mémoire . Les multicomputers ont été développés car la conception de grands multiprocesseurs est complexe et leur coût prohibitif ; ils sont omniprésents dans le cloud computing en raison de la taille de machine requise. Les différentes CPU doivent souvent s'envoyer et recevoir des messages ; pour garantir de bonnes performances, les systèmes d'exploitation de ces machines doivent minimiser la copie des paquets . Les systèmes plus récents utilisent souvent plusieurs files d'attente files d'attente distinctes – afin de réduire la copie des paquets et de prendre en charge un plus grand nombre d'utilisateurs simultanés. Une autre technique est l'accès direct à la mémoire à distance (RDMA) , qui permet à chaque CPU d'accéder à la mémoire d'autres CPU. Les systèmes d'exploitation multicomputeurs prennent souvent en charge les appels de procédure à distance où un processeur peut appeler une procédure sur un autre processeur, ou la mémoire partagée distribuée , dans laquelle le système d'exploitation utilise la virtualisation pour générer une mémoire partagée qui n'existe pas physiquement.
Systèmes distribués
Un système distribué est un ensemble d'ordinateurs distincts, interconnectés en réseau , chacun pouvant posséder son propre système d'exploitation et son propre système de fichiers. Contrairement aux systèmes multiordinateurs, ils peuvent être répartis partout dans le monde. Un middleware , couche logicielle supplémentaire entre le système d'exploitation et les applications, est souvent utilisé pour améliorer la cohérence. Bien qu'il fonctionne de manière similaire à un système d'exploitation, il ne s'agit pas d'un véritable système d'exploitation.
Intégré
Les systèmes d'exploitation embarqués sont conçus pour être utilisés dans des systèmes informatiques embarqués , qu'il s'agisse d'objets connectés à l' Internet des objets ou non. De nombreux appareils électroménagers font partie de ces systèmes. Leur particularité réside dans l'absence de logiciels installés par l'utilisateur. Par conséquent, ils ne nécessitent pas de protection entre les différentes applications, ce qui permet des conceptions plus simples. Certains systèmes d'exploitation très légers peuvent tenir sur moins de 10 kilo-octets , et les plus petits sont destinés aux cartes à puce . On peut citer comme exemples Embedded Linux , QNX , VxWorks , ainsi que les systèmes ultra-compacts RIOT et TinyOS .
En temps réel
Un système d'exploitation temps réel est un système d'exploitation qui garantit le traitement des événements ou des données à un instant précis. Les systèmes temps réel critiques exigent une synchronisation exacte et sont courants dans la production industrielle , l'avionique , le secteur militaire et d'autres applications similaires. Avec les systèmes temps réel souples, un événement manqué occasionnel est acceptable ; cette catégorie inclut souvent les systèmes audio ou multimédias, ainsi que les smartphones. Pour que les systèmes temps réel critiques soient suffisamment précis, ils se limitent souvent à une simple bibliothèque sans protection entre les applications, comme eCos .
Hyperviseur
Un hyperviseur est un système d'exploitation qui exécute une machine virtuelle . La machine virtuelle est une application qui émule du matériel ; autrement dit, elle fonctionne autant que possible comme le matériel physique sur lequel le système d'exploitation a été conçu pour s'exécuter. Les machines virtuelles peuvent être mises en pause, sauvegardées et reprises, ce qui les rend utiles pour la recherche, le développement et le débogage des systèmes d'exploitation. Elles améliorent également la portabilité en permettant d'exécuter des applications sur un ordinateur même si elles ne sont pas compatibles avec le système d'exploitation de base.
Bibliothèque
Un système d'exploitation de bibliothèque (libOS) est un système dans lequel les services qu'un système d'exploitation typique fournit, tels que la mise en réseau, sont fournis sous forme de bibliothèques et composés avec un seul code d'application et de configuration pour construire un unikernel : une image machine spécialisée (seuls les morceaux de code absolument nécessaires sont extraits des bibliothèques et liés ensemble ), à espace d'adressage unique , qui peut être déployée dans des environnements cloud ou embarqués.
Le code du système d'exploitation et le code applicatif ne sont pas exécutés dans des domaines de protection séparés (une seule application est exécutée, du moins conceptuellement, il n'est donc pas nécessaire d'empêcher les interférences entre applications) et les services du système d'exploitation sont accessibles via de simples appels de bibliothèque (potentiellement intégrés en fonction des seuils du compilateur), sans la surcharge habituelle des changements de contexte , de manière similaire aux systèmes d'exploitation embarqués et temps réel. Cette surcharge n'est pas négligeable : au coût direct du changement de mode s'ajoute la pollution indirecte des structures importantes du processeur (comme les caches du CPU , le pipeline d'instructions , etc.), qui affecte les performances en mode utilisateur et en mode noyau
Histoire
Les premiers ordinateurs, à la fin des années 1940 et dans les années 1950, étaient programmés directement, soit à l'aide de tableaux de connexion , soit par saisie de code machine sur des supports tels que des cartes perforées , sans langages de programmation ni systèmes d'exploitation. Après l'introduction du transistor au milieu des années 1950, la construction des ordinateurs centraux a commencé. Ces derniers nécessitaient toujours des opérateurs spécialisés qui effectuaient manuellement des tâches habituellement dévolues à un système d'exploitation moderne, comme la planification de l'exécution des programmes. Les ordinateurs centraux disposaient néanmoins de systèmes d'exploitation rudimentaires tels que Fortran Monitor System (FMS) et IBSYS . Dans les années 1960, IBM a lancé la première série d'ordinateurs intercompatibles ( System/360 ). Tous fonctionnaient sous le même système d'exploitation, OS/360 , composé de millions de lignes de langage assembleur et comportant des milliers de bogues . OS/360 fut également le premier système d'exploitation populaire à prendre en charge la multiprogrammation , de sorte que, si une tâche était bloquée en attente de la fin d'une opération d'entrée/sortie (E/S), une autre tâche pouvait utiliser le processeur. Le maintien de plusieurs tâches en mémoire nécessitait un partitionnement de la mémoire et des protections contre l'accès d'une tâche à la mémoire allouée à une autre.
À peu près à la même époque, les téléscripteurs commencèrent à être utilisés comme terminaux , permettant à plusieurs utilisateurs d'accéder simultanément à l'ordinateur. Le système d'exploitation MULTICS était conçu pour permettre à des centaines d'utilisateurs d'accéder à un ordinateur de grande capacité. Malgré son adoption limitée, il peut être considéré comme le précurseur du cloud computing . Le système d'exploitation UNIX est né d'une évolution de MULTICS pour un utilisateur unique. Le code source d'UNIX étant disponible, il devint la base d'autres systèmes d'exploitation incompatibles, dont les plus populaires furent System V d' AT&T et la distribution logicielle Berkeley (BSD) de l' Université de Californie . Afin d'améliorer la compatibilité, l' IEEE publia la norme POSIX pour les interfaces de programmation d'applications (API) des systèmes d'exploitation, prise en charge par la plupart des systèmes UNIX. MINIX était une version allégée d'UNIX, développée en 1987 à des fins éducatives, qui inspira le logiciel libre et commercial Linux . Depuis 2008, MINIX est utilisé dans les contrôleurs de la plupart des microprocesseurs Intel , tandis que Linux est largement répandu dans les centres de données et les smartphones Android .
Micro-ordinateurs


L'invention de l'intégration à grande échelle a permis la production d' ordinateurs personnels (initialement appelés micro-ordinateurs ) à partir de 1980 environ. Pendant environ cinq ans, CP/M (Control Program for Microcomputers) a été le système d'exploitation le plus répandu pour les micro-ordinateurs. Plus tard, IBM a racheté à Microsoft un système d'exploitation disque , commercialisé par IBM sous le nom d'IBM PC DOS et par Microsoft sous la marque MS-DOS ( compatibles IBM PC . Les versions ultérieures ont gagné en sophistication, notamment en empruntant des fonctionnalités à UNIX.
Le premier ordinateur populaire à utiliser une interface utilisateur graphique (GUI) fut le Macintosh d' Apple . L'interface graphique s'avéra bien plus conviviale que l' interface en ligne de commande, exclusivement textuelle, des systèmes d'exploitation précédents. Ce succès incita Microsoft à ajouter une surcouche graphique à MS-DOS, appelée Windows . Windows fut par la suite réécrit en tant que système d'exploitation autonome, Windows NT , empruntant tellement de fonctionnalités à un autre système d'exploitation ( VAX/VMS ) qu'un important accord à l'amiable fut conclu. Au XXIe siècle, Windows reste populaire sur les ordinateurs personnels, mais sa part de marché sur les serveurs est plus faible. Les systèmes d'exploitation UNIX, en particulier Linux, sont les plus répandus sur les systèmes d'entreprise et les serveurs, mais sont également utilisés sur les appareils mobiles et de nombreux autres systèmes informatiques.
Sur les appareils mobiles, Symbian OS a d'abord dominé, avant d'être supplanté par BlackBerry OS (lancé en 2002) et iOS pour iPhone (à partir de 2007). Plus tard, le système d'exploitation open-source Android (lancé en 2008), avec un noyau Linux et une bibliothèque C ( Bionic ) partiellement basée sur du code BSD, est devenu le plus populaire.
Composants
Les composants d'un système d'exploitation sont conçus pour garantir le fonctionnement harmonieux des différents éléments d'un ordinateur. Avec l'obsolescence de facto du DOS , tous les logiciels utilisateur doivent interagir avec le système d'exploitation pour accéder au matériel.
Noyau
Exécution du programme

Le système d'exploitation assure l'interface entre une application et le matériel informatique, permettant ainsi à une application d'interagir avec le matériel uniquement en respectant les règles et procédures programmées dans le système d'exploitation. Ce dernier constitue également un ensemble de services simplifiant le développement et l'exécution des applications. L'exécution d'une application implique généralement la création d'un processus par le noyau du système d'exploitation , qui alloue l'espace mémoire et les autres ressources, définit une priorité pour le processus dans les systèmes multitâches, charge le code binaire du programme en mémoire et lance son exécution. L'application interagit ensuite avec l'utilisateur et les périphériques. Toutefois, sur certains systèmes, une application peut demander au système d'exploitation d'exécuter une autre application au sein du même processus, soit comme une sous-routine, soit dans un thread séparé, par exemple grâce aux fonctions LINK et ATTACH d' OS/360 et de ses successeurs .
Interrompt
- transférer le contrôle à une routine de service d'interruption.
- Sauvegarder l'état du processus en cours d'exécution.
- Rétablir l'état après la résolution de l'interruption.
interruption logicielle
Une interruption logicielle est un message adressé à un processus signalant la survenue d'un événement. Elle se distingue d'une interruption matérielle , qui est un message adressé à l' unité centrale de traitement (CPU) signalant la survenue d'un événement. Les interruptions logicielles et matérielles présentent des similitudes : elles entraînent une modification du processus en cours d'exécution. De même, les interruptions matérielles et logicielles exécutent une routine de service d'interruption .
Les interruptions logicielles peuvent être des événements normaux. On s'attend à ce qu'un intervalle de temps se produise, ce qui obligera le noyau à effectuer un changement de contexte . Un programme informatique peut configurer une minuterie pour qu'elle se déclenche après quelques secondes au cas où une trop grande quantité de données ralentirait l'exécution d'un algorithme.
Les interruptions logicielles peuvent être des conditions d'erreur, telles qu'une instruction machine mal formée . Cependant, les conditions d'erreur les plus courantes sont la division par zéro et l'accès à une adresse mémoire invalide .
Les utilisateurs peuvent envoyer des messages au noyau pour modifier le comportement d'un processus en cours d'exécution. Par exemple, dans l' environnement de ligne de commande , la pression du caractère d'interruption (généralement Ctrl+C ) peut mettre fin au processus en cours d'exécution.
Pour générer des interruptions logicielles pour les processeurs x86 , l' instruction INT du langage assembleur est disponible. La syntaxe est INT X, où Xest le numéro de décalage (au format hexadécimal ) dans la table des vecteurs d'interruption .
Signal
Pour générer des interruptions logicielles dans les systèmes d'exploitation de type Unix , l' kill(pid,signum)appel système envoie un signal à un autre processus. pid est l' identifiant du processus destinataire. signumest le numéro du signal (sous forme mnémonique ) à envoyer. (Le nom peu intuitif de killa été choisi car les premières implémentations se contentaient de terminer le processus.)
Dans les systèmes d'exploitation de type Unix, les signaux informent les processus de la survenue d'événements asynchrones. Pour communiquer de manière asynchrone, des interruptions sont nécessaires. L'une des raisons pour lesquelles un processus doit communiquer de manière asynchrone avec un autre processus est de résoudre une variante du problème classique du lecteur/écrivain . L'écrivain reçoit un tube du shell pour que sa sortie soit envoyée au flux d'entrée du lecteur. La syntaxe en ligne de commande est la suivante : `ls -l` alpha | bravo. Le processus alphaécrira dans le tube lorsque son calcul sera prêt, puis se mettra en attente. bravo Le processus sera ensuite déplacé vers la file d'attente des processus prêts et lira bientôt son flux d'entrée. Le noyau générera des interruptions logicielles pour coordonner l'acheminement des données.
Les signaux peuvent être classés en 7 catégories. Ces catégories sont :
- lorsqu'un processus se termine normalement.
- lorsqu'un processus rencontre une exception d'erreur.
- lorsqu'un processus épuise les ressources système.
- lorsqu'un processus exécute une instruction illégale.
- lorsqu'un processus déclenche un événement d'alarme.
- lorsqu'un processus est interrompu par le clavier.
- lorsqu'un processus présente une alerte de traçage pour le débogage.
interruption matérielle
Les périphériques d'entrée/sortie (E/S) sont plus lents que le processeur. Par conséquent, si le processeur devait attendre la fin de chaque opération d'E/S, l'ordinateur serait ralenti. Pour éviter cela, un ordinateur peut implémenter des interruptions pour la gestion de la fin des opérations d'E/S, évitant ainsi le recours à l'interrogation ou à l'attente active.
Certains ordinateurs nécessitent une interruption pour chaque caractère ou mot, ce qui consomme une quantité importante de temps processeur. L'accès direct à la mémoire (DMA) est une fonctionnalité d'architecture permettant aux périphériques de contourner le processeur et d'accéder directement à la mémoire principale . (Indépendamment de l'architecture, un périphérique peut effectuer un accès direct à la mémoire vers et depuis la mémoire principale, soit directement, soit via un bus.)
Entrée/sortie
Les conducteurs
E/S pilotées par interruption
accès direct à la mémoire
Les périphériques tels que les disques durs , les disques SSD et les lecteurs de bandes magnétiques peuvent transférer des données à un débit suffisamment élevé pour que l'interruption du processeur à chaque octet ou mot transféré, et le transfert de cet octet ou mot entre le périphérique et la mémoire par le processeur, consommeraient une quantité excessive de ressources processeur. Les données sont donc transférées entre le périphérique et la mémoire indépendamment du processeur par un matériel tel qu'un canal ou un contrôleur d'accès direct à la mémoire ; une interruption n'est déclenchée que lorsque toutes les données sont transférées.
Si un programme informatique exécute un appel système pour effectuer une opération d'écriture d'E/S par bloc , cet appel système peut exécuter les instructions suivantes :
- Insérer le contenu des registres du processeur (y compris le compteur de programme ) dans le bloc de contrôle de processus .
- Créez une entrée dans la table d'état des périphériques. Le système d'exploitation gère cette table pour suivre les processus en attente de périphériques. Un champ de cette table correspond à l' adresse mémoire du bloc de contrôle du processus.
- Placez tous les caractères à envoyer au périphérique dans une mémoire tampon .
- Définissez l'adresse mémoire du tampon mémoire sur un registre de périphérique prédéterminé.
- Définir la taille du tampon (un entier) sur un autre registre prédéterminé.
- Exécutez l' instruction machine pour commencer l'écriture.
- Effectuez un changement de contexte vers le processus suivant dans la file d'attente des processus prêts .
Pendant l'écriture, le système d'exploitation alterne normalement avec d'autres processus. Une fois l'écriture terminée, le périphérique interrompt le processus en cours en émettant une requête d'interruption . Il place également un entier sur le bus de données. En acceptant la requête d'interruption, le système d'exploitation effectue les opérations suivantes :
- Empilez le contenu du compteur de programme (un registre) suivi du registre d'état sur la pile d'appels .
- Empilez le contenu des autres registres sur la pile d'appels. (Il est également possible de placer le contenu des registres dans une table système.)
- Lisez l'entier depuis le bus de données. Cet entier correspond à un décalage vers la table des vecteurs d'interruption . Les instructions de cette table seront alors exécutées.
- Accédez au tableau d'état du périphérique.
- Extraire le bloc de contrôle du processus.
- Effectuez un changement de contexte pour revenir au processus d'écriture.
Lorsque le temps imparti au processus d'écriture est écoulé, le système d'exploitation va :
- Retirez de la pile d'appels les registres autres que le registre d'état et le compteur de programme.
- Extraire du registre d'état de la pile d'appels.
- Retirez de la pile d'appels l'adresse de l'instruction suivante et replacez-la dans le compteur de programme.
Le compteur de programme étant maintenant réinitialisé, le processus interrompu reprendra son exécution.
Gestion de la mémoire
La gestion coopérative de la mémoire, utilisée par de nombreux systèmes d'exploitation anciens, repose sur le principe que tous les programmes utilisent volontairement le gestionnaire de mémoire du noyau et ne dépassent pas la mémoire qui leur est allouée. Ce système est aujourd'hui quasiment obsolète, car les programmes contiennent souvent des bogues susceptibles d'entraîner un dépassement de la mémoire allouée. En cas de défaillance d'un programme, la mémoire utilisée par un ou plusieurs autres programmes peut être affectée, voire écrasée. Des programmes malveillants ou des virus peuvent modifier intentionnellement la mémoire d'un autre programme, ou encore perturber le fonctionnement du système d'exploitation lui-même. Avec la gestion coopérative de la mémoire, un seul programme défectueux suffit à provoquer un plantage du système.
La protection de la mémoire permet au noyau de limiter l'accès d'un processus à la mémoire de l'ordinateur. Il existe différentes méthodes de protection de la mémoire, notamment la segmentation et la pagination . Toutes ces méthodes nécessitent un certain niveau de prise en charge matérielle (comme l' unité de gestion de la mémoire 80286 ), qui n'est pas présente sur tous les ordinateurs.
En mode segmenté comme en mode de pagination, certains registres protégés indiquent au processeur les adresses mémoire auxquelles un programme en cours d'exécution peut accéder. Toute tentative d'accès à d'autres adresses déclenche une interruption, ce qui oblige le processeur à repasser en mode superviseur et à laisser le contrôle au noyau . On parle alors de violation de segmentation , ou Seg-V. Comme il est difficile d'interpréter une telle opération et qu'elle est généralement le signe d'un programme défectueux, le noyau interrompt généralement l'exécution du programme fautif et signale l'erreur.
Les versions de Windows 3.1 à ME disposaient d'une protection de la mémoire, mais les programmes pouvaient facilement la contourner. Une erreur de protection générale était alors générée, indiquant une violation de segmentation ; cependant, le système plantait souvent malgré tout.
mémoire virtuelle
L'utilisation de l'adressage de mémoire virtuelle (comme la pagination ou la segmentation) signifie que le noyau peut choisir quelle mémoire chaque programme peut utiliser à un moment donné, permettant ainsi au système d'exploitation d'utiliser les mêmes emplacements mémoire pour plusieurs tâches.
Si un programme tente d'accéder à une zone mémoire non accessible , mais qui lui a néanmoins été allouée, le noyau est interrompu erreur de page .
Lorsqu'un défaut de page est détecté par le noyau, celui-ci ajuste généralement la plage de mémoire virtuelle du programme qui l'a provoqué, lui accordant ainsi l'accès à la mémoire demandée. Le noyau dispose ainsi d'un pouvoir discrétionnaire quant à l'emplacement de stockage de la mémoire d'une application donnée, voire même quant à son allocation.
Dans les systèmes d'exploitation modernes, la mémoire moins fréquemment utilisée peut être temporairement stockée sur un disque ou un autre support afin de libérer cet espace pour d'autres programmes. Ce procédé est appelé « swap » , car une zone de mémoire peut être utilisée par plusieurs programmes et son contenu peut être échangé à la demande.
La mémoire virtuelle donne au programmeur ou à l'utilisateur l'impression qu'il y a beaucoup plus de RAM dans l'ordinateur qu'il n'y en a réellement.
Concurrence
Les threads permettent de diviser le travail d'un processus en plusieurs parties pouvant s'exécuter simultanément. Le nombre de threads n'est pas limité par le nombre de processeurs disponibles. S'il y a plus de threads que de processeurs, le noyau du système d'exploitation planifie, suspend et reprend l'exécution des threads, contrôlant ainsi le moment où chaque thread s'exécute et le temps processeur qui lui est alloué. Lors d'un changement de contexte, un thread en cours d'exécution est suspendu, son état est sauvegardé dans le bloc de contrôle des threads et la pile, et l'état du nouveau thread est chargé. Historiquement, sur de nombreux systèmes, un thread pouvait s'exécuter jusqu'à ce qu'il cède le contrôle ( multitâche coopératif ). Ce modèle pouvant permettre à un seul thread de monopoliser le processeur, la plupart des systèmes d'exploitation permettent désormais d'interrompre un thread ( multitâche préemptif ).
Chaque thread possède son propre identifiant, son compteur de programme (PC), son ensemble de registres et sa pile , mais partage le code, les données du tas et d'autres ressources avec les autres threads du même processus. Ainsi, la création d'un thread engendre moins de surcharge que celle d'un nouveau processus. Sur les systèmes monoprocesseurs, la concurrence consiste à alterner entre les processus. De nombreux ordinateurs sont équipés de plusieurs processeurs. Le parallélisme , avec plusieurs threads s'exécutant sur différents processeurs, peut accélérer un programme, en fonction de la quantité de code pouvant être exécutée simultanément.
Système de fichiers
Contrairement à la mémoire vive dynamique (DRAM), les dispositifs de stockage permanent utilisés dans les ordinateurs du XXIe siècle restent accessibles après un plantage ou une coupure de courant . Le stockage permanent ( non volatil ) est beaucoup moins cher par octet, mais les temps d'accès, de lecture et d'écriture sont considérablement plus longs. Les deux principales technologies sont le disque dur, composé de disques magnétiques , et la mémoire flash (un disque à semi-conducteurs qui stocke les données dans des circuits électriques). Cette dernière est plus chère, mais plus rapide et plus durable.
Les systèmes de fichiers sont une abstraction utilisée par le système d'exploitation pour simplifier l'accès au stockage permanent. Ils fournissent des noms de fichiers lisibles par l'utilisateur et d'autres métadonnées , améliorent les performances grâce à l'amortissement des accès, empêchent plusieurs threads d'accéder simultanément à la même zone de mémoire et incluent des sommes de contrôle pour identifier les corruptions . Les systèmes de fichiers sont composés de fichiers (ensembles de données nommés, de taille arbitraire) et de répertoires (également appelés dossiers) qui listent des noms de fichiers lisibles par l'utilisateur et d'autres répertoires. Un chemin d'accès absolu commence à la racine du système et liste les sous-répertoires séparés par la ponctuation, tandis qu'un chemin d'accès relatif définit l'emplacement d'un fichier à partir d'un répertoire.
Les appels système (parfois encapsulés par des bibliothèques) permettent aux applications de créer, supprimer, ouvrir et fermer des fichiers, ainsi que de les lier, de les lire et d'y écrire. Toutes ces opérations sont effectuées par le système d'exploitation pour le compte de l'application. Afin de réduire la latence, le système d'exploitation stocke dans un cache les blocs de mémoire récemment demandés et précharge les données que l'application n'a pas encore demandées, mais dont elle pourrait avoir besoin ultérieurement. Les pilotes de périphériques sont des logiciels spécifiques à chaque périphérique d'entrée/sortie (E/S) qui permettent au système d'exploitation de fonctionner sans modification sur différents matériels.
Un autre composant des systèmes de fichiers est un dictionnaire qui associe le nom et les métadonnées d'un fichier au bloc de données où son contenu est stocké. La plupart des systèmes de fichiers utilisent des répertoires pour convertir les noms de fichiers en numéros de fichiers. Pour trouver le numéro de bloc, le système d'exploitation utilise un index (souvent implémenté sous forme d'arbre ). Par ailleurs, une carte des espaces libres, généralement implémentée sous forme de bitmap , permet de suivre les blocs libres . Bien que tout bloc libre puisse être utilisé pour stocker un nouveau fichier, de nombreux systèmes d'exploitation tentent de regrouper les fichiers dans le même répertoire afin d'optimiser les performances, ou de réorganiser périodiquement les fichiers pour réduire la fragmentation .
Maintenir la fiabilité des données en cas de panne informatique ou matérielle est une autre préoccupation majeure. Les protocoles d'écriture de fichiers sont conçus avec des opérations atomiques afin de ne pas laisser le stockage permanent dans un état partiellement écrit et incohérent en cas de panne survenant à n'importe quel moment de l'écriture. La corruption des données est prise en charge par un stockage redondant (par exemple, RAID – Redundant Array of Costcoad Disks ) et par des sommes de contrôle permettant de détecter les données corrompues. Grâce à plusieurs niveaux de sommes de contrôle et de sauvegardes d'un fichier, un système peut se remettre de plusieurs pannes matérielles. Des processus en arrière-plan sont souvent utilisés pour détecter et corriger la corruption des données.
Réseautage
Sécurité
Certaines architectures de systèmes d'exploitation sont plus sûres que d'autres. Celles qui ne présentent aucune isolation entre le noyau et les applications sont les moins sûres, tandis que celles dotées d'un noyau monolithique, comme la plupart des systèmes d'exploitation généralistes, restent vulnérables si une partie quelconque du noyau est compromise. Une architecture plus sûre repose sur les micro-noyaux qui répartissent les privilèges du noyau en de nombreux domaines de sécurité distincts et réduisent les conséquences d'une faille de sécurité au niveau du noyau. Les unikernels constituent une autre approche qui améliore la sécurité en minimisant la taille du noyau et en séparant les autres fonctionnalités du système d'exploitation par application.
La plupart des systèmes d'exploitation sont écrits en C ou C++ , ce qui crée des vulnérabilités potentielles exploitables. Malgré les efforts déployés pour s'en protéger, des vulnérabilités subsistent, notamment des attaques par dépassement de tampon , facilitées par l'absence de vérification des limites . Des vulnérabilités matérielles, dont certaines sont dues à des optimisations du processeur , peuvent également être utilisées pour compromettre le système d'exploitation. On connaît des cas où des programmeurs de systèmes d'exploitation ont délibérément implanté des vulnérabilités, telles que des portes dérobées .
La sécurité des systèmes d'exploitation est compromise par leur complexité croissante et l'inévitabilité des bogues qui en découle. La vérification formelle des systèmes d'exploitation étant souvent impossible, les développeurs ont recours au renforcement de leur sécurité pour réduire les vulnérabilités, notamment par la randomisation de l'espace d'adressage , l'intégrité du flux de contrôle , les restrictions d'accès , et d'autres techniques. Aucune restriction ne s'applique aux contributeurs aux systèmes d'exploitation open source ; ces systèmes présentent un historique des modifications transparent et une structure de gouvernance distribuée. Les développeurs open source s'efforcent de collaborer pour identifier et corriger les failles de sécurité, en utilisant la revue de code et la vérification des types pour éliminer le code malveillant. Andrew S. Tanenbaum recommande la publication du code source de tous les systèmes d'exploitation, arguant que cela empêche les développeurs de se fier au secret et, par conséquent, de recourir à la pratique peu fiable de la sécurité par l'obscurité .
interface utilisateur
- interface en ligne de commande , où les commandes de l'ordinateur sont saisies ligne par ligne,
- interface utilisateur graphique (GUI) utilisant un environnement visuel, le plus souvent une combinaison des éléments fenêtre, icône, menu et pointeur, également connue sous le nom de WIMP .
Pour les ordinateurs personnels, y compris les smartphones et les tablettes , ainsi que pour les stations de travail , la saisie utilisateur s'effectue généralement à l'aide d'une combinaison de clavier , de souris et de pavé tactile ou d'écran tactile , tous connectés au système d'exploitation par un logiciel spécialisé. Les utilisateurs d'ordinateurs personnels qui ne sont ni développeurs ni programmeurs privilégient souvent les interfaces graphiques (GUI) pour la saisie et l'affichage ; la plupart des ordinateurs personnels prennent en charge les interfaces graphiques. Le logiciel nécessaire à la prise en charge des interfaces graphiques est plus complexe qu'une ligne de commande pour la saisie et l'affichage en texte brut. L'affichage en texte brut est souvent privilégié par les programmeurs et est facile à maintenir.
Le développement de systèmes d'exploitation comme passe-temps
Syllable et TempleOS sont des exemples de systèmes d'exploitation amateurs .
Diversité des systèmes d'exploitation et portabilité
Si une application est écrite pour être utilisée sur un système d'exploitation spécifique et qu'elle est portée sur un autre système d'exploitation, les fonctionnalités requises par cette application peuvent être implémentées différemment par ce système d'exploitation (noms des fonctions, signification des arguments, etc.), ce qui nécessite que l'application soit adaptée, modifiée ou maintenue d'une autre manière .
Ce coût lié à la prise en charge de la diversité des systèmes d'exploitation peut être évité en développant des applications pour des plateformes logicielles telles que Java ou Qt . Ces abstractions ont déjà supporté le coût de l'adaptation aux systèmes d'exploitation spécifiques et à leurs bibliothèques système .
Une autre solution consiste pour les fournisseurs de systèmes d'exploitation à adopter des normes. Par exemple, POSIX et les couches d'abstraction du système d'exploitation offrent des points communs qui réduisent les coûts de portage.
Systèmes d'exploitation populaires
Linux
Linux est un logiciel libre distribué sous la licence publique générale GNU (GPL), ce qui signifie que tous ses dérivés sont légalement tenus de publier leur code source . Linux a été conçu par des programmeurs pour leur propre usage, mettant ainsi l'accent sur la simplicité et la cohérence, avec un petit nombre d'éléments de base pouvant être combinés de manière quasi illimitée, et évitant la redondance.
Sa conception est similaire à celle des autres systèmes UNIX n'utilisant pas de micro-noyau . Il est écrit en C et utilise la syntaxe UNIX System V , tout en prenant en charge la syntaxe BSD . Linux prend en charge les fonctionnalités réseau UNIX standard, ainsi que l'ensemble des outils UNIX, tout en gérant plusieurs utilisateurs et en employant le multitâche préemptif . Initialement de conception minimaliste, Linux est un système flexible pouvant fonctionner avec moins de 16 Mo de RAM , mais il est néanmoins utilisé sur de grands systèmes multiprocesseurs . À l'instar des autres systèmes UNIX, les distributions Linux sont composées d'un noyau , de bibliothèques système et d'utilitaires système . Linux possède une interface utilisateur graphique (GUI) avec un bureau, des icônes de dossiers et de fichiers, ainsi que la possibilité d'accéder au système d'exploitation via la ligne de commande .
Android est un système d'exploitation partiellement open source, étroitement basé sur Linux, et est devenu le système d'exploitation le plus utilisé par les utilisateurs, grâce à sa popularité sur les smartphones et, dans une moindre mesure, sur les systèmes embarqués nécessitant une interface graphique, tels que les montres connectées , les tableaux de bord automobiles , les dossiers de sièges d'avion, les dispositifs médicaux et les appareils électroménagers . Contrairement à Linux, une grande partie d'Android est écrite en Java et utilise une conception orientée objet .
Microsoft Windows
Windows est un système d'exploitation propriétaire largement utilisé sur les ordinateurs de bureau, les ordinateurs portables, les tablettes, les téléphones, les stations de travail , les serveurs d'entreprise et les consoles Xbox . Ce système d'exploitation a été conçu pour « la sécurité, la fiabilité, la compatibilité, les hautes performances, l'extensibilité, la portabilité et le support international » ; par la suite, L'Exécutif Windows fonctionne via des objets en mode noyau pour les structures de données importantes telles que les processus, les threads et les sections (objets mémoire, par exemple les fichiers). Le système d'exploitation prend en charge la pagination à la demande de la mémoire virtuelle , ce qui accélère les E/S pour de nombreuses applications. Les pilotes de périphériques d'E/S utilisent le modèle de pilote Windows . Le système de fichiers NTFS possède une table maître et chaque fichier est représenté par un enregistrement contenant des métadonnées . La planification inclut le multitâche préemptif . Windows dispose de nombreuses fonctionnalités de sécurité ; parmi lesquelles l'utilisation des listes de contrôle d'accès et des niveaux d'intégrité est particulièrement importante . Chaque processus possède un jeton d'authentification et chaque objet se voit attribuer un descripteur de sécurité. Les versions ultérieures ont ajouté des fonctionnalités de sécurité supplémentaires.