La croissance simultanée de la disponibilité des big data et du nombre d’utilisateurs simultanés sur Internet exerce une pression particulière sur la nécessité d’effectuer des tâches informatiques « en parallèle », ou simultanément. Le calcul parallèle et distribué est présent dans de nombreux domaines différents de l’informatique, notamment les algorithmes, l’architecture informatique, les réseaux, les systèmes d’exploitation et le génie logiciel. Au début du 21e siècle, la conception de multiprocesseurs et d’autres stratégies visant à accélérer l’exécution d’applications complexes ont connu une croissance explosive. Le calcul parallèle et distribué s’appuie sur des concepts de systèmes fondamentaux, tels que la concurrence, l’exclusion mutuelle, la cohérence dans la manipulation de l’état/mémoire, le passage de messages et les modèles de mémoire partagée.
Créer un multiprocesseur à partir d’un certain nombre de CPU uniques nécessite des liens physiques et un mécanisme de communication entre les processeurs afin qu’ils puissent fonctionner en parallèle. Les multiprocesseurs à couplage serré partagent la mémoire et peuvent donc communiquer en stockant des informations dans une mémoire accessible par tous les processeurs. Les multiprocesseurs à couplage lâche, y compris les réseaux informatiques, communiquent en s’envoyant des messages à travers les liens physiques. Les informaticiens ont étudié diverses architectures de multiprocesseurs. Par exemple, les configurations possibles dans lesquelles des centaines, voire des milliers de processeurs peuvent être reliés entre eux sont examinées pour trouver la géométrie qui supporte le débit le plus efficace du système. Une topologie très étudiée est celle de l’hypercube, dans laquelle chaque processeur est connecté directement à un nombre fixe de voisins : deux pour le carré bidimensionnel, trois pour le cube tridimensionnel, et de même pour les hypercubes de dimensions supérieures. Les informaticiens étudient également les méthodes permettant d’effectuer des calculs sur ces machines multiprocesseurs (par exemple, les algorithmes permettant d’utiliser l’architecture de manière optimale et les techniques permettant d’éviter les conflits dans la transmission des données). Le logiciel résidant sur la machine qui rend possible l’utilisation d’une machine particulière, en particulier son système d’exploitation, fait partie intégrante de cette investigation.
La concurence fait référence à l’exécution de plus d’une procédure en même temps (éventuellement avec l’accès à des données partagées), soit vraiment simultanément (comme sur un multiprocesseur), soit dans un ordre intercalé de manière imprévisible. Les langages de programmation modernes tels que Java incluent à la fois l’encapsulation et des fonctionnalités appelées « threads » qui permettent au programmeur de définir la synchronisation qui se produit entre les procédures ou les tâches concurrentes.
Deux problèmes importants dans le contrôle de la concurrence sont connus sous le nom de deadlocks et de race conditions. Le deadlock se produit lorsqu’une ressource détenue indéfiniment par un processus est demandée par deux ou plusieurs autres processus simultanément. En conséquence, aucun des processus qui demandent la ressource ne peut continuer ; ils sont bloqués, attendant que la ressource soit libérée. Un système d’exploitation peut gérer cette situation à l’aide de diverses techniques de prévention ou de détection et de récupération. Une condition de course, en revanche, se produit lorsque deux ou plusieurs processus concurrents attribuent une valeur différente à une variable, et le résultat dépend du processus qui attribue la variable en premier (ou en dernier).
La prévention des blocages et des conditions de course est fondamentalement importante, car elle garantit l’intégrité de l’application sous-jacente. Une stratégie générale de prévention est appelée synchronisation des processus. La synchronisation exige qu’un processus attende qu’un autre termine une certaine opération avant de poursuivre. Par exemple, un processus (un écrivain) peut être en train d’écrire des données dans une certaine zone de la mémoire principale, tandis qu’un autre processus (un lecteur) peut vouloir lire des données de cette zone. Le lecteur et l’écrivain doivent être synchronisés afin que l’écrivain n’écrase pas les données existantes avant que le lecteur ne les ait traitées. De même, le lecteur ne doit pas commencer à lire avant que des données aient été écrites dans la zone.
Avec l’avènement des réseaux, le calcul distribué est devenu réalisable. Un calcul distribué est un calcul effectué par un groupe d’ordinateurs reliés entre eux et travaillant en coopération. Un tel calcul nécessite généralement un système d’exploitation distribué pour gérer les ressources distribuées. Les préoccupations importantes sont le partage de la charge de travail, qui tente de tirer parti de l’accès à plusieurs ordinateurs pour effectuer des travaux plus rapidement ; la migration des tâches, qui prend en charge le partage de la charge de travail en distribuant efficacement les travaux entre les machines ; et la réplication automatique des tâches, qui se produit sur différents sites pour une plus grande fiabilité.