EEL770 Sistemas Operacionais

Documentos relacionados
Threads. Agenda. Threads. Processo. Processo. Processo. Processo. (c) Volnys B. Bernal Versão de 22/3/2012

Sistemas Operacionais

Sistemas Operacionais

Sistemas Operacionais

Na Aula Anterior... O Conceito de Threads

Davidson Rodrigo Boccardo

Sistemas Operacionais Processos. Carlos Ferraz Jorge Cavalcanti Fonsêca

Sistemas Operacionais

Sistemas Operacionais

SISTEMAS OPERACIONAIS

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

Sistemas Distribuídos Aula 3

Sistemas Operacionais

Sistemas Operacionais I

Processo. Gerência de Processos. Um programa em execução. Centro de Informática/UFPE :: Infraestrutura de Software

Processo. Gerência de Processos. Um programa em execução. Centro de Informática/UFPE :: Infraestrutura de Software

Sistemas Operacionais I

Sistemas Operacionais. Universidade Federal de Minas Gerais. Aula 2. Gerência de Processos

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES II AULA 07: PROGRAMANDO COM THREADS EM LINGUAGEM C

Arquitetura de Computadores Sistemas Operacionais II

SSC0640 Sistemas Operacionais I

Sistemas Operacionais. Conceito de Processos

Ferramentas para Programação em Processadores Multi-Core

INTRODUÇÃO AOS SISTEMAS OPERACIONAIS SEMANA 13

Prof. Kleber R. Rovai

Processos e Threads. Ciclo 2 AT3. Prof. Hermes Senger

Processos O conceito de processos é fundamental para a implementação de um sistema multiprogramável. De uma maneira geral, um processo pode ser entend

Concorrência em Processos

SOP - TADS Processos. Revisão Ultima aula

EEL770 - Sistemas Operacionais Notas de Aula

Unidade 2. Processos Threads Concorrência em Java

Threads. Pedro Cruz. EEL770 Sistemas Operacionais

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017. ALUNO Prof. Bosco

Sistemas Operacionais

Leandro Soares de Sousa (DSc.) Página: Aula 04 - desenvolvimento multithread

Chapter 4: Threads. Operating System Concepts 8th Edition

Processos. Processo (1) Processo (2) Processo (3) Conceitos Básicos

Processos. Conceitos Básicos

Leandro Soares de Sousa (DSc.) Página: Parte II

Fundamentos de Sistemas Operacionais

Sistemas Operacionais

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

Processos. Adão de Melo Neto

SISTEMAS OPERACIONAIS

Trabalhando com Processos e Threads em Ambiente LINUX

Processos ca 3 pítulo

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião

Introdução aos Sistemas Operacionais. Threads

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Ferramentas para Programação em Processadores Multi-Core

Sistemas de Informação. Sistemas Operacionais

Sistemas Operacionais I Parte VI Threads

Processos. Conceitos Básicos

Sistemas Distribuídos

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação. Processamento Paralelo Threads. Aluno: Wagner Palacio

Thread. Thread. Sistemas Operacionais. Leonard B. Moreira. UNIVERSIDADE ESTÁCIO DE SÁ fevereiro, / 41

Processo. Prof. Paulo Cesar F. de Oliveira, BSc, PhD

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

INE 5645 Programação Paralela e Distribuída

14/05/2017. Conceitos de Processos. Conceitos de Processos. Conceito de processo

Introdução ao OpenMP

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Programação concorrente (processos e threads)

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

Sistemas Distribuídos Capítulo 3 - Aula 3

Processos Concorrentes

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

Redes de Computadores. INF201 - Fundamentos de Sistemas Operacionais - 2º Período

AULA Nº 08 SISTEMAS OPERACIONAIS. Threads

Threads. threads em Linux Taisy Weber

Sistemas Operacionais Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios. Aula 06.

Sistemas Operacionais II

AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS

Fundamentos de Sistemas Operacionais

Chamadas de Sistema (SYSCALL)

Introdução. Pedro Cruz. EEL770 Sistemas Operacionais

Sistemas Operacionais. Capítulo 5 Processos

! Os primeiros computadores permitiam a execução de apenas um programa de cada vez, com acesso completo aos recursos do sistema

Sistemas Distribuídos Aula 2

A IMPORTÂNCIA DE THREADS NO DESEMPENHO DE APLICAÇÕES

Sistemas Operacionais

SO: Gerenciamento de Processos

Estrutura dos Sistemas Operacionais. Sérgio Portari Júnior

Sistemas Operacionais. Processos e Threads

SOP - TADS Threads. Revisão Ultima aula. Programa em execução Cada processo têm sua própria CPU

Sistemas Operativos 4ª parte - Threads

Capítulo 2. Multiprogramação. Conteúdo. Objetivo. Recordando. Recordando. DCA-108 Sistemas Operacionais

SISTEMAS DISTRIBUÍDOS PROCESSOS. Slides cedidos pela professora Aline Nascimento

Aula 03 - Concorrência. por Sediane Carmem Lunardi Hernandes

Concorrência. Prof. Paulo Cesar F. de Oliveira, BSc, PhD

Sistemas Operacionais. BSI / UAB 2013 Hélio Crestana Guardia

Threads. O que é uma Thread? Paralelismo

Na Aula Anterior... Interrupções por software e hardware; Temporizadores; RTC; Temporizadores via software. Relação Processos Multiprogramação

Notas da Aula 2 - Fundamentos de Sistemas Operacionais

Processos. Processos e Recursos (1) Tabelas de Controle do S.O. Processos e Recursos (2)

OO Engenharia Eletrônica

Processos. Prof. Gustavo Leitão

PROCESSOS. Prof. Maicon A. Sartin

Sistemas de Informação. Sistemas Operacionais

Transcrição:

EEL770 Sistemas Operacionais Parte 2: Concorrência Conceitos básicos e ciclo de vida de threads Prof. Rodrigo de Souza Couto

Concorrência Múltiplas atividades que podem ocorrer ao mesmo tempo Exemplos Um servidor de grande porte recebe requisições de milhares de usuários ao mesmo tempo Uma aplicação de cálculo científico divide o processamento em diversas tarefas Programar software concorrente requer cuidados e conhecimento de Sistemas Operacionais

Threads Uma thread é uma unidade básica de utilização da CPU ID de thread Contador de programa (PC) Um conjunto de registradores Pilha de execução Nas aulas anteriores, um processo tinha única thread Mas um processo pode ter várias threads Threads de um mesmo processo compartilham Seção de código Seção de dados Arquivos abertos Outros recursos do S.O. como arquivos abertos e sinais 3

Processo com uma única thread Código Dados Arquivos Registradores Pilha thread Figura adaptada de [4] 4

Processo com múltiplas threads Código Dados Arquivos Registradores Registradores Registradores Pilha Pilha Pilha thread thread thread Figura adaptada de [4] 5

Exemplo de uso de threads Exibição de mapa, com diferentes tarefas concorrentes Figura retirada de [1] 6

SO como ilusionista Abstração de infinitas CPUs Figura retirada de [1] 7

Não seria possível fazer software concorrente só com processos? 8

Não seria possível fazer software concorrente só com processos? Possível é, mas poderia implicar em perda de desempenho Threads compartilham espaço de endereçamento Útil quando tarefas concorrentes utilizam os mesmo dados Não é necessário utilizar técnicas de IPC Threads são mais rápidas de criar e destruir P.ex., não é necessária a cópia de dados exigida pelo fork Em alguns livros, threads são referidas como processos leves Processos podem ser vistos como uma forma de proteger uma thread ou um conjunto de threads 9

Quando usar threads? Para expressar tarefas concorrentes Alguns programas são naturalmente concorrentes P.ex., servidor web, aplicação de mapa vista anteriormente, etc. Para prover responsividade Deixar tarefas executando em segundo plano enquanto outras podem receber entradas do usuário P.ex., interface gráfica, na qual botões como "cancelar" devem estar sempre disponíveis 10

Quando usar threads? Para aumento de desempenho, em arquiteturas com múltiplas CPUs Cada thread pode ser executada por uma CPU diferente Para aumento de desempenho, em aplicações com tarefas de E/S Enquanto uma thread está bloqueada por E/S, a outra está executando o processamento Ganho de desempenho até em arquiteturas com uma CPU 11

Exemplo de quantidade de threads no Windows 10 Para fazer no seu, use a ferramenta https://docs.microsoft.com/pt-br/sysinternals/downloads/process-explorer 12

Abstração de Threads Uma thread é um sequência única de execução que representa uma tarefa escalonável separadamente Cada thread pode ser vista como uma programa sequencial S.O. pode executar ou suspender a thread a qualquer momento Cada thread executa em uma CPU virtual, com velocidade imprevisível e variável Ou seja, thread pode levar mais tempo ou menos tempo para executar, dependendo do escalonamento de outras threads 13

Exemplo de execução de thread Figura retirada de [1] 14

Exemplo de execução de thread Figura retirada de [1] 15

API para threads baseada no padrão POSIX void pthread_create(thread,func,arg) Cria uma thread, armazenando sua referência no argumento thread Thread executa função func, que recebe os argumento de arg Análogo à combinação fork + exec para processos Chamada assíncrona Programa que chamou não espera retorno da função para prosseguir 16

API para threads baseada no padrão POSIX pthread_join(thread) Espera a finalização da thread referenciada por thread pthread_yield() A thread que chamar essa função pode desistir de sua vez na CPU, em favor de alguma outra thread Vai para o final da fila de threads prontas Multi-threading cooperativo void pthread_exit(ret) Finaliza a thread que chamou e coloca em ret uma referência para o valor de retorno 17

Exemplo de uso da thread Programa criará diversas threads para chamar a função go Função receberá o número da thread, imprimirá na tela esse número, e retornará o número mais 100 void * go(void *n){ int *ret = (int *)n; printf("hello from thread %d\n", *ret); *ret += 100; pthread_exit(ret); Adaptado de [1] 18

Exemplo de uso da thread Programa criará diversas threads para chamar a função go Função receberá o número da thread, imprimirá na tela esse número, e retornará o número mais 100 Função declarada como ponteiro Recebe ponteiro para void. Permite função receber qualquer estrutura de void * go(void *n){ dados int *ret = (int *)n; printf("hello from thread %d\n", *ret); *ret += 100; pthread_exit(ret); Adaptado de [1] 19

Exemplo de uso da thread Programa criará diversas threads para chamar a função go Função receberá o número da thread, imprimirá na tela esse número, e retornará o número mais 100 void * go(void *n){ int *ret = (int *)n; printf("hello from thread %d\n", *ret); *ret += 100; pthread_exit(ret); Para esta implementação específica, ponteiro void é transformado em ponteiro para inteiro Finaliza a thread, retornando o ponteiro ret Adaptado de [1] 20

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; Cria 10 threads for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] 21

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] Inicialização de atributos da thread 22

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] Criação da thread 23

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] Espera por cada uma das threads, sequencialmente 24

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] Envia identificador da thread e endereço no qual será armazenado ponteiro de retorno 25

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] Ponteiro para ponteiro deve ser passado como void** 26

#define NTHREADS 10 int main(void) { int inputvalues[nthreads]; static pthread_t threads[nthreads]; pthread_attr_t attributes[nthreads]; int *returnvalues[nthreads]; int i; Vejam o código disponível no site! Reparem que o Makefile precisa chamar -pthread for (i = 0; i < NTHREADS; i++){ pthread_attr_init(&attributes[i]); inputvalues[i] = i; pthread_create(&threads[i],&attributes[i], go, &inputvalues[i]); for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); printf("main thread is done.\n"); return 0; Adaptado de [1] 27

Possível saída do código anterior Hello from thread 1 Hello from thread 0 Hello from thread 7 Hello from thread 2 Hello from thread 4 Hello from thread 5 Hello from thread 6 Hello from thread 8 Hello from thread 3 Hello from thread 9 Thread 0 returned with 100 Thread 1 returned with 101 Thread 2 returned with 102 Thread 3 returned with 103 Thread 4 returned with 104 Thread 5 returned with 105 Thread 6 returned with 106 Thread 7 returned with 107 Thread 8 returned with 108 Thread 9 returned with 109 Main thread is done. 28

Possível saída do código anterior Hello from thread 1 Hello from thread 0 Hello from thread 7 Hello from thread 2 Hello from thread 4 Hello from thread 5 Hello from thread 6 Hello from thread 8 Hello from thread 3 Hello from thread 9 Thread 0 returned with 100 Thread 1 returned with 101 Thread 2 returned with 102 Thread 3 returned with 103 Thread 4 returned with 104 Thread 5 returned with 105 Thread 6 returned with 106 Thread 7 returned with 107 Thread 8 returned with 108 Thread 9 returned with 109 Main thread is done. for (i = 0; i < NTHREADS; i++){ pthread_join(threads[i],(void**)&returnvalues[i]); printf("thread %d returned with %d\n", i, *returnvalues[i]); Programa detecta finalização das threads na ordem do seu índice 29

Possível saída do código anterior Hello from thread 1 Hello from thread 0 Hello from thread 7 Hello from thread 2 Hello from thread 4 Hello from thread 5 Hello from thread 6 Hello from thread 8 Hello from thread 3 Hello from thread 9 Thread 0 returned with 100 Thread 1 returned with 101 Thread 2 returned with 102 Thread 3 returned with 103 Thread 4 returned with 104 Thread 5 returned with 105 Thread 6 returned with 106 Thread 7 returned with 107 Thread 8 returned with 108 Thread 9 returned with 109 Main thread is done. Execução das threads não necessariamente segue a ordem. Por quê? 30

Possível saída do código anterior Hello from thread 1 Hello from thread 0 Hello from thread 7 Hello from thread 2 Hello from thread 4 Hello from thread 5 Hello from thread 6 Hello from thread 8 Hello from thread 3 Hello from thread 9 Thread 0 returned with 100 Thread 1 returned with 101 Thread 2 returned with 102 Thread 3 returned with 103 Thread 4 returned with 104 Thread 5 returned with 105 Thread 6 returned with 106 Thread 7 returned with 107 Thread 8 returned with 108 Thread 9 returned with 109 Main thread is done. 1-Não há garantia que as threads serão escalonadas na ordem que são criadas 2-Mesmo que seja escalonada na ordem que é criada, thread pode ser interrompida antes de imprimir, dando lugar a outra thread. 31

Uma outra possível saída Hello from thread 0 Hello from thread 1 Hello from thread 2 Hello from thread 3 Hello from thread 4 Hello from thread 5 Hello from thread 6 Thread 0 returned with 100 Hello from thread 8 Hello from thread 9 Thread 1 returned with 101 Thread 2 returned with 102 Hello from thread 7 Thread 3 returned with 103 Thread 4 returned with 104 Thread 5 returned with 105 Thread 6 returned with 106 Thread 7 returned with 107 Thread 8 returned with 108 Thread 9 returned with 109 Main thread done. Thread 0 finalizou antes mesmo das threads 7,8 e 9 imprimirem 32

Uma outra possível saída Hello from thread 0 Hello from thread 1 Hello from thread 2 Hello from thread 3 Hello from thread 4 Hello from thread 5 Hello from thread 6 Thread 0 returned with 100 Hello from thread 8 Hello from thread 9 Thread 1 returned with 101 Thread 2 returned with 102 Hello from thread 7 Thread 3 returned with 103 Thread 4 returned with 104 Thread 5 returned with 105 Thread 6 returned with 106 Thread 7 returned with 107 Thread 8 returned with 108 Thread 9 returned with 109 Main thread done. Thread 0 finalizou antes mesmo das threads 7,8 e 9 imprimirem 33

Thread Control Block (TCB) Análogo ao PCB para processos Armazenada estado e metadados relacionados a uma thread Um PCB aponta para múltiplos TCBs 34

Estruturas de dados da thread 35

Ciclo de vida da thread 36

Material Utilizado [1] Livro Operating Systems: Principles & Practice Thomas Anderson e Michael Dahlin [2] Livro Fundamentos de Sistemas Operacionais. Editora LTC. 2015. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. 37