SlideShare uma empresa Scribd logo
Introdução ao Grand Central Dispatch
Programação paralela
●   O que é programação paralela?
●   Por que se preocupar com programação
    paralela?
    ●   Melhor aproveitamento dos recursos de hardware;
    ●   Aumento do desempenho das aplicações (nem
        sempre).
Processos e threads
●   Processos: são programas em execução que
    ocupam uma região própria na memória e
    podem ser distribuídos para processadores
    pelo sistema operacional;
●   Threads: são fluxos de execução de um
    mesmo processo que compartilham a região de
    memória do processo.
Processos e threads
●   Criar um novo processo a partir de um
    processo existente consiste em alocar uma
    região nova de memória contendo uma cópia
    do processo criador;
●   Criar uma thread consiste em alocar uma
    pequena região de memória contendo as
    informações da thread, o resto é compartilhado
    com o processo criador.
A libdispatch
A libdispatch
●   Biblioteca criada pela Apple para facilitar a
    utilização    de   multiprocessamento     nas
    aplicações;
●   Abstrai o processo de criação e manutenção de
    threads;
●   “Escreva menos código e faça mais”;
Blocks
●   Extensão da linguagem C criada pela Apple e usada pelo
    GCD para encapsular tarefas.

      typedef void (^UmBlocoVoid)();


      UmBlocoVoid bloco = ^{
           printf("Dentro de um Blockn");
           int i;
           for(i=0;i<100;i++){
                printf("Exemplo %dn", i);
           }
      };
Dispatch Queues
●   São filas para onde as tarefas serão enviadas
    e, uma a uma, retiradas e processadas;
●   O GCD disponibiliza 3 tipos de filas;
    ●   Main Queue (Serial);
    ●   Private Queue (Serial);
    ●   Global Queue (Concorrente);
Dispatch Queues (exemplo)
#include <dispatch/dispatch.h>
.
.
.
    dispatch_queue_t fila1;
    dispatch_queue_t fila2;
    dispatch_queue_t fila3;


    fila1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
        0);
    fila2 = dispatch_queue_create(“queue label”, 0);
    fila3 = dispatch_get_main_queue();
Executando tarefas
●   Tarefas podem ser enviadas para as filas com
    as seguintes funcões:
    ●   dispatch_sync();
    ●   dispatch_async();
    ●   dispatch_apply();
    ●   dispatch_sync_f();
    ●   dispatch_async_f();
    ●   dispatch_apply_f().
Executando tarefas (exemplo)
dispatch_sync(queue, ^{
      // Tarefa para ser processada de maneira síncrona
});


dispatch_async(queue, ^{
      // Tarefa para ser processada de maneira assíncrona
});
Paralelizando loops
●   Iterações de um loop podem ser paralelizadas
    com a função dispatch_apply():

      dispatch_apply(ITERACOES, queue, ^(size_t i){
            // loop
      });
Grupos
●   Permitem bloquear a execução do programa
    para esperar que uma ou mais      threads
    terminem (join);

    dispatch_group_t grupo = dispatch_group_create();
    dispatch_queue_t fila = dispatch_get_global_queue(0, 0);
    dispatch_group_async(grupo, fila, ^{
          // bloco de execução
    });
    dispatch_group_wait(grupo, DISPATCH_TIME_FOREVER);
Semáforos
●   Mecanismo de sincronização que possibilita a
    exclusão mútua e o controle do uso de recursos
    limitados;

    dispatch_semaphore_t sema = dispatch_semaphore_create(1);
    …
    dispatch_async(fila, ^{
          …
          dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
          // Região crítica
          dispatch_semaphore_signal(sema);
    });
Dispatch Sources
●   Mecanismo criado para detectar e processar
    eventos do sistema;
●   Um dispatch source pode substituir os recursos
    nativos de tratamento assíncrono de eventos (poll,
    epoll, kqueue e etc);
●   Um dispatch source permite:
    ●   Criar timers;
    ●   Monitorar sinais enviados pelo sistema;
    ●   Monitorar descritores de arquivos;
    ●   Monitorar processos (exit, fork, exec e etc).
Dispatch Sources (exemplo)
●   Criando um timer:
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_source_t timer = dispatch_source_create(
       DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(timer, 0ull, 1ull * NSEC_PER_SEC,
       1ull * NSEC_PER_SEC);
    dispatch_source_set_event_handler(timer, ^{ printf("Eventon"); });
    dispatch_resume(timer);
Dispatch Sources (exemplo)
●   Criando um leitor de arquivo:
    int f = open("/etc/services", O_RDONLY|O_NONBLOCK);
    dispatch_source_t source =
    dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, f, 0, queue);
    dispatch_source_set_event_handler(source, ^{
          size_t resto = dispatch_source_get_data(source);
          printf("Dados restantes %lun", resto);
          read(f, dados, 1024);
    });
    dispatch_source_set_cancel_handler(source, ^{
          close(f);
    });
    dispatch_resume(source);
Perguntas?
Referências
●   Mac OS forge - http://libdispatch.macosforge.org/
●   Apache GCD MPM - http://libdispatch.macosforge.org/trac/wiki/apache
●   GCD no FreeBSD - http://wiki.freebsd.org/GCD
●   Concurrency Programming Guide -
    http://developer.apple.com/library/mac/#documentation/General/Conceptual/
    ConcurrencyProgrammingGuide/Introduction/Introduction.html
●   Grand Central Dispatch (GCD) Reference -
    http://developer.apple.com/library/mac/#documentation/Performance/Refere
    nce/GCD_libdispatch_Ref/Reference/reference.html
●   Blocks Programming Topics
    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Bl
    ocks/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40007502

Mais conteúdo relacionado

PDF
Definição de processos
PPT
Alocação dinâmica em C
PDF
Invasaocom exploits
PDF
Exercicios 01 02 tms i
PDF
Curso de Java: Introdução a lambda e Streams
PDF
PHP fora da Web
PPT
Pilha ad
PDF
Soa#cap4.1 gestor de pacotes
Definição de processos
Alocação dinâmica em C
Invasaocom exploits
Exercicios 01 02 tms i
Curso de Java: Introdução a lambda e Streams
PHP fora da Web
Pilha ad
Soa#cap4.1 gestor de pacotes

Mais procurados (20)

PDF
Cap1 exercicios comandos linux resolucao part i
PDF
Threads 09: Paralelismo
PPTX
Programação funcional no dia a dia
PDF
Python e Linux para a criação de ferramentas para pentest
PDF
Sistemas operacionais1
PPT
Aula Simulação por Eventos Discretos
PPTX
Aplicando o poder de uma GPU no SQL Server
PDF
Threads 07: Sincronizadores
PDF
Linguagens de Script: Caso de Estudo Lua
PDF
PDF
Atualização Java 8 (2014)
PDF
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
PDF
Introdução à biblioteca OpenCV
PPTX
ESTRUTURA DE DADOS (JAVA) AULA 09
PDF
Threads 10: CompletableFuture
ODP
OpenSolaris a Céu Aberto
PDF
Introdução ao Processamento Paralelo (2)
ODP
Palestra2009
PDF
Apresentação Lua
PDF
Comparação Sintaxe Portugol vs Java
Cap1 exercicios comandos linux resolucao part i
Threads 09: Paralelismo
Programação funcional no dia a dia
Python e Linux para a criação de ferramentas para pentest
Sistemas operacionais1
Aula Simulação por Eventos Discretos
Aplicando o poder de uma GPU no SQL Server
Threads 07: Sincronizadores
Linguagens de Script: Caso de Estudo Lua
Atualização Java 8 (2014)
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
Introdução à biblioteca OpenCV
ESTRUTURA DE DADOS (JAVA) AULA 09
Threads 10: CompletableFuture
OpenSolaris a Céu Aberto
Introdução ao Processamento Paralelo (2)
Palestra2009
Apresentação Lua
Comparação Sintaxe Portugol vs Java
Anúncio

Destaque (9)

PDF
Introdução ao LaTeX
PDF
Platinum Arts Sandbox - Game Maker
PDF
Desenvolvimento de jogos para iOS com Cocos2d
PDF
Linux de A a Z
PDF
Linguagem Go
PDF
Apresentando o FreeBSD
PDF
ZFS – Zettabyte File System
PPT
PDF
Apresentando o FreeBSD
Introdução ao LaTeX
Platinum Arts Sandbox - Game Maker
Desenvolvimento de jogos para iOS com Cocos2d
Linux de A a Z
Linguagem Go
Apresentando o FreeBSD
ZFS – Zettabyte File System
Apresentando o FreeBSD
Anúncio

Semelhante a Introdução ao processamento paralelo com o Grand Central Dispatch (20)

PPT
Gerências de Processos: Threads
PDF
Processos e threads cap 02 (i unidade)
PDF
Aula sobre multithreading
PDF
Curso openmp
PDF
Mini-curso Programação Paralela e Distribuída
PDF
Apresentacao Aula04 So
PPTX
SO - Integrado - Aula 02 - Processos e Threads.pptx
PPT
Gerência de Processos: Processos
PPTX
Coroutine e concorrência python
PPTX
S.o aula 1920
PDF
Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?
PPTX
Lecture 4-Processos e Threads pt mz.pptx
PDF
Programação Concorrente - Objetos e Concorrência
PPT
Concorrência na Linguagem de Programação
PDF
Atps sistemas operacionais
ODP
12 threads
PDF
Kernel cooperativo
PPT
aula2so.ppt
PPTX
Programação de Sistemas Distribuídos - Aula 03
Gerências de Processos: Threads
Processos e threads cap 02 (i unidade)
Aula sobre multithreading
Curso openmp
Mini-curso Programação Paralela e Distribuída
Apresentacao Aula04 So
SO - Integrado - Aula 02 - Processos e Threads.pptx
Gerência de Processos: Processos
Coroutine e concorrência python
S.o aula 1920
Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?
Lecture 4-Processos e Threads pt mz.pptx
Programação Concorrente - Objetos e Concorrência
Concorrência na Linguagem de Programação
Atps sistemas operacionais
12 threads
Kernel cooperativo
aula2so.ppt
Programação de Sistemas Distribuídos - Aula 03

Último (8)

PPTX
Mecânico de Manutenção de Equipamentos.pptx
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Arquitetura de computadores - Memórias Secundárias
Mecânico de Manutenção de Equipamentos.pptx
Viasol Energia Solar -Soluções para geração e economia de energia
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Manejo integrado de pragas na cultura do algodão
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Arquitetura de computadores - Memórias Secundárias

Introdução ao processamento paralelo com o Grand Central Dispatch

  • 1. Introdução ao Grand Central Dispatch
  • 2. Programação paralela ● O que é programação paralela? ● Por que se preocupar com programação paralela? ● Melhor aproveitamento dos recursos de hardware; ● Aumento do desempenho das aplicações (nem sempre).
  • 3. Processos e threads ● Processos: são programas em execução que ocupam uma região própria na memória e podem ser distribuídos para processadores pelo sistema operacional; ● Threads: são fluxos de execução de um mesmo processo que compartilham a região de memória do processo.
  • 4. Processos e threads ● Criar um novo processo a partir de um processo existente consiste em alocar uma região nova de memória contendo uma cópia do processo criador; ● Criar uma thread consiste em alocar uma pequena região de memória contendo as informações da thread, o resto é compartilhado com o processo criador.
  • 6. A libdispatch ● Biblioteca criada pela Apple para facilitar a utilização de multiprocessamento nas aplicações; ● Abstrai o processo de criação e manutenção de threads; ● “Escreva menos código e faça mais”;
  • 7. Blocks ● Extensão da linguagem C criada pela Apple e usada pelo GCD para encapsular tarefas. typedef void (^UmBlocoVoid)(); UmBlocoVoid bloco = ^{ printf("Dentro de um Blockn"); int i; for(i=0;i<100;i++){ printf("Exemplo %dn", i); } };
  • 8. Dispatch Queues ● São filas para onde as tarefas serão enviadas e, uma a uma, retiradas e processadas; ● O GCD disponibiliza 3 tipos de filas; ● Main Queue (Serial); ● Private Queue (Serial); ● Global Queue (Concorrente);
  • 9. Dispatch Queues (exemplo) #include <dispatch/dispatch.h> . . . dispatch_queue_t fila1; dispatch_queue_t fila2; dispatch_queue_t fila3; fila1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); fila2 = dispatch_queue_create(“queue label”, 0); fila3 = dispatch_get_main_queue();
  • 10. Executando tarefas ● Tarefas podem ser enviadas para as filas com as seguintes funcões: ● dispatch_sync(); ● dispatch_async(); ● dispatch_apply(); ● dispatch_sync_f(); ● dispatch_async_f(); ● dispatch_apply_f().
  • 11. Executando tarefas (exemplo) dispatch_sync(queue, ^{ // Tarefa para ser processada de maneira síncrona }); dispatch_async(queue, ^{ // Tarefa para ser processada de maneira assíncrona });
  • 12. Paralelizando loops ● Iterações de um loop podem ser paralelizadas com a função dispatch_apply(): dispatch_apply(ITERACOES, queue, ^(size_t i){ // loop });
  • 13. Grupos ● Permitem bloquear a execução do programa para esperar que uma ou mais threads terminem (join); dispatch_group_t grupo = dispatch_group_create(); dispatch_queue_t fila = dispatch_get_global_queue(0, 0); dispatch_group_async(grupo, fila, ^{ // bloco de execução }); dispatch_group_wait(grupo, DISPATCH_TIME_FOREVER);
  • 14. Semáforos ● Mecanismo de sincronização que possibilita a exclusão mútua e o controle do uso de recursos limitados; dispatch_semaphore_t sema = dispatch_semaphore_create(1); … dispatch_async(fila, ^{ … dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // Região crítica dispatch_semaphore_signal(sema); });
  • 15. Dispatch Sources ● Mecanismo criado para detectar e processar eventos do sistema; ● Um dispatch source pode substituir os recursos nativos de tratamento assíncrono de eventos (poll, epoll, kqueue e etc); ● Um dispatch source permite: ● Criar timers; ● Monitorar sinais enviados pelo sistema; ● Monitorar descritores de arquivos; ● Monitorar processos (exit, fork, exec e etc).
  • 16. Dispatch Sources (exemplo) ● Criando um timer: dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_source_t timer = dispatch_source_create( DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(timer, 0ull, 1ull * NSEC_PER_SEC, 1ull * NSEC_PER_SEC); dispatch_source_set_event_handler(timer, ^{ printf("Eventon"); }); dispatch_resume(timer);
  • 17. Dispatch Sources (exemplo) ● Criando um leitor de arquivo: int f = open("/etc/services", O_RDONLY|O_NONBLOCK); dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, f, 0, queue); dispatch_source_set_event_handler(source, ^{ size_t resto = dispatch_source_get_data(source); printf("Dados restantes %lun", resto); read(f, dados, 1024); }); dispatch_source_set_cancel_handler(source, ^{ close(f); }); dispatch_resume(source);
  • 19. Referências ● Mac OS forge - http://libdispatch.macosforge.org/ ● Apache GCD MPM - http://libdispatch.macosforge.org/trac/wiki/apache ● GCD no FreeBSD - http://wiki.freebsd.org/GCD ● Concurrency Programming Guide - http://developer.apple.com/library/mac/#documentation/General/Conceptual/ ConcurrencyProgrammingGuide/Introduction/Introduction.html ● Grand Central Dispatch (GCD) Reference - http://developer.apple.com/library/mac/#documentation/Performance/Refere nce/GCD_libdispatch_Ref/Reference/reference.html ● Blocks Programming Topics http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Bl ocks/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40007502