170 likes | 270 Views
Multiprocessamento. Sérgio Cavalcante GRECO - CIn / UFPE. Multitasking. Capacidade de executar mais de uma tarefa ( task ) “simultaneamente” TAREFAS: atividades de software executadas independentemente de outras. Podem ser: PROCESSOS: programas que executam em paralelo.
E N D
Multiprocessamento Sérgio Cavalcante GRECO - CIn / UFPE
Multitasking • Capacidade de executar mais de uma tarefa (task) “simultaneamente” • TAREFAS: atividades de software executadas independentemente de outras. • Podem ser: • PROCESSOS: programas que executam em paralelo. • THREADS: tarefas de um mesmo programa.
Multitasking: Processos • Área de memória isolada dos outros processos contendo segmentos de: • código executável • pilha - variáveis locais e/ou temporárias • dados - variáveis globais • heap - espaço para alocação dinâmica • status - recursos alocados, localização dos segmentos, contexto de execução...
Multitasking: Threads • Cada thread tem sua própria pilha e contexto de execução. • Todas as threads de um processo compartilham os mesmos segmentos de código, dados, heap, e parte do status. - maior compartilhamento de recursos - maior facilidade de sincronização - menos proteção
Multitasking: Sincronização de Threads • Funções que acessam apenas variáveis locais não estáticas podem ser chamadas de várias threads simultaneamente desde que sejam declaradas como reentrant • Funções que usem variáveis globais ou estáticas têm, em geral, seu acesso restrito.
Multitasking: Processos X Threads • Tipos de sistemas • 1 processo X 1 thread: MSDOS • N processos X 1 thread: OS/386, VAX/VMS, Windows 3.1, UNIX antigo • 1 processo X N threads: kernels para sist. embarc. • N processos X N threads: Windows 95/98,NT, UNIX
Multiprocessamento: Quando usar ? • Tarefas diversas que necessitam de pouca ou nenhuma interação. • Tarefas que necessitam de proteção. • Capacidade de modificação dinâmica do sistema Exemplo: • PDA: calendário, email, spreadsheet • Sistema de Gerenciamento Industrial • Programas para comunicação/controle da fábrica • Spreadsheet para apresentação de resultados • Banco de dados para depto de pessoal e almoxarifado
Multithreading: Quando usar ? • Várias atividades de um mesmo programa precisam ser executadas simultaneamente, principalmente em velocidades diferentes • Controle de recursos diferentes • Tratamento de diversas entradas / saídas de dados e sinais
Multithreading: Como dividir em threads ? • Identifique atividades que precisam ou são melhor executadas em paralelo • Candidatos naturais: • Usar uma thread para cada tipo de I/O: Teclado, display, sensores, atuadores • Atividades independentes • Exemplo: Impressora conectada na rede • 1 thread para receber jobs • 1 thread para processar PostScript • 1 thread para controlar o hardware de impressão
Multithreading: Escalonamento • Estados:running, ready, suspended • Escalonamento CooperativoTarefas cooperam no uso do processador, liberando-o por conta própria. • Escalonamento PreemptivoInterferência do S.O. para recuperar o uso do processador.
Tar. B Contexto Tar. C Contexto Tar. A Contexto Tar. A Contexto Tar. A Contexto Escalonamento de Threads: Round-Robin CPU:Running
Escalonamento de Threads: Round-Robin • O exemplo dado é independente do escalonador ser cooperativo ou preemptivo, e das tarefas terem ou não prioridade.
Escalonamento Cooperativo de Threads: Round-Robin com MEFs • Cada thread é implementada como uma Máquina de Estados Finitos • Caso não haja mudança de estado, a MEF libera o processador. • Caso haja mudança de estado, a MEF executa a ação correspondente e libera o processador.
Round-Robin com MEFs:Como implementar ? main() { [inicialização de variáveis, dispositivos, etc.] while (1) { TarefaA(); TarefaB(); } } [Rotinas de tratamento de interrupção] [Outras funções auxiliares] Tarefa A() { static charestadoA = estA0; [Ações comuns a todos os estados] switch(EstadoA) { case(estA0): ação0; break; case(estA1): ação1; break; case(estA2): ação2; break; } [Ações comuns a todos os estados] } Tarefa B() { static charestadoB = estB0; [Ações comuns a todos os estados] switch(estadoB) { case(estB0): ação0; break; case(estB1): ação1; break; case(estB2): ação2; break; } [Ações comuns a todos os estados] }
Round-Robin com MEFs:Abordagem Síncrona • Todas as MEFs são tratadas ANTES que novas entradas sejam verificadas. • Chamados de Sistemas Reativos Síncronos • Linguagem para espeficicação: Esterel
Round-Robin com MEFs:Como particionar as threads ? São consideradas mudanças de estado: • Alterações em sinais de entrada • Recepção de dados • Término de tempos de espera
Round-Robin com MEFs:Como usar as interrupções ? As interrupções devem ser usadas para: • Tratar rapidamente e guardar informações sobre alterações em sinais de entrada e/ou recepção de dados • Gerenciar o timer para controlar tempos de espera e contadores • Não devem ser sobrecarregadas de ações que podem e devem ser tratadas nas threads. • Eventos são tratados nas interrupções • Ações são tratadas nos estados das MEFs