Threads vs Processos (Bifurcados)

9

Aplicações Linux geralmente são fork e exec (com execve ()), mas aplicativos Java e certos MPMs do Apache usam threading. Se forking, usa o fork + exec para gerar um processo, qual é a versão de alto nível para threading? Como a JVM ou o Worker MPM geram threads?

    
por Gregg Leventhal 05.05.2014 / 02:59

5 respostas

13

A ideia por trás de encadeamentos e processos é quase a mesma: você bifurca o caminho de execução. Caso contrário, os segmentos e processos diferem em coisas como memória. Ou seja os processos têm um espaço de VM diferente, enquanto os threads compartilham o que existia antes da divisão.

Subjacente ao trabalho de segmentação e bifurcação usando a chamada clone () (man 2 clone):

Unlike fork(2), clone() allows the child process to share parts of its execution context with the calling process, such as the memory space, the table of file descriptors, and the table of signal handlers. (Note that on this manual page, "calling process" normally corresponds to "parent process". But see the description of CLONE_PARENT below.)

The main use of clone() is to implement threads: multiple threads of control in a program that run concurrently in a shared memory space.

As diferenças vêm das bandeiras que são passadas para clone (). Como você pode ver na página man, fork e threading são apenas um conjunto de parâmetros pré-definidos para clone (). No entanto, também é possível fazer coisas personalizadas com ele.

    
por 05.05.2014 / 03:14
8

A maioria dos sistemas operacionais multiprocessamento (SO) não-Unix usa uma chamada "spawn ()" ou algo semelhante para gerar um novo processo de SO ou fluxo de controle. Spawn () tende a ser uma chamada muito complexa, com muitas opções e muita sobrecarga. Uma das inovações do Unix foi fornecer uma maneira muito mais baixa de criar processos - fork (). O Unix cuidou das muitas opções necessárias para spawn (), permitindo quantidades arbitrárias de processamento antes da outra metade do spawn (), com exec ().

Como o Unix e suas variantes foram usados cada vez mais, a criação de baixo processo de overhead foi considerada útil e foi usada. Na verdade, foi muito usado, que as pessoas queriam maneiras ainda mais baixas de criar processos, e assim nasceu a ideia de "threads". Originalmente, os threads eram tratados completamente pelo processo de origem (e programas como o JVM podem fazer isso com "encadeamentos verdes"); mas lidar com o agendamento multi-thread é complicado e freqüentemente feito incorretamente. Portanto, há uma maneira mais fácil e intermediária de executar encadeamentos, em que o SO manipula o planejamento, mas algumas despesas gerais são salvas (normalmente) compartilhando o espaço de endereço entre encadeamentos.

Sua pergunta é difícil de responder porque há vários conceitos diferentes, mas relacionados, que são todos "tópicos", e para detalhes, é necessário um adjetivo para descrever qual deles você está referenciando. Por outro lado, entender as diferenças provavelmente o levará à resposta específica que você deseja. Procure coisas como "processos leves", "threads do usuário" e "rfork ()" para obter mais informações.

    
por 05.05.2014 / 03:25
3

Threads e forking são na verdade dois conceitos diferentes, ambos existentes em sistemas Unix / Linux (e ambos podem ser usados em C / C ++).

A idéia de um fork () é (basicamente) uma criação de um processo separado que possui o mesmo código de execução que o processo pai e que inicia a execução na linha bifurcada. A finalidade de usar forks com funções exec é que as funções exec fechem o processo que as chamou quando elas terminarem. Então, você geralmente bifurca, obtém o PID de cada processo (o filho é sempre 0) e faz o pai esperar até que o filho termine de executar a função exec.

Os tópicos são usados para o paralelismo (lembre-se de que o pai espera no filho, geralmente, em um programa bifurcado). Um thread, como pthread em C / C ++ (faça uma pesquisa no Google), será executado em paralelo ao processo principal e pode compartilhar variáveis globais e funções globais com o programa original. Como os encadeamentos Java comportam-se de maneira semelhante, imagino que eles atuem mais como esses encadeamentos do que como um processo de bifurcação.

Basicamente, há uma diferença entre bifurcação e segmentação. Eles fazem coisas distintamente diferentes (embora pareçam semelhantes). Esses conceitos podem ser difíceis de entender, mas você pode aprendê-los através de pesquisas (extensivas) se tiver um desejo sincero de compreendê-los.

EDIT # 1

Por favor, veja estes exemplos de como garfos e linhas podem ser chamados e usados. Por favor, observe o comportamento das funções exec e seus efeitos no programa principal.

link

    
por 05.05.2014 / 03:18
1

Tanto a JVM quanto o Apache MPM dependem do kernel para encadeamentos nativos. Ou seja, eles usam o sistema operacional para agendá-los. É claro que ambos precisam de sua própria API para acompanhar as coisas.

O Stackoverflow já tem várias perguntas sobre isso:

  1. encadeamentos nativos da JVM , confira esta resposta para mais detalhes.

  2. O Apache tem dois tipos de MPMs: Prefork, com um processo por thread, e Worker, que lida com vários threads: Apache MPMs . Confira a referência a codebucket

por 05.05.2014 / 11:10
1

If forking, uses the fork + exec to spawn a process, what is the high level version for threading? How does JVM or Worker MPM spawn threads?

Isso é específico da plataforma, mas no linux e eu presumo que muitos outros sistemas compatíveis com POSIX usem a implementação local de pthreads , uma API de segmentação de diretório do usuário. Por exemplo:

#include <pthread.h>

pthread_t tid;
pthread_create(&tid, NULL, somefunc, NULL);

Inicia um novo thread chamando somefunc como seu primeiro ponto de execução.

Você também pode criar encadeamentos - distintos dos garfos, pois eles compartilham o mesmo espaço de memória heap global do processo pai, em vez de obter uma cópia duplicada dele (mas os encadeamentos de cada um são executados com uma memória independente de stack - com a chamada de sistema clone() , que é o que pthreads é construído em cima.

    
por 05.05.2014 / 16:06