Os aplicativos Linux geralmente bifurcam em seguida o exec (com execve ()), mas os aplicativos Java e certos MPMs do Apache usam threading. Se for bifurcação, usa o fork + exec para gerar um processo, qual é a versão de alto nível para a segmentação? Como a JVM ou o Worker MPM geram threads?
9
Respostas:
A idéia por trás de threads e processos é a mesma: você bifurca o caminho da execução. Caso contrário, os threads e processos diferem em coisas como memória. Ou seja, os processos têm espaço de VM diferente, enquanto os threads compartilham o que existia antes da divisão.
Subjacente ao trabalho de rosqueamento e forquilha usando a chamada clone () (man 2 clone):
As diferenças vêm dos sinalizadores que são passados para o clone (). Como você pode ver na página de manual, fork e threading são apenas um conjunto de parâmetros predefinidos para clonar (). No entanto, também é possível fazer coisas personalizadas com ele.
fonte
A maioria dos sistemas operacionais (SOs) de multiprocessamento não Unix usa uma chamada "spawn ()" ou algo semelhante para gerar um novo processo ou fluxo de controle do SO. 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 aérea muito mais baixa de criar processos - fork (). O Unix cuidou das muitas opções necessárias para gerar () permitindo quantidades arbitrárias de processamento antes da outra metade de spawn (), com exec ().
Como o Unix e suas variantes foram sendo usados cada vez mais, a criação de processos de baixo custo adicional foi considerada útil e foi usada. De fato, era tão usado que as pessoas queriam maneiras mais baixas de criar processos, e assim nasceu a idéia de "threads". Originalmente, os threads foram manipulados completamente pelo processo de origem (e programas como a JVM podem fazer isso com "threads verdes"); mas o manuseio da programação multithread é complicado e frequentemente foi feito incorretamente. Portanto, há uma maneira mais fácil e intermediária de executar threads, em que o sistema operacional lida com o agendamento, mas algumas despesas gerais são salvas ao compartilhar (normalmente) o espaço de endereço entre os threads.
É difícil responder à sua pergunta porque existem vários conceitos diferentes, mas relacionados, que são todos "threads" e, para detalhes, você precisa de um adjetivo para descrever qual deles você está fazendo referência. Por outro lado, entender as diferenças provavelmente o levará à resposta específica desejada. Procure coisas como "processos leves", "threads de usuário" e "rfork ()" para obter mais informações.
fonte
CreateProcess()
mas nada parecidofork()
.fork()
.Threads e bifurcação são, na verdade, dois conceitos diferentes, ambos existentes nos sistemas Unix / Linux (e ambos podem ser usados no C / C ++).
A idéia de um fork () é (basicamente) a 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 de fork. O objetivo do uso de garfos com funções exec é que as funções exec fechem o processo que as chamou quando elas terminam. Portanto, você geralmente bifurca-se, obtendo o PID de cada processo (o filho sempre é 0) e faz com que o pai espere até que o filho termine de executar a função exec.
Os threads são usados para paralelismo (lembre-se de que o pai espera o filho, geralmente, em um programa bifurcado). Um thread, como pthread em C / C ++ (faça uma pesquisa no Google), será executado paralelamente ao processo principal e pode compartilhar variáveis globais e funções globais com o programa original. Como os threads Java se comportam de maneira semelhante, eu imaginaria que eles agem mais como esses threads do que como um processo de bifurcação.
Basicamente, há uma diferença entre bifurcação e rosqueamento. Eles fazem coisas distintamente diferentes (embora pareçam semelhantes). Esses conceitos podem ser difíceis de entender, mas você pode aprendê-los por meio de pesquisas (extensas) se tiver um desejo sincero de entendê-los.
EDIT # 1
Veja estes exemplos de como garfos e threads podem ser chamados e usados. Observe o comportamento das funções exec e seus efeitos no programa principal.
http://www.jdembrun.com:4352/computerScience/forkVSthread.zip
fonte
pthread
é uma API, não uma implementação de encadeamento.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á possui várias perguntas sobre isso:
JVM threads nativos , confira esta resposta para obter mais detalhes.
O Apache possui dois tipos de MPMs: Prefork, com um processo por encadeamento, e Worker, que lida com vários encadeamentos: MPMs Apache . Confira a referência a
codebucket
fonte
Isso é específico da plataforma, mas no Linux e eu presumiria que muitos outros sistemas compatíveis com POSIX usam a implementação local de pthreads , uma API de segmentação de usuário. Por exemplo:
Inicia uma nova chamada de thread
somefunc
como seu primeiro ponto de execução.Você também pode criar threads - distintos dos garfos, pois compartilham o mesmo espaço de memória heap global do processo pai, em vez de obter uma cópia duplicada (mas observe que os threads são executados com uma memória de pilha independente ) - com a
clone()
chamada do sistema, que é o que pthreads é construído sobre.fonte