Segmentos e Threading
Os sistemas operacionais usam processos para separar aplicativos diferentes que eles estão em execução.Segmentos são a unidade básica para o qual um sistema operacional aloca time do processador e mais de um thread pode executar código dentro desse processo.Cada thread mantém manipuladores de exceção, uma prioridade de agendamento e um conjunto de estruturas que o sistema utiliza para salvar o contexto de segmento até que ela está agendada.O contexto do segmento inclui todas as informações que o thread precisa diretamente continuar a execução, incluindo conjunto do segmento de registros de CPU e a pilha, no espaço de endereço de processo de host do segmento.
O .NET estrutura ainda mais subdivide um processo do sistema operacional em subprocessos gerenciado leves, chamados de domínios de aplicativo, representados por System.AppDomain. Um ou mais threads gerenciados (representados por System.Threading.Thread) pode ser executado em um a qualquer número de domínios de aplicativo dentro do mesmo processo gerenciado. Embora cada domínio do aplicativo é iniciado com um único thread, o código desse domínio do aplicativo pode criar domínios adicionais de aplicativos e segmentos adicionais.O resultado é que um segmento gerenciado pode se mover livremente entre domínios de aplicativo dentro do mesmo processo gerenciado; você pode ter apenas um thread movendo entre vários domínios de aplicativo.
Um sistema operacional que suporta multitarefa preemptiva cria o efeito de execução simultânea de vários threads a partir de vários processos.Ele faz isso dividindo o time de processador disponível entre os threads que precisam dele, alocar uma fatia de time de processador para cada thread um após outro.O thread atualmente em execução está suspenso quando o time decorrido de fatia e outro thread continua sendo executado.Quando o sistema alterna de um thread para outro, ele salva o contexto de segmento do segmento preempted e recarrega contexto thread salvo do próximo segmento na fila de thread.
O comprimento da fatia time depende do sistema operacional e o processador.Como cada fatia de time for pequena, vários threads parecer executar ao mesmo time, mesmo se houver apenas um processador.Isso é realmente o caso em sistemas de multiprocessadores, onde os segmentos executável são distribuídos entre os processadores disponível.
Quando usar vários segmentos
Software que requer interação do usuário deve reagir às atividades do usuário mais rápido possível para proporcionar uma experiência de usuário avançada.No entanto, ao mesmo time, ele deve fazer sistema autônomo cálculos necessários para apresentar dados ao usuário o mais rápido possível.Se seu aplicativo usa apenas um thread de execução, você pode agrupar programação assíncrono with .NET estrutura comunicação remota or Serviços XML da Web criados usando ASP.NET para usar o time de processamento de outros computadores além para que seu próprio para capacidade de resposta de aumento para o usuário e diminuir o time de processamento de dados do seu aplicativo.Se você estiver fazendo o trabalho intensivo de entrada/saída, você também pode usar portas de conclusão de E/s para aumentar a capacidade de resposta do aplicativo.
Vantagens de vários segmentos
Usando mais de um thread, no entanto, é a técnica mais poderosa disponível para aumentar a capacidade de resposta para o usuário e processo os dados necessários para realizar o trabalho quase ao mesmo time.Em um computador com um processador, vários threads podem criar esse efeito, aproveitando os pequenos períodos de time entre eventos do usuário para processar os dados no plano de fundo.Por exemplo, um usuário pode edição uma planilha, enquanto Outros thread é o recálculo de outras partes da planilha dentro do mesmo aplicativo.
Sem modificação, o mesmo aplicativo seria aumentar drasticamente a satisfação do usuário quando executado em um computador com mais de um processador.Seu domínio do aplicativo único pode usar vários segmentos para realizar as seguintes tarefas:
Se comunicar através de uma rede, em um servidor Web e para um banco de dados.
Executar operações que realizar uma grande quantidade de time.
Diferenciar as tarefas de prioridade variada.Por exemplo, um thread de alta prioridade gerencia tarefas de time críticas e executa um thread de baixa prioridade Outros tarefas.
Permitir que a interface do usuário permaneça responsivo, ao alocar time para as tarefas em segundo plano.
Desvantagens de vários segmentos
É recomendável que você use apenas segmentos sistema autônomo possíveis, minimizando assim o uso de recursos de sistema operacional e melhorando o desempenho.Threading também tem recurso requisitos e conflitos em potenciais para ser considerado ao projetar seu aplicativo.O recurso requisitos são sistema autônomo seguintes:
O sistema consome memória as informações de contexto exigidas pelos processos, AppDomain objetos e segmentos.Portanto, o número de processos, AppDomain objetos e threads que podem ser criados é limitado pela memória disponível.
Manter o controle de um grande número de threads consome time significativo de processador.Se houver muitos segmentos, a maioria deles não fará significativo progresso.Se a maioria dos segmentos corrente estiver em um processo, threads em outros processos são agendadas com menos freqüência.
Controlando a execução de código com vários segmentos é complexo e pode ser uma fonte de vários bugs.
Destruição de segmentos exige saber o que poderia acontecer e lidar com essas questões.
Fornecer acesso compartilhado a recursos pode criar conflitos.Para evitar conflitos, sincronizar ou controlar o acesso a recursos compartilhados.Falha ao sincronizar o acesso corretamente (nos domínios de aplicativo iguais ou diferentes) pode levar a problemas sistema autônomo travamentos (no quais dois threads parar de responder enquanto cada um aguarda o Outros concluir) e sistema autônomo condições de corrida (quando um resultado anormais ocorre devido a uma dependência de crítica inesperada a temporização dos dois eventos).O sistema fornece objetos de sincronização que podem ser usados para coordenar entre vários threads de compartilhamento de recursos.Reduzindo o número de segmentos torna mais fácil sincronizar os recursos.
Recursos que requerem sincronização:
Recursos do sistema (sistema autônomo portas de comunicação).
Recursos compartilhados por vários processos (sistema autônomo identificadores de arquivo).
sistema autônomo recursos de um domínio do aplicativo único (sistema autônomo global, estático e campos de instância) acessado por vários threads.
Design de aplicativo e Threading
Em geral, usando o ThreadPool classe é a maneira mais fácil de lidar com vários encadeamentos para tarefas relativamente curtos que não irá bloco outros threads e quando você não espera qualquer agendamento específico de tarefas. No entanto, há várias razões para criar seus próprios segmentos:
Se você precisar de uma tarefa para ter uma prioridade específica.
Se você tiver uma tarefa que pode ser um longo time de execução (e, portanto, bloquear outras tarefas).
Se você precisar colocar threads em um apartamento single-threaded (todos os ThreadPool threads estão em multithreaded apartment).
Se você precisar de uma associado ao segmento de identidade estável.Por exemplo, você deve usar um thread dedicado anular esse segmento, suspendê-lo ou descobri-lo pelo nome.
Se você precisar executar threads de plano de fundo que interagem com a interface do usuário, o .NET estrutura versão 2.0 fornece um BackgroundWorker componente que se comunica usando eventos, com o marshaling de thread cruzado ao thread da interface do usuário.
Threading e exceções
Tratar exceções em threads.Em geral, exceções sem tratamento em threads, até mesmo plano de fundo de threads, terminar o processo.Há três exceções a essa regra:
A ThreadAbortException é acionada em um thread porque Abort foi chamado.
An AppDomainUnloadedException é lançada em um thread porque o domínio do aplicativo está sendo descarregado.
O Common linguagem tempo de execução ou um processo de host encerra o thread.
Para obter mais informações, consulte Exceções em threads gerenciado.
Observação: |
---|
Nas versões do .NET estrutura 1.0 e 1.1, o common linguagem tempo de execução silenciosamente intercepta algumas exceções, por exemplo, em threads do pool de threads.Isso pode corromper o estado do aplicativo e, eventualmente, fazer com que os aplicativos parar, que podem ser muito difícil depurar. |
Consulte também
Conceitos
Sincronizando dados para o multithreading