Processo (computação)

Programação, Preemption, Comutação de Contexto
Na computação, um processo é a instância de um programa de computador que está sendo executado por um ou mais threads. Existem muitos modelos de processos diferentes, alguns dos quais são leves, mas quase todos os processos (até mesmo máquinas virtuais inteiras) estão enraizados em um processo de sistema operacional (SO) que compreende o código do programa, recursos de sistema atribuídos, permissões de acesso físico e lógico, e estruturas de dados para iniciar, controlar e coordenar atividades de execução. Dependendo do sistema operacional, um processo pode ser composto de vários threads de execução que executam instruções simultaneamente.
Enquanto um programa de computador é uma coleção passiva de instruções normalmente armazenadas em um arquivo no disco, um processo é a execução dessas instruções após serem carregadas do disco para a memória. Vários processos podem estar associados ao mesmo programa; por exemplo, abrir várias instâncias do mesmo programa geralmente resulta na execução de mais de um processo.
Multitarefa é um método que permite que vários processos compartilhem processadores (CPUs) e outros recursos do sistema. Cada CPU (núcleo) executa um único processo por vez. No entanto, a multitarefa permite que cada processador alterne entre as tarefas que estão sendo executadas sem ter que esperar o término de cada tarefa (preempção). Dependendo da implementação do sistema operacional, as alternâncias podem ser executadas quando as tarefas iniciam e aguardam a conclusão das operações de entrada/saída, quando uma tarefa cede voluntariamente a CPU, em interrupções de hardware e quando o escalonador do sistema operacional decide que um processo expirou seu tempo justo. parcela do tempo de CPU (por exemplo, pelo Completely Fair Scheduler do kernel Linux).
Uma forma comum de multitarefa é fornecida pelo compartilhamento de tempo da CPU, que é um método para intercalar a execução das tarefas dos usuários. processos e threads, e até mesmo de tarefas de kernel independentes – embora o último recurso seja viável apenas em kernels preemptivos como o Linux. A preempção tem um efeito colateral importante para processos interativos que recebem maior prioridade em relação aos processos vinculados à CPU, portanto, os usuários recebem recursos de computação imediatamente com o simples pressionar de uma tecla ou ao mover o mouse. Além disso, aplicações como reprodução de vídeo e música recebem algum tipo de prioridade em tempo real, anulando qualquer outro processo de prioridade mais baixa. Em sistemas de tempo compartilhado, as trocas de contexto são executadas rapidamente, o que faz parecer que vários processos estão sendo executados simultaneamente no mesmo processador. Essa execução aparentemente simultânea de vários processos é chamada de simultaneidade.
Para segurança e confiabilidade, a maioria dos sistemas operacionais modernos impedem a comunicação direta entre processos independentes, proporcionando comunicação entre processos estritamente mediada e controlada.
Representação


Em geral, um processo de sistema de computador consiste (ou diz-se que possui) dos seguintes recursos:
- Um imagem do código de máquina executável associado a um programa.
- Memória (tipicamente alguma região de memória virtual); que inclui o código executável, dados específicos do processo (input and output), uma pilha de chamada (para manter o controle de subrotinas ativas e/ou outros eventos), e um heap para manter dados de computação intermediários gerados durante o tempo de execução.
- Descritores do sistema operacional de recursos alocados ao processo, como descritores de arquivos (terminologia Unix) ou manipuladores (Windows), e fontes de dados e pias.
- Atributos de segurança, como o proprietário do processo e o conjunto de permissões do processo (operações permitidas).
- Estado do processador (contexto), como o conteúdo de registros e endereçamento de memória física. O Estado normalmente é armazenado em registros de computador quando o processo está executando, e em memória de outra forma.
O sistema operacional contém a maior parte dessas informações sobre processos ativos em estruturas de dados chamadas blocos de controle de processo. Qualquer subconjunto de recursos, normalmente pelo menos o estado do processador, pode ser associado a cada um dos processos. threads em sistemas operacionais que suportam threads ou processos filhos.
O sistema operacional mantém seus processos separados e aloca os recursos necessários, de modo que é menos provável que interfiram uns com os outros e causem falhas no sistema (por exemplo, deadlock ou thrashing). O sistema operacional também pode fornecer mecanismos para comunicação entre processos para permitir que os processos interajam de maneira segura e previsível.
Multitarefa e gestão de processos
Um sistema operacional multitarefa pode apenas alternar entre processos para dar a aparência de muitos processos executando simultaneamente (isto é, em paralelo), embora de fato apenas um processo pode ser executado a qualquer momento em uma única CPU (a menos que a CPU tenha múltiplos núcleos, então multithreading ou outras tecnologias semelhantes podem ser usadas).
É comum associar um único processo a um programa principal e processos filhos a quaisquer processos paralelos derivados, que se comportam como sub-rotinas assíncronas. Diz-se que um processo possui recursos, dos quais uma imagem de seu programa (na memória) é um desses recursos. No entanto, em sistemas de multiprocessamento, muitos processos podem ser executados ou compartilhar o mesmo programa reentrante no mesmo local da memória, mas diz-se que cada processo possui sua própria imagem. do programa.
Os processos são frequentemente chamados de "tarefas" em sistemas operacionais embarcados. A sensação de "processo" (ou tarefa) é “algo que ocupa tempo”, em oposição à “memória”, que é “algo que ocupa espaço”.
A descrição acima se aplica a processos gerenciados por um sistema operacional e a processos definidos por cálculos de processo.
Se um processo solicitar algo pelo qual deve esperar, ele será bloqueado. Quando o processo está no estado bloqueado, ele é elegível para troca para disco, mas isso é transparente em um sistema de memória virtual, onde regiões da memória de um processo podem estar realmente no disco e não na memória principal a qualquer momento. Mesmo partes de processos/tarefas ativos (programas em execução) são elegíveis para troca para disco, se as partes não tiverem sido usadas recentemente. Nem todas as partes de um programa em execução e seus dados precisam estar na memória física para que o processo associado esteja ativo.
Estados do processo

Um kernel de sistema operacional que permite multitarefa precisa que os processos tenham determinados estados. Os nomes desses estados não são padronizados, mas têm funcionalidades semelhantes.
- Primeiro, o processo é "criado" sendo carregado de um dispositivo de armazenamento secundário (unidade de disco rígido, CD-ROM, etc) na memória principal. Depois disso, o programador de processo atribui-lhe o estado "esperando".
- Enquanto o processo está "esperando", espera que o agendador faça um chamado switch de contexto. O interruptor de contexto carrega o processo no processador e muda o estado para "executar" enquanto o processo anteriormente "executar" é armazenado em um estado "esperar".
- Se um processo no estado "running" precisa esperar por um recurso (esperar para entrada do usuário ou arquivo abrir, por exemplo), ele é atribuído o estado "bloqueado". O estado do processo é alterado de volta para "esperar" quando o processo não precisa mais esperar (em um estado bloqueado).
- Uma vez que o processo termina a execução, ou é terminado pelo sistema operacional, não é mais necessário. O processo é removido instantaneamente ou é movido para o estado "terminado". Quando removido, apenas espera ser removido da memória principal.
Comunicação entre processos
Quando os processos precisam se comunicar entre si, eles devem compartilhar partes de seus espaços de endereço ou usar outras formas de comunicação entre processos (IPC). Por exemplo, em um pipeline shell, a saída do primeiro processo precisa passar para o segundo e assim por diante; outro exemplo é uma tarefa que pode ser decomposta em processos cooperantes, mas parcialmente independentes, que podem ser executados ao mesmo tempo (ou seja, usando simultaneidade ou paralelismo verdadeiro – o último modelo é um caso particular de execução simultânea e é viável sempre que núcleos de CPU suficientes estiverem disponíveis para todos os processos que estão prontos para serem executados).
É até possível que dois ou mais processos sejam executados em máquinas diferentes que possam executar sistemas operacionais (SO) diferentes; portanto, alguns mecanismos de comunicação e sincronização (chamados protocolos de comunicação para computação distribuída) são necessários (por exemplo, a Mensagem Interface de passagem, muitas vezes chamada simplesmente de MPI).
Histórico
No início da década de 1960, o software de controle de computador evoluiu de um software de controle de monitor, por exemplo o IBSYS, para um software de controle executivo. Com o tempo, os computadores ficaram mais rápidos, enquanto o tempo de uso do computador ainda não era barato nem totalmente utilizado; tal ambiente tornou a multiprogramação possível e necessária. Multiprogramação significa que vários programas são executados simultaneamente. No início, mais de um programa rodava em um único processador, como resultado da arquitetura de computador uniprocessador subjacente, e compartilhavam recursos de hardware escassos e limitados; conseqüentemente, a simultaneidade era de natureza serial. Em sistemas posteriores com múltiplos processadores, vários programas podem ser executados simultaneamente em paralelo.
Os programas consistem em sequências de instruções para processadores. Um único processador pode executar apenas uma instrução por vez: é impossível executar mais programas ao mesmo tempo. Um programa pode precisar de algum recurso, como um dispositivo de entrada, que possui um grande atraso, ou um programa pode iniciar alguma operação lenta, como enviar a saída para uma impressora. Isso faria com que o processador ficasse 'ocioso'. (não utilizado). Para manter o processador sempre ocupado, a execução de tal programa é interrompida e o sistema operacional troca o processador para executar outro programa. Para o usuário, parecerá que os programas são executados ao mesmo tempo (daí o termo "paralelo").
Pouco tempo depois, a noção de um "programa" foi ampliado para a noção de um "programa em execução e seu contexto". Nasceu o conceito de processo, que também se tornou necessário com a invenção do código reentrante. Os tópicos vieram um pouco mais tarde. No entanto, com o advento de conceitos como compartilhamento de tempo, redes de computadores e computadores com memória compartilhada com múltiplas CPUs, a velha "multiprogramação" deu lugar à verdadeira multitarefa, multiprocessamento e, mais tarde, multithreading.
Contenido relacionado
Míssil de cruzeiro
Common Lisp
Cabala espinha dorsal