Pergunta

O que é a diferença entre uma linha e uma fibra? Já ouvi falar de fibras de rubi e eu li ouvido Eles estão disponíveis em outros idiomas, alguém poderia me explicar em termos simples o que é a diferença entre uma linha e uma fibra.

Foi útil?

Solução

Em termos mais simples, tópicos são geralmente considerados como sendo de preferência (embora isto possa não ser sempre verdade, dependendo do sistema operativo) enquanto que as fibras são considerados como sendo de peso leve, roscas cooperantes. Ambos são caminhos de execução separados para a sua aplicação.

Com tópicos: o caminho de execução atual pode ser interrompido ou preempted a qualquer momento (nota: esta afirmação é uma generalização e podem nem sempre são verdadeiras, dependendo OS / rosqueamento pacote / etc.). Isto significa que para threads, a integridade dos dados é um grande problema porque um thread pode ser interrompido no meio da atualização de um bloco de dados, deixando a integridade dos dados em um mau ou estado incompleto. Isto também significa que o sistema operacional pode tirar vantagem de várias CPUs e núcleos de CPU, executando mais de um segmento, ao mesmo tempo e deixá-lo até o desenvolvedor para acesso a dados guarda.

Com fibras: o caminho de execução actual só é interrompido quando a execução rendimentos de fibra (mesma nota como acima). Isto significa que as fibras sempre iniciar e parar em locais bem definidos, de modo que a integridade dos dados é muito menos de um problema. Além disso, porque as fibras são muitas vezes geridos no espaço do usuário, trocas de contexto caros e mudanças de estado da CPU não precisa ser feito, fazendo mudar de uma fibra para a próxima extremamente eficiente. Por outro lado, uma vez que não há duas fibras pode executar exatamente ao mesmo tempo, apenas usando fibras sozinho não vai tirar proveito dos vários processadores ou vários núcleos de CPU.

Outras dicas

Fios uso preventivo agendamento, enquanto que as fibras usar cooperativa agendamento.

Com um fio, o fluxo de controle poderia ter interrompido a qualquer momento, e outro segmento pode assumir. Com múltiplos processadores, você pode ter vários segmentos todos rodando ao mesmo tempo ( simultânea multithreading, ou SMT). Como resultado, você tem que ser muito cuidado com acesso a dados em simultâneo, e proteger seus dados com semáforos, semáforos, variáveis ??de condição, e assim por diante. Muitas vezes, é muito complicado para obter direito.

Com uma fibra, controlo só muda quando você diga a ele, tipicamente com uma chamada de função chamado algo como yield(). Isso faz com que o acesso a dados concorrente mais fácil, desde que você não precisa se preocupar com a atomicidade de estruturas de dados ou semáforos. Contanto que você não ceder, não há perigo de ser preempted e ter outra fibra tentando ler ou modificar os dados que você está trabalhando. Como resultado, no entanto, se a sua fibra entra em um loop infinito, nenhuma outra fibra pode executar, desde que você não está rendendo.

Você também pode misturar fios e fibras, o que dá origem aos problemas enfrentados por ambos. Não recomendado, mas às vezes pode ser a coisa certa a fazer, se feito com cuidado.

Em Win32, uma fibra é um tipo de segmento gerenciado pelo usuário. A fibra tem sua própria pilha e seu próprio ponteiro de instrução etc., mas as fibras não são programadas pelo sistema operacional: você tem que chamar SwitchToFiber explicitamente. Tópicos, por contraste, são preventivamente programado pelo sistema de operação. Assim, grosso modo uma fibra é um segmento que é gerido ao nível da aplicação / execução ao invés de ser um verdadeiro fio OS.

As consequências são que as fibras são mais baratos e que o aplicativo tem mais controle sobre a programação. Isso pode ser importante se o aplicativo cria um monte de tarefas simultâneas, e / ou quer intimamente otimizar quando são executados. Por exemplo, um servidor de banco de dados pode optar por usar fibras em vez de threads.

(Pode haver outros usos para o mesmo termo,. Como indicado, esta é a definição Win32)

Primeiro eu recomendo a leitura deste explicação do a diferença entre processos e threads como material de apoio.

Depois de ler que é bastante simples. Tópicos latas ser implementado no kernel, no espaço do usuário, ou os dois podem ser misturados. As fibras são basicamente tópicos implementado no espaço do usuário.

  • O que é normalmente chamado um fio é um segmento de execução implementado no kernel: o que é conhecido como um fio kernel. O agendamento de uma thread do kernel é tratado exclusivamente pelo kernel, embora um thread do kernel pode voluntariamente liberar a CPU por dormir se quiser. A thread do kernel tem a vantagem de poder usar o bloqueio I / O e deixe a preocupação do kernel sobre a programação. É da principal desvantagem é que a mudança da linha é relativamente lento, uma vez que requer prendendo no kernel.
  • As fibras são fios de espaço do usuário cuja programação é feita no espaço do usuário por um ou mais segmentos do kernel sob um único processo. Isso faz com que a fibra de comutação muito rápido. Se você agrupar todas as fibras que acessam um determinado conjunto de dados compartilhados no contexto de um único segmento do kernel e ter a sua programação tratado por um único segmento kernel, então você pode eliminar problemas de sincronização desde as fibras efetivamente executado em série e você tem completa controle sobre a sua programação. O agrupamento de fibras relacionados sob um único fio de núcleo é importante, uma vez que o fio de núcleo que estão rodando no pode ser pré-influenciado pelo kernel. Este ponto não é claro em muitas das outras respostas. Além disso, se você usa o bloqueio I / O em uma fibra, todo o thread do kernel é uma parte de blocos, incluindo todas as fibras que são parte desse thread do kernel.

Na seção 11.4 "Processos e threads no Windows Vista" em sistemas operacionais modernos, comentários Tanenbaum:

Embora fibras são cooperativamente programada, se houver múltiplos tópicos agendamento das fibras, um monte de sincronização cuidadosa é necessário para fazer fibras certeza que não interferem uns com os outros. Para simplificar a interacção entre fios e fibras, é frequentemente útil para criar apenas como muitos segmentos como existem processadores para executar eles, e affinitize os tópicos para cada corrida apenas em um conjunto distinto de processadores disponíveis, ou mesmo apenas um processador. Cada lata fio em seguida, executar um subconjunto particular das fibras, que estabelece um para-muitos entre fios e fibras que simplifica sincronização. Mesmo assim, existem ainda muitas dificuldades com fibras. bibliotecas mais Win32 são completamente alheios de fibras, e aplicações que tentam utilizar fibras como se fossem uma linha irá encontram várias falhas. O kernel não tem conhecimento de fibras, e quando uma fibra entra no núcleo, o fio que está a executar em Maio bloquear e o kernel irá agendar um segmento arbitrário na processador, tornando-o disponível para executar outras fibras. Para estes fibras razões raramente são usados ??excepto quando portar o código de outra sistemas que necessitam explicitamente a funcionalidade fornecida por fibras.

Note que, além de fios e fibras, Windows 7 introduz User-Mode Scheduling :

-mode usuário agendamento (UMS) é um mecanismo de peso leve que os aplicativos podem usar para programar a sua tópicos próprios. Um aplicativo pode mudar entre UMS fios em modo de utilizador sem envolver o programador do sistema e recuperar o controlo do processador, se um UMS enfiar blocos no kernel. UMS tópicos diferem a partir de fibras em que cada thread UMS tem seu próprio segmento contexto em vez de compartilhar o fio contexto de um único segmento. o capacidade de alternar entre tópicos em modo de usuário faz UMS mais eficiente de pools de threads para gerenciar grandes número de itens de trabalho de curta duração que exigem poucas chamadas do sistema.

Mais informações sobre fios, fibras e UMS está disponível assistindo Dave Probert:. Dentro Windows 7 - User Mode Scheduler (UMS)

Threads são programados pelo sistema operacional (preventivo). Um segmento pode ser interrompida ou retomada a qualquer momento pelo sistema operacional, mas as fibras mais ou menos administrar-se (cooperativa) e rendimento para cada outro. Isto é, os controlos programador quando as fibras de fazer o seu processamento e quando que o processamento passa para outra fibra.

Threads foram originalmente criados como processos leves. De uma maneira semelhante, as fibras são uma rosca leve, confiando (simplista) sobre as próprias fibras de marcar o outro, obtendo-se por controlo.

Eu acho que o próximo passo será vertentes onde você tem que enviar-lhes um sinal cada vez que você quer que eles para executar uma instrução (não ao contrário do meu 5yo filho :-). Nos velhos tempos (e ainda hoje em algumas plataformas embarcadas), os tópicos eram fibras, não havia direito de preferência e você tinha que escrever seus tópicos para se comportar bem.

Fios geralmente dependem do kernel para interromper a rosca, de modo que ou outro segmento pode executar (que é mais conhecido como multitarefa preventiva) enquanto que as fibras utilizar cooperativo multitarefa onde é a própria fibra que desistir da sua execução tempo para que outras fibras pode ser executado.

Alguns links úteis que explicam melhor do que eu provavelmente fiz são:

definição de fibra Win32 é de fato "Linha Verde" definição estabelecida na Sun Microsystems. Não há necessidade de desperdiçar o termo fibra no segmento de algum tipo, ou seja, um thread em execução no espaço do usuário sob controle do código de utilizador / thread-biblioteca.

Para esclarecer o olhar argumento nos seguintes comentários:

  • Com o Hyper-threading, multi-core CPU pode aceitar vários segmentos e distribuí-los um de cada núcleo.
  • Superscalar pipeline CPU aceita uma thread para execução e usos Instrução Nível Paralelismo (ILP) para executar o o fio mais rápido. Podemos assumir que um fio é dividido em fibras paralelas que funcionam em condutas paralelas.
  • CPU SMT pode aceitar vários segmentos e brake-los em fibras de instrução para execução paralela em vários oleodutos, utilização de gasodutos de forma mais eficiente.

Devemos assumir que os processos são feitos de tópicos e que tópicos devem ser feitas de fibras. Com essa lógica em mente, usando fibras de outros tipos de tópicos é errado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top