Programação Sistemas



Documentos relacionados
Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal

Sistemas Operacionais I

Programação com Posix Threads

Programação de Sistemas

1. Discute as vantagens e desvantagens dum sistema de memória paginada, indicando também a importância do sistema dispôr duma memória cache.

Programação de Sistemas

Programação de Sistemas

Máquina de estados UNIX O

Máquina de estados UNIX O. Sistemas Operacionais 2008/1Profa. Patricia S.O. computação: recursos D. S.O S.O. controla eventos no sistema de

Programação Concorrente Conceitos Multiprogramação Threads

Sistemas Operacionais

PROCESSOS. Prof. Maicon A. Sartin

Notas da Aula 4 - Fundamentos de Sistemas Operacionais

Programação de Sistemas

Programação de Sistemas

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Introdução aos Computadores

Arquitetura de Sistemas Operativos

Arquitetura de Computadores. Tipos de Instruções

CPU Unidade Central de Processamento. História e progresso

Sistemas Operacionais Processos e Threads

E.E.E.P. Dr. Solon Tavares Sistemas Operacionais Prof. Henrique Cordeiro. Programação Concorrente em Linux

INSTITUTO DE EMPREGO E FORMAÇÃO PROFISSIONAL, I.P.

Trabalhando com Processos e Threads em Ambiente LINUX

OO Engenharia Eletrônica

Algoritmos e Programação Estruturada

SISTEMAS OPERACIONAIS

Ferramentas para Programação em Processadores Multi-Core

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 1. Cursos de Computação

Programação Concorrente Processos e Threads

Ntrip Detalhes de Implementação do Protocolo

Sobre a apresentação (About(

Introdução à Organização e Arquitetura de Computadores. Prof. Leonardo Barreto Campos 1

Um processo sob UNIX ocupa uma área de memória formada basicamente por 3 partes:

Sistemas Operacionais

Grupo I [4v] executaprograma();

Office 365 Manual Outlook 365 Web Application

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Introdução aos Sistemas Operativos

SISTEMAS OPERACIONAIS

Evolução dos Processadores

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 02 - Estrutura dos Sistemas Operacionais. Cursos de Computação

Programação de Sistemas

Sistemas Computacionais II Professor Frederico Sauer

Capítulo 1 Introdução

A história do Processadores O que é o processador Características dos Processadores Vários tipos de Processadores

Arquitetura de Computadores Paralelismo, CISC X RISC, Interpretação X Tradução, Caminho de dados

Interrupções. As interrupções são casos especiais de chamadas de procedimentos.

Programação 2ºSemestre MEEC /2011. Programação 2º Semestre 2010/2011 Enunciado do projecto

CONCEITOS BÁSICOS DE UM SISTEMA OPERATIVO

Comparativo de desempenho do Pervasive PSQL v11

Processos. Adão de Melo Neto

Capítulo 4. MARIE (Machine Architecture Really Intuitive and Easy)

Conceitos de Sistemas Operacionais: Chamadas de Sistema. Prof Rafael J. Sandim

LEIC/LERC 2012/13 2º Teste de Sistemas Operativos 15/Janeiro/2013

Análises Geração RI (representação intermediária) Código Intermediário

Sistema de Computação

Microprocessadores. Prof. Leonardo Barreto Campos 1

(Aula 15) Threads e Threads em Java

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

Organização Básica do Computador

1.3. Componentes dum sistema informático HARDWARE SOFTWARE

Arquitetura de Sistemas Operacionais

Download. Instalaça o. Geral

Mecanismo de Interrupção

SISTEMAS DISTRIBUÍDOS

Manual do Usuário Certificação

28/9/2010. Unidade de Controle Funcionamento e Implementação

ESTUDO DE CASO WINDOWS VISTA

Instituto Superior Técnico MEEC/MEAR. Programação de Sistemas

SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA

ENTRADA E SAÍDA DE DADOS

Processos e Threads (partes I e II)

IMPLEMENTAÇÃO DE SOCKETS E THREADS NO DESENVOLVIMENTO DE SISTEMAS CLIENTE / SERVIDOR: UM ESTUDO EM VB.NET

Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads

Fault Tolerance Middleware for Cloud Computing

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

7 Processamento Paralelo

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Computação Paralela. Desenvolvimento de Aplicações Paralelas João Luís Ferreira Sobral Departamento do Informática Universidade do Minho.

Ferramentas de Modelação e Análise de Sistemas baseadas em Redes de Petri (RdP)

Orientação a Objetos

Grupo I [4v] b. [0,6v] De que forma é que o escalonador do Linux tenta minimizar o impacto desta limitação?

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

Figura 01 Kernel de um Sistema Operacional

3. Arquitetura Básica do Computador

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

TRANSMISSÃO DE DADOS Prof. Ricardo Rodrigues Barcelar

Introdução ao Modelos de Duas Camadas Cliente Servidor

Transcrição:

Programação Sistemas Fios de Execução Programação de Sistemas Threads : 1/28 Porquê o paralelismo? (1) 1. Crescentes necessidades de computação têm sido satisfeitas com aumento do número de transístores nos chip. Gordon Moore, co-fundador da Intel previu em 1965 que o número de transístores duplicaria em cada 18 meses. Programação de Sistemas Threads : 2/28

Porquê o paralelismo? (2) 2. A velocidade do relógio aumentou imenso entre anos 70 e 2000. 8008 @ 200 Khz em Abr 1972 8080 @ 2 Mhz em Dec 1974 8085 @ 5 Mhz em Ago 1976 8086 @ 10 Mhz em Set 1978 80286 @ 12 Mhz em Fev 1982 80386 @ 16 Mhz em Out 1985 80486 @ 25 Mhz em Abr 1989 Pentium @ 60 Mhz em Mar 1993, @ 120 Mhz em Mar 1995 Pentium II @ 300 Mhz em Mai 1997 Pentium III @ 600 Mhz em Ago 1999, @ 1 Ghz em Mar 2000 Pentium 4 @ 1.5 Ghz em Nov 2000, @ 3.4 Ghz em Fev 2004 Actualmente a velocidade do relógio estabilizou à volta de 3GHz. Programação de Sistemas Threads : 3/28 Porquê o paralelismo? (3) 3. Com a actual tecnologia, o aquecimento constitui a barreira impeditiva do aumento da frequência de relógio. 10000 Densidade potência (W/cm 2 ) 1000 100 10 Escape foguetão Reactor nuclear Placa aquecida 8086 Superfície Sol 4004 8008 8085 286 386 Pentium 8080 486 1 1970 1980 1990 2000 2010 Ano Programação de Sistemas Threads : 4/28

Porquê o paralelismo? (4) Várias estratégias têm sido exploradas no processamento paralelo de informação: Processadores múltiplos. Paralelismo a nível de instrução (ILP-Instruction Level Paralelism ex: pipeline). Paralelismo a nível de fios de execução (TLP-Thread Level Paralelism). Nota: tópico central na disciplina Sistemas Operativos Distribuídos Programação de Sistemas Threads : 5/28 Introdução (1) Diversas unidades de execução partilham acesso aos mesmos recursos (ex: ficheiros). No entanto a gestão dos processos é muito pesada. A solução é ter diversas unidades de execução, partilhando código, dados globais e ficheiros. [Def] Fio de execução: unidade de execução dum processo, com os valores individuais de Registos de processador Pilha Nota1: também usada designação de processo leve LWP- lightweight process e task no Linux. Nota2: um processo lançado pelo fork() possui um único fio de execução. Programação de Sistemas Threads : 6/28

Introdução (2) Os sistemas que permitem vários fios de execução para o mesmo processo são denominados multithreading. Os SO podem ser catalogados em: Uniprogramação Single-threaded Multithreading Ex:MSDOS Ex:UNIX iniciais Ex:JavaVirtualMachine Ex:Linux,Windows Multiprogramação Programação de Sistemas Threads : 7/28 Introdução (3) Com fios de execução, a distribuição em memória do processo no Linux sofre alterações. Cada fio de execução possui o seu bloco de controlo TCB-Thread Control Block. Em vez de uma única pilha para o processo, cada fio de execução possui a sua própria pilha. as variáveis locais são pertencentes a cada fio de execução. Os fios de execução partilham PCB Pilha Registos Dados Código PCB TCB1 Pilha1 Registos1 TCB2 Pilha2 Registos2 código, Código variáveis globais, Single-threaded recursos do SO (sinais, ficheiros) Multithreaded Programação de Sistemas Threads : 8/28 Dados

Introdução (4) Ao contrário dos processos, os fios de execução não são hierarquizados numa árvore, o espaço de dados não é independente (apenas a pilha e os registos são individuais às threads). Tipicamente, o controlo dos processos (criação e ceifa/ reap ) é mais pesado que nos fios de execução (entre 20 e 240 vezes, dependendo da máquina e da implementação dos fios de execução). Programação de Sistemas Threads : 9/28 Introdução (5) Várias APIs para fios de execução foram criadas Wind32 threads. C-Threads Pthreads : norma POSIX IEEE 1003.1c, publicada em 1995, disponível em muitas implementações do Unix e adoptada nesta disciplina. O POSIX define funções de gestão de fios de execução, na extensão THR (cerca de 60). As funções possuem o prefixo pthread_ Definições disponíveis no ficheiro pthread.h Edição de ligações ( link ) deve indicar arquivo -lpthread Programação de Sistemas Threads : 10/28

Introdução (6) Nota: convenção adoptada pelo Pthreads para os identificadores Tipos de dados : pthread[_objecto]_t Funções : pthread[_objecto]_acção Constantes e macros: PTHREAD_OBJECTIVO Exemplos: pthread_t : referência a fio de execução. pthread_create() : lançamento de novo fio de execução. pthread_mutex_t : referência a ferrolho de fios de execução. pthread_mutex_lock() : fechar ferrolho. PTHREAD_CREATE_DETACHED : macro Programação de Sistemas Threads : 11/28 Introdução (7) Listagem das funções mais relevantes Função POSIX Descrição pthread_cancel() Solicita terminação a outro fio de execução pthread_create() Cria fio de execução pthread_detach() Determina libertação de recursos no fim pthread_equal() Testa igualdade em 2 fios de execução pthread_exit() pthread_kill() pthread_join() pthread_self() Sai do fio de execução Envia sinal para o fio de execução Espera pela terminação de um fio de execução Identifica o próprio ID Programação de Sistemas Threads : 12/28

Introdução (8) Tipicamente um programa possui as seguintes instruções Thread principal Thread2 pthread_create(&thread2,null,proc,&arg); proc(&arg) { pthread_join(thread2,*status); pthread_exit(*status); } pthread_create() pthread_join() T1 proc pthread_exit() T2 Programação de Sistemas Threads : 13/28 Introdução (9) Casos favoráveis à utilização de fios de execução: Multiplice ( multiplex ), com comunicação de mensagens de tipos distintos pelo mesmo canal: ex-servidores. Espera sincronizada: ex-clientes. Notificação de eventos: ex-simulações, sistemas gráficos. Sistemas com desempenho crítico. Casos desfavoráveis à utilização de fios de execução: Sistemas modulares, porque os fios de execução não são independentes. Sistemas distintos, porque a implementação dos fios de execução é muito dependente do sistema operativo. Sistemas em constante evolução, porque a depuração de fios de execução é difícil. Programação de Sistemas Threads : 14/28

Identificação APUE 11.3 Os fios de execução possuem um identificador de tipo pthread_t (uma estrutura). Um fio de execução conhece o seu identificador por POSIX:THX #include <pthread.h> pthread_t pthread_self(); Uma vez que pthread_t é uma estrutura, a comparação de dois identificadores é feita pela função POSIX:THX int pthread_equal(pthread_t,pthread_t) Nota: para imprimir o identificador do terminal, usar formatação %lu. Programação de Sistemas Threads : 15/28 Lançamento (1) APUE 11.4 Um fio de execução é lançado pela instrução POSIX:THX int pthread_create( pthread_t *, pthread_attr_t *, void *(*function)(void *), void *); 1º parâmetro: endereço da localização onde é armazenado identificador do novo fio de execução. 2º parâmetro: endereço da localização onde são indicados os atributos do novo fio de execução. O valor NULL indica atributos por omissão. 3º parâmetro: função C que executa código, obrigatoriamente de assinatura void * foo(void*). 4º parâmetro: parâmetro da função C (se houver vários parâmetros, eles devem ser embrulhados numa tabela ou numa estrutura). Em caso de sucesso, pthread_create() retorna 0. Programação de Sistemas Threads : 16/28

Lançamento (2) Os parâmetros e valores de retorno podem ser transmitidos por dias vias: Variáveis globais: opção desaconselhada, porque os fios de execução chamador e lançado podem alterar as variáveis em simultâneo. Pelo 4º parâmetro da função pthread_create. Os dois fios de execução trabalham em paralelo. O número máximo de fios de execução lançados depende do espaço ocupado pela pilha (tipicamente 300). Nota: um processo lançado dentro de uma thread, por fork(), contém uma única cópia da thread que chamou o fork(). Programação de Sistemas Threads : 17/28 Lançamento (3) Nota: se a mesma thread for lançada várias vezes, não usar a mesma variável para parâmetro se ela for modificada as threads podem ficar com o memo valor! int i; /* ordem de lançamento da thread */ int numb; /* número de threads a lançar */ pthread_t *tid; tid = (pthread_t *)malloc( numb*sizeof(pthread_t) ); for( i=0;i<numb;i++ ) { int *pos = (int *)malloc( sizeof(int) ); *pos = i; if( pthread_create( &(tid[i]),null,foo,(void *)pos ) ) { printf( "Erro no lancamento da thread %d\n",i ); exit( 2 ); } } Programação de Sistemas Threads : 18/28

Espera por uma thread APUE 11.5 Um fio de execução espera pela conclusão de outro fio de execução pela instrução POSIX:THX int pthread_join(pthread_t, void **); 1º parâmetro: identificador do fio de execução a esperar. 2º parâmetro: endereço da localização onde reside o ponteiro para a localização de tipo int (onde reside código de saída). Nota1: apenas um fio de execução ( thread ) pode esperar pela conclusão de outro. Nota2: os recursos de uma thread (ID,pilha) são libertos APENAS depois do join. Programação de Sistemas Threads : 19/28 Eliminição (1) APUE 11.5 Um fio de execução elimina-se a si próprio pela instrução POSIX:THX int pthread_exit(void *); 1º parâmetro: endereço da localização onde reside código de saída. A localização, de tipoint, deve ter existência fora da função que executa o código, o que pode ser feito por: Variável global, Localização indicada pelo fio de execução à espera. Criada dinamicamente. Nota 1: fazer return(cod) na rotina do fio de execução leva compilador a gerar automaticamente o pthread_exit() Nota 2: depois do pthread_exit, os recursos só são libertos depois de outro fio de execução ter feito o pthread_join(). A libertação dos recursos é feita automaticamente se for executado POSIX:THX int pthread_detach(pthread_t); Neste caso não pode ser feito o pthread_join(). Programação de Sistemas Threads : 20/28

Eliminição (2) Um fio de execução sinaliza outro fio de execução pela instrução POSIX:THX int pthread_kill(pthread_t, int); 1º parâmetro: identificador do fio de execução a eliminar 2º parâmetro: código do sinal Nota 1: se um processo terminar com exit(), todos os fios de execução lançados por ele terminam igualmente, excepto se os fios de execução lançados tiverem executado pthread_detached(). Nota 2: enviar SIGKILL elimina todos os fios de execução do processo, não apenas a thread enviada. Programação de Sistemas Threads : 21/28 2º EXERCÍCIO TEORICO-PRATICO Calcule a soma dos elementos de uma tabela, contendo uma série de inteiros com crescimento linear a partir de 1, delegando o cálculo num fio de execução. A soma deve ser impressa no fio de execução e no programa principal. O fio de execução deve conter 3 argumentos: Endereço base da tabela. Dimensão da tabela. Localização onde a soma é guardada. Programação de Sistemas Threads : 22/28

Distribuição de pedidos (1) Chegado um pedido de processamento, como distribuí-lo pelos fios de execução existentes? Existem vários modelos de distribuição dos pedidos 1. Modelo por equipa: cada thread fica à espera da chegada de um pedido mail box Inconveniente: especialização das threads dificultada Programação de Sistemas Threads : 23/28 Distribuição de pedidos (2) 2. Modelo por servidores: um despacho lê a mensagem e entrega-a ao fio de execução apropriado, ou disponível dispatcher mail box workers Inconvenientes: aumenta o número de threads, atrasa processamento do pedido. Programação de Sistemas Threads : 24/28

Distribuição de pedidos (3) 3. Modelo por pipeline: a mensagem é processada numa sequência de threads mail box Inconvenientes: processamento do pedido tem de ser dividido por etapas. Programação de Sistemas Threads : 25/28 Relação thread/processos (1) No Linux, as threads e processos (ambos designados por tarefas- tasks ) são lançados pela chamada de sistema clone(). Os recursos partilhados pelas duas tarefas, que levam à distinção entre threads e processos, é determinada por bandeiras ( flags ). Bandeira CLONE_FS CLONE_VM Descrição Sistema de ficheiros partilhado Memória partilhada CLONE_SIGHAND Tratamento partilhado de sinais CLONE_FILES Partilhados ficheiros abertos Programação de Sistemas Threads : 26/28

Relação thread/processos (2) Criação de tarefas efectuada pela chamada de sistema #include <sched.h> int clone(int (*fn)(void *), void *, int, void *,...) O processo filho partilha parte do contexto de execução com processo ascendente (memória, tabela de descritores de ficheiros,...) 1. Questão: Se um processo for suspenso, o que acontece às threads? Resposta: todas as threads são suspensa, porque elas partilham o espaço de dados. Programação de Sistemas Threads : 27/28 Relação thread/processos (3) 2. Questão: Se um processo for terminado, o que acontece às threads? Resposta: todas as threads são igualmente terminadas. 3. Questão: Se um fio de execução executar fork(),, quantas threads são duplicadas? Resposta: depende da versão do Unix! algumas possuem duas versões do fork(), uma duplica todas as LWP, outra apenas duplica a LWP chamadora. exec() normalmente substitui todas as LWP no processo antigo. Programação de Sistemas Threads : 28/28