Thread em C - O que é e Para que Serve

Nesse tutorial sobre nosso estudo de Programação de Sistemas Operacionais, iremos aprender um dos conceitos mais importantes e usados, não só em SO's, como em diversos softwares de nosso dia-a-dia, usados em várias linguagens de programação, que é a ferramenta thread.

Iremos aprender o que é uma thread, para que serve, onde é usada e como programar em C usando threads.

Processos e Threads

Quando estudamos processos em C, vimos o poder e flexibilidade que estes tem, permitindo que programadores façam uso da CPU de modo que pareça que existe a execução paralela de vários processos ao mesmo tempo, quando na verdade ocorre um chaveamento de processos de modo que CPU execute apenas um por vez.

Através de diversas chamadas de sistemas, que tem a função de 'pedir favores' de baixo nível ao Sistema Operacional, aprendemos como criar e gerenciar processos em C.

Vimos que processos são identidades bem 'independentes', cada uma com sua memória, variáveis e estados, onde chegamos até a estudar Pipes para comunicação entre processos. Os processos possuem outras maneiras para se comunicarem, como através do uso de messages queues e shared memory.

Ou seja, processos são poderosos e independentes, porém são um pouco complexos e devemos ter bastante cuidado ao trabalharmos com processos, principalmente por conta da disputa de processos e do uso da região crítica.

Porém, nem sempre esse poder e independência são necessários, muito menos a complexidade.
As vezes queremos que processos tratem de um mesmo objetivo, de um mesmo trabalho para obter um determinado resultado.

É aí que entram as threads, que são, digamos, 'mini processos'.








Thread - O que é e Para que serve

Podemos ver as threads como pequenos processos.
A grande diferença das threads é que elas compartilham os mesmos recursos e endereçamento de memória.

Ou seja, é como se tivéssemos um processo que dividido em processos menores, onde há um chaveamento entre eles, cada um executando um pouco (como ocorria nos processos), mas agora eles compartilham os mesmos dados e recursos, e tem um mesmo objetivo, trabalham juntos.

Diferente dos processos, que são mais usados para rodar coisas diferentes, programas diferentes.
As threads são 'programinhas' que são executados de forma pseudo-paralela, de modo que o trabalho dessas threads formem o trabalho maior, de rodar um programa.

Um belo exemplo do uso de threads é o de um editor de textos, como o Microsoft Word.
Tem uma thread que fica esperando você digitar algumas teclas e exibir na tela.
Outra fica checando se as palavras que você escreveu estão corretas.
Enquanto isso, uma thread salva automaticamente eu arquivo de tempos em tempos, para que você não o perca.
E caso seu Word seja pirata, vai aparecer uma thread com uma janelinha chata, pedindo para você registrar seu software ;)

Ou seja, temos um programa maior rodando: o editor de textos.
Em vez de ter um processo só fazendo tudo, temos vários mini processos, as threads, fazendo várias coisas ao mesmo tempo. Mas elas compartilham os mesmos recursos, o mesmo texto, o mesmo arquivo e tem uma função em comum: todas trabalham para que o editor de textos rode.

Os processos são mais independentes...um processo roda o editor de texto, outro processo toca uma mp3, outro gerencia a memória RAM, etc etc.










Vantagens das Threads

Como dissemos, as threads são mini processos. Assim, é óbvio de se esperar que elas sejam mais simples de serem usadas, e de fato são.

Diferente dos processos, não temos que nos preocupar de usar pipes ou outro meio para trocar informações: as threads já são interligadas, todas pertencem ao mesmo processo.

Nos sistemas operacionais, e programas, de hoje, usar threads não é bom. É praticamente obrigatório.
Mesmo que sua conexão caia, seu browser ainda funciona, você pode ficar lendo um site ou um jogando um game enquanto a conexão volta.

Do ponto de vista de desempenho (vital para sistemas operacionais), as threads são beeeem mais rápidas que os processos, tanto sua criação, execução como o ator de matar uma thread.

Em rotinas em que há processamento e a entrada e saída de dados, as threads se mostram vitais, pois enquanto um programa realiza seus cálculos através de uma thread, outra fica responsável por receber ou enviar dados, não precisa esperar uma coisa terminar para fazer outra.

O uso de threads, sem dúvidas, revolucionou o mundo e permitiu que os sistemas operacionais ficassem bem mais eficientes, e a maior conquista disso foi a redução da ociosidade, pois agora uma CPU não precisa ficar parada esperando uma rotina terminar de ser executada para trabalhar, agora ele pode fazer várias coisas ao mesmo tempo, trabalhar através de uma thread enquanto outra thread espera o resultado de outra operação.

Assim, é de extrema importância todo programador saber o que é uma thread, para que serve, quando são usadas e como programar usando threads, que é o que iremos aprender a fazer em nosso próximo tutorial (em linguagem C).

Um comentário:

Anônimo disse...

Ótimo artigo, estou ansioso para ver como isso funciona em c. '-'

Ah coloca o link para esse artigo na categoria Sistemas Operacionais, porque ele só está aparecendo na Home.