Casa > Q > Qual É A Diferença Entre Um Processo E Um Fio?

Qual é a diferença entre um processo e um fio?

Aqui está a analogia que eu uso no desenvolvimento do Kernel Linux. Os processos são a abstracção de programas em execução: Uma imagem binária, memória virtualizada, vários recursos do kernel, um contexto de segurança associado, e assim por diante. Threads são a unidade de execução em um processo: Um processador virtualizado, uma pilha, e o estado do programa. Dito de outra forma, os processos estão rodando binários e os threads são a menor unidade de execução agendável por um sistema operacional's agendador de processos.

Um processo contém um ou mais threads. Em processos de rosca única, o processo contém uma rosca. Você pode dizer que a thread é o processo - há uma coisa que está acontecendo. Em processos multithreaded, o processo contém mais de um thread-there's mais de uma coisa está acontecendo.

As duas abstrações virtualizadas primárias nos sistemas operacionais modernos são a memória virtualizada e um processador virtualizado. Ambas permitem a ilusão de executar processos que só elas consomem os recursos da máquina's. A memória virtualizada dá aos processos uma visão única da memória que mapeia perfeitamente de volta à RAM física ou ao armazenamento em disco (espaço swap). Um processador virtualizado permite que os processos atuem como se fossem executados sozinhos em um processador, quando na verdade vários processos são multitarefa em vários processadores.

A memória virtualizada está associada ao processo e não à thread. Assim, os threads compartilham um espaço de endereço de memória. Por outro lado, um processador virtualizado distinto é associado a cada thread. Cada thread é uma entidade agendável independente.

O que's o ponto? Nós obviamente precisamos de processos. Mas por que introduzir o conceito separado de um thread e permitir processos multithreaded? Há quatro benefícios primários para multithreading:

  • Aprogramação de abstração. Dividir o trabalho e atribuir cada divisão a uma unidade de execução (um fio) é uma abordagem natural a muitos problemas. Os padrões de programação que utilizam esta abordagem incluem o reator, thread-per-connection e thread pool patterns. Alguns, entretanto, vêem as roscas como um anti-padrão. O inimitável Alan Cox resumiu isto bem com a citação, "as threads são para pessoas que podem't programar máquinas de estado">li>Paralelismo. Em máquinas com múltiplos processadores, os fios fornecem uma forma eficiente de alcançar um verdadeiro paralelismo. Como cada thread recebe seu próprio processador virtualizado e é uma entidade independentemente programável, vários threads podem ser executados em vários processadores ao mesmo tempo, melhorando o rendimento de um sistema's. Na medida em que as threads são usadas para alcançar o paralelismo - ou seja, não há mais threads do que processadores - a citação "threads são para pessoas que podem't programam máquinas de estado" não se aplica.>li>Blocking I/O. Sem threads, o bloqueio de E/S interrompe todo o processo. Isto pode ser prejudicial tanto para o rendimento como para a latência. Em um processo multithreaded, threads individuais podem bloquear, esperando em E/S, enquanto outros threads fazem progresso adiante. As E/S assíncronas e sem bloqueio são soluções alternativas às roscas para este problema.
    li>li>Memory savings. Os threads fornecem uma maneira eficiente de compartilhar memória, mas utilizam múltiplas unidades de execução. Desta forma são uma alternativa a múltiplos processos.

>br>> O custo destes benefícios de threading são uma maior complexidade na forma de necessidade de gerir a concorrência através de mecanismos como os mutexes e variáveis de condição. Dada a crescente tendência para processadores com múltiplos núcleos e sistemas com múltiplos processadores, o threading só se vai tornar uma ferramenta mais importante na programação de sistemas.

De Katinka Lawhorne

Que mal aconteceria se milhões dos Nokia 3310 fossem largados da ISS para a Terra? :: Como é que a Wikipédia ganha dinheiro?