concorrencia101
  • Introdução
  • First things first
  • Agradecimentos
  • Parte I - Concorrência no sistema operacional
    • O que é o programa no sistema operacional
    • Escalonador preemptivo de tarefas
    • Uma nota sobre escalonamento cooperativo
    • Propriedades de um processo
    • Clone de processo (forking)
    • Clone leve de processo (thread)
    • Todo processo tem uma thread principal
    • Uma nota sobre paralelismo
    • Principais desafios em cenário de concorrência
      • Race condition
      • Sincronização com locks
      • Modelo de atores
    • E o I/O?
      • Latência de CPU vs Latência de I/O
      • Chamadas bloqueantes
      • Chamadas não-bloqueantes
      • Assincronismo e escalonamento cooperativo
    • Vamos colocar em prática...
  • PARTE II - Concorrência em diferentes linguagens
    • Definindo ambientes de execução
    • Concorrência em C
      • Forking de processos
      • Threads
      • Race condition e sincronização de threads com mutex
      • Desafios com o uso de threads
      • Thread Pool em C
      • Green threads
      • Modelo de Atores
      • Trabalhando com I/O
    • Concorrência em Ruby
      • Forking de processos
      • Threads
      • Race condition, YARV, GVL e paralelismo em Ruby
      • Modelo de Atores
      • Trabalhando com I/O
Powered by GitBook
On this page
  • Preâmbulo
  • libc
  • I/O assíncrono
  • Bibliotecas externas
  1. PARTE II - Concorrência em diferentes linguagens

Concorrência em C

PreviousDefinindo ambientes de execuçãoNextForking de processos

Last updated 4 months ago

Para entendermos concorrência, nada melhor do que começar do nível mais baixo, certo?

Calma, não vou falar de Assembly aqui, mas se você quiser entender mais de Assembly, mais especificamente x86, sugiro a leitura da minha saga escrevendo um .

Nesta seção, iremos abordar como a linguagem C resolve os problemas de concorrência trazidos na primeira parte, seja a nível da implementação padrão ou bibliotecas externas.

Preâmbulo

A implementação de C mais amplamente utilizada é o GCC (GNU Compiler Collection), que oferece um conjunto de ferramentas para compilação, otimização e depuração de código. Essa popularidade se deve à sua maturidade, portabilidade e constante evolução, tornando-o o padrão de fato no ecossistema C.

Os exemplos aqui trazidos serão a partir de um Ubuntu 22.04.4 LTS (jammy) com gcc 11.4.0.

$ lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy

$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.

No que diz respeito à concorrência, a linguagem C fornece acesso direto a syscalls do sistema operacional, como fork e clone, que permitem a criação de processos e threads, respectivamente. Mas essas chamadas diretas exigem cuidado na manipulação, já que expõem a complexidade do sistema operacional, tornando o uso muito mais complexo.

libc

Para nossa sorte, a biblioteca padrão de C — frequentemente referida como libc — oferece abstrações de mais alto nível para facilitar o trabalho com concorrência, como a função pthread_create, usada para gerenciar threads de maneira mais simples e segura.

Além disso, a libc fornece mecanismos para lidar com sincronização, como locks (mutexes), permitindo o controle do acesso compartilhado entre threads.

I/O assíncrono

Quando o assunto é I/O assíncrono, não há uma abstração completa na biblioteca padrão, mas syscalls como select ou epoll podem ser utilizadas para monitorar múltiplos descritores de arquivo e implementar loops de eventos personalizados.

Bibliotecas externas

Assim como praticamente toda linguagem de programação, o ecossistema C desenvolveu diversas bibliotecas externas de código aberto (open source) para preencher lacunas que faltam no core da linguagem ou na biblioteca padrão.

Seja no contexto de I/O assíncrono, onde padrões modernos ajudam a abstrair a complexidade das chamadas de sistema, ou no processamento de CPU, onde estratégias como o modelo de atores podem ser aplicadas, o uso de bibliotecas externas é frequentemente desejável ao trabalharmos com C.


Introdução feita, vamos agora aprender a explorar recursos de concorrência em C!

web server em x86