O crescimento simultâneo da disponibilidade de grandes dados e do número de utilizadores simultâneos na Internet coloca uma pressão particular sobre a necessidade de realizar tarefas de computação “em paralelo”, ou simultaneamente. A computação paralela e distribuída ocorre em muitas áreas temáticas diferentes na ciência da computação, incluindo algoritmos, arquitectura informática, redes, sistemas operativos e engenharia de software. Durante o início do século XXI, houve um crescimento explosivo na concepção de multiprocessadores e outras estratégias para que aplicações complexas pudessem ser executadas mais rapidamente. A computação paralela e distribuída baseia-se em conceitos fundamentais de sistemas, tais como concorrência, exclusão mútua, consistência na manipulação de estado/memória, passagem de mensagens, e modelos de memória partilhada.
Criar um multiprocessador a partir de uma série de CPUs únicas requer ligações físicas e um mecanismo de comunicação entre os processadores para que estes possam operar em paralelo. Os multiprocessadores rigorosamente acoplados partilham memória e, por conseguinte, podem comunicar armazenando informação em memória acessível por todos os processadores. Os multiprocessadores frouxamente acoplados, incluindo as redes informáticas, comunicam enviando mensagens uns aos outros através das ligações físicas. Os cientistas informáticos têm investigado várias arquitecturas de multiprocessadores. Por exemplo, as configurações possíveis em que centenas ou mesmo milhares de processadores podem estar ligados entre si são examinadas para encontrar a geometria que suporta o rendimento mais eficiente do sistema. Uma topologia muito estudada é o hipercubo, em que cada processador está ligado directamente a um número fixo de vizinhos: dois para o quadrado bidimensional, três para o cubo tridimensional, e de forma semelhante para os hipercubos de dimensão superior. Os cientistas informáticos também investigam métodos para realizar cálculos em tais máquinas multiprocessadoras (por exemplo, algoritmos para optimizar a arquitectura e técnicas para evitar conflitos na transmissão de dados). O software residente na máquina que torna possível a utilização de uma determinada máquina, em particular o seu sistema operativo, é parte integrante desta investigação.
Concurrency refere-se à execução de mais de um procedimento ao mesmo tempo (talvez com o acesso a dados partilhados), seja verdadeiramente em simultâneo (como num multiprocessador) ou numa ordem imprevisivelmente intercalada. Linguagens de programação modernas como Java incluem tanto encapsulamento como características chamadas “threads” que permitem ao programador definir a sincronização que ocorre entre procedimentos ou tarefas concorrentes.
Duas questões importantes no controlo de concorrência são conhecidas como deadlocks e condições de corrida. O impasse ocorre quando um recurso mantido indefinidamente por um processo é solicitado por dois ou mais processos simultaneamente. Como resultado, nenhum dos processos que requerem o recurso pode continuar; estão bloqueados, à espera que o recurso seja libertado. Um sistema operacional pode lidar com esta situação com várias técnicas de prevenção ou detecção e recuperação. Uma condição de corrida, por outro lado, ocorre quando dois ou mais processos concorrentes atribuem um valor diferente a uma variável, e o resultado depende de qual processo atribui a variável primeiro (ou último).
Prevenir bloqueios e condições de corrida é fundamentalmente importante, uma vez que garante a integridade da aplicação subjacente. Uma estratégia geral de prevenção é chamada sincronização de processos. A sincronização requer que um processo aguarde que o outro complete alguma operação antes de prosseguir. Por exemplo, um processo (um escritor) pode estar a escrever dados para uma determinada área de memória principal, enquanto outro processo (um leitor) pode querer ler dados dessa área. O leitor e o gravador devem ser sincronizados para que o gravador não substitua os dados existentes até que o leitor os tenha processado. Da mesma forma, o leitor não deve começar a ler até que os dados tenham sido escritos na área.
Com o advento das redes, a computação distribuída tornou-se viável. A computação distribuída é aquela que é realizada por um grupo de computadores interligados que trabalham em cooperação. Tal computação requer normalmente um sistema operativo distribuído para gerir os recursos distribuídos. As preocupações importantes são a partilha da carga de trabalho, que tenta tirar partido do acesso a vários computadores para concluir trabalhos mais rapidamente; a migração de tarefas, que suporta a partilha da carga de trabalho através da distribuição eficiente de trabalhos entre máquinas; e a replicação automática de tarefas, que ocorre em locais diferentes para maior fiabilidade.