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

Documentos relacionados
Trabalhando com Processos e Threads em Ambiente LINUX

Programando com Threads em C

Pthreads. O que são threads? Mario João Junior. Uma thread é um fluxo de execução de instruções que pode ser escalonado pelo sistema operacional.

as alterações feitas por um thread num recurso partilhado (ex: fechar um ficheiro) serão "vistaa" pelos outros threads.

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

Sistemas Operacionais II

Linguagem de Programação I

Fluxos de Execução. Um programa seqüencial consiste de um único fluxo de execução, o qual realiza uma certa tarefa computacional.

Na Aula Anterior... O Conceito de Threads

tutorial. man fork man pthread_create man pthread_join man wait man sleep

Threads

Threads. Fluxos de Execução. Exemplos de Programas MT (1) Exemplos de Programas MT (2)

EEL770 Sistemas Operacionais

Sistemas Operacionais

Programação concorrente usando threads POSIX e Java

Threads

Ferramentas para Programação em Processadores Multi-Core

MÓDULO 02 PROCESSOS E THREADS PROCESSOS e THREADS

Programação com Posix Threads

Programação de Sistemas

OO Engenharia Eletrônica

LABORATÓRIO SISTEMAS OPERACIONAIS

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

Subprogramas. Prof. Carlos Lopes

Sistemas de Computação. Threads e Sincronização

Material sobre Funções AEDS 1

LABORATÓRIO SISTEMAS DE TEMPO REAL

Programação de Sistemas

Arquitetura de Computadores Sistemas Operacionais II

Eventos. Rotinas Assíncronas

Programação de Sistemas Carris

Introdução a Programação Concorrente. Aula 02. Prof. André Luis Meneses Silva

Threads. threads em Linux Taisy Weber

Programação com Pthreads

Algoritmos e Estruturas de Dados I (DCC/003) Funções

POSIX Threads. Walter Fetter Lages.

Exclusão Mútua (mutex)

Programando com Threads em C

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

Programação de Sistemas Array Sistólico

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

Sistemas Operacionais

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Sistemas Operacionais I

BC Sistemas Operacionais. Threads. Aula 04 3 Quadrimestre de Prof. Marcelo Z. do Nascimento.

Básico: estrutura de programa, sintaxe Interface com linha de comando

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula

Linguagem C. André Tavares da Silva.

INF 1007 Programação II

#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {

Capítulo 5: Escalonamento da CPU. Operating System Concepts 8th Edition

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Algoritmos e Programação

Linguagem C estruturas de repetição

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Aula 2: Introdução a Linguagem C

Programação de Sistemas Cafetaria

Criação de Processos Fork( ) Exec( )

Sincronização e comunicação entre entidades de processamento. Mutex Volnys Bernal 1. Tópicos. Exclusão Mútua (mutex) Exclusão Mútua (Mutex)

Algoritmos e Técnicas de Programação. Professora: Luciana Faria

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Programação Estruturada

Curso de Programação C em Ambientes Linux Aula 05

Introdução aos Sistemas Operacionais. Threads

Estrutura de Dados I Bacharelado em Sistemas de Informação FACOM UFU Lista de Exercícios

Sistemas Operacionais Aula 07: Scheduling da CPU. Ezequiel R. Zorzal

INF 1620 P1-13/09/02 Questão 1 Nome:

Introdução Arquiteturas Paralelas Programação Paralela Geração de Malhas Particionamento de Malhas (Grafos) Balanceamento de Carga

Algoritmos e Estruturas de Dados I. Funções. Pedro Olmo Stancioli Vaz de Melo

Programação Sistemas

Sistemas Operacionais

ESTRUTURA DE DADOS (TCC )

Funções em Linguagem C Parte II

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

1ª Lista de Exercícios

Carlos Eduardo Batista Centro de Informática - UFPB

Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função.

Linguagem e Técnicas de Programação

SISTEMAS OPERATIVOS I

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Sub-rotinas David Déharbe

DAS5102 Fundamentos da Estrutura da Informação

Sistemas Operacionais

Gilberto A. S. Segundo. 24 de agosto de 2011

Introdução à Programação Aula 07. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

10 Comandos de repetição

Estruturas de Repetição

Algoritmos e Programação

Argumentos da linha de comando Exemplos Recursividade de funções Exemplos

OO Engenharia Eletrônica

Modularidade - Funções e Procedimentos

Aula 10: Funções (Parte III)

Acadêmico: Subprogramação (funções)

prim = A ; prim = &A[0];

ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

PROCESSOS. Prof. Maicon A. Sartin

Transcrição:

Universidade Federal do ABC Disciplina: BC 1518 Sistemas Operacionais (SO) Prática: Threads Atividade 3 Threads em Ambiente LINUX Objetivo Estudo e testes com a biblioteca pthreads Threads Como vimos em aula teórica, um único processo podemos ter vários fluxos escalonáveis de execução, que compartilham uma mesma área de código e dados, mas cada qual tem de forma independente seu próprio contexto, pilha e program counter (PC). Nesse item, faremos uso da biblioteca conhecida como POSIX Threads ou popularmente pthreads. Todo programa em C que usa pthreads deve incluir o cabelhaço pthreads #include <pthread.h> no início do arquivo. Para compilar os programas construídos em linguagem C, você deve digitar gcc -o nome_do_aplicativo nome_do_programa.c. Se estiver trabalhando com a biblioteca pthread deve incluir -lpthread na compilação. 1.Criando e terminando um thread O padrão PThreads exige que funções que serão chamadas para a criação de novas threads possuam uma assinatura específica void* (void *). A função a ser executada precisa obrigatoriamente retornar um ponteiro genérico e receber como parâmetro de entrada um ponteiro genérico. O parâmetro de entrada pode ser usado para passar um dado qualquer para a nova thread. Para criar uma thread usa-se a função pthread_create(*t,*a, rotina, arg), onde os argumentos são: t é um ponteiro para uma variável do tipo pthread_t que conterá o identificador da thread recém criada; a é um ponteiro para os atributos da thread. Os atributos são armazenados em uma variável do tipo pthread_attr_t. Um valor NULL indica o uso de valores default. Para detalhes veja pthread_attr_init. rotina é o nome (ponteiro) para a rotina (função) que define o comportamento da thread. arg é um void * que é passado como argumento para a rotina. Recomendo executar "man pthread_create" e dar uma breve lida. 1. #include <stdio.h> 2. #include <pthread.h> 3. 4. void *OLA(void *argumentos) { Exemplo 1 1

5. printf("\nolá UFABC... BEM VINDO : )\n\n"); 6. 7. 8. int main ( ) { 9. pthread_t thread; 10. int flag, i; 11. 12. printf("criar uma nova thread\n"); 13. flag = pthread_create(&thread, NULL, OLA, NULL); 14. 15. if (flag!=0) 16. printf("erro na criação da thread\n"); 17. pthread_exit(null); 18. return 0; 19. A chamada à função pthread_exit() provoca a finalização da thread e a libertação dos recursos que estava utilizando. Escreva programa do exemplo 1. Compile o programa (gcc -o thread thread.c -lpthread ) e depois execute-o. Quantos threads são criados. Quantas mensagens aparecem na tela? 2. Esperando as threads A função rotina pthread_join() permite que uma thread espere pela finalização de de uma thread específica. Exemplo 2 1. #include <stdio.h> 2. #include <pthread.h> 3. #define NUM_THREADS 10 4. 5. void *imprime(void *argumentos){ 6. printf("\nufabc...bc1518\n\n"); 7. 8. 9. int main (){ 10. pthread_t threads[num_threads]; 11. int i; 12. 13. for(i=0;i < NUM_THREADS;i++) 14. pthread_create(&threads[i], NULL, imprime, NULL); 15. 16. printf("espera a finalização das threads criadas \n"); 17. 18. for(i=0;i < NUM_THREADS;i++) 19. pthread_join(threads[i],null); 20. 21. return 0; 22. Compile o programa e depois execute-o. Quantos threads são criados. Quantas mensagens aparecem na tela? 2

3. Passagem de Argumentos para threads A rotina pthread_create() permite passar argumentos a função de um thread: pthread_create(&threads[i], NULL, funcao, &i). 1. void *imprime ( void * argumentos ){ 2. int valor =* (int *) argumentos; 3. printf("valor: %d \t", valor ); 4. Crie um novo programa e utilize a passagem de parâmetro. Utilize o valor da variável da estrutura de repetição para passagem de parâmetro. Compile o programa e depois execute-o. Quantos threads são criados? 4. O uso de Fork versus pthreads Linux. O programa abaixo mostra o uso da biblioteca Pthread para empregadas em sistema 1. #include <pthread.h> 2. #include <stdio.h> 3. #include <stdlib.h> 4. 5. #define NTHREADS 500 6. 7. void *do_nothing(void *null) { 8. int i; 9. i=0; 10. pthread_exit(null); 11. 12. 13. int main(int argc, char *argv[]) { 14. int rc, i, j, detachstate; 15. pthread_t tid; 16. pthread_attr_t attr; 17. 18. pthread_attr_init(&attr); 19. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 20. 21. for (j=0; j<nthreads; j++) { 22. rc = pthread_create(&tid, &attr, do_nothing, NULL); 23. if (rc) { 24. printf("error; return code from pthread_create() is %d\n", rc); 25. exit(-1); 26. 27. 28. /* Wait for the thread */ 29. rc = pthread_join(tid, NULL); 30. if (rc) { 31. printf("error; return code from pthread_join() is %d\n", rc); 32. exit(-1); 33. 34. 35. 36. pthread_attr_destroy(&attr); 37. pthread_exit(null); 38. 39. 3

Programa para criação de processos com a Pthread. Construa um programa em linguagem C para execução do código acima. Responda as questões: a) Execute o programa com valor da variável NTHREADS = 500. Avalie o tempo total de processamento. Repita o experimento 10 vezes e calcule o tempo médio de processamento. Para obter o tempo de processamento no Linux, utilize o comando time. Exemplo: $ time./fork b) Repita o item a) para NTHREADS = 5000 e 50000. c) Utilize a atividade 2 (exercício 3) e faça uma comparação de desempenho entre o fork e threads. 4. Exercícios 4.1 - Construa um programa em C que calcule e imprima a soma dos N primeiros números naturais. O usuário deve entrar com o valor numérico. Construa uma função que calcule a soma e utilize threads para realizar essa operação. 4.2 - Para avaliar o comportamento multithreading, implemente o programa abaixo. Uma vez executado faça a experiência de remover a linha de código error = pthread_join(tid,null); e avalie novamente comportamento do programa. Em seguida, repita o procedimento mas substitua o código supracitado por error = pthread_detach(tid,null). O que ocorre se modificarmos o valor da função sleep para 10. Utilieza a chamada time para capturar o tempo de execução. Por exemplo: $ time./thread. #include <stdio.h> #include <pthread.h> int count = 0; void work(void) { pthread_t tid; tid = pthread_self(); printf("i am a worker thread %d - count = %d\n", (int) tid, count++); sleep(1); int main() { int error,i,n; pthread_t tid,mytid; printf("enter number of threads: "); scanf("%d",&n); mytid = pthread_self(); 4

printf("thread %d is creating threads\n",(int) mytid); for (i=1;i<=n;i++) { error = pthread_create(&tid, NULL,(void *(*)(void *))work, NULL); printf("created thread %d\n",(int) tid); error = pthread_join(tid,null); printf("done forking and joining threads\n"); return 0; 5