Você está na página 1de 7

Tasks/Processos.

Termos:

Kernel - Kernel é uma palavra inglesa usada na computação para apontar o núcleo do
sistema operacional, como se fosse o “cérebro” de um computador.

Kernel Thread - Usa processos e manipuladores de interrupção, está ligado ao lightweight


process, permitindo certos processos compartilharem recursos.

User Thread - “User” como a própria palavra já diz, vem de usuário, e é usada pelos
programadores para lidar com vários fluxos de controles dentro de um programa, para
controlar um programa que pode ter vários caminhos.

Multithreading - O uso de múltiplas threads dentro de um processo para melhorar a


eficiência e o desempenho, permitindo que várias tarefas sejam executadas
simultaneamente.

Linguagens de programação que suportam multithreading - Java, Python, C++

pedro 2°
Thread Synchronization - A sincronização de threads é um aspecto crucial da programação,
utiliza técnicas e mecanismos para coordenar e controlar o acesso concorrente a recursos
compartilhados entre threads, como o nome diz, é a sincronização das threads, e isso é
usado a fim de evitar condições de corrida e inconsistências de dados.

Tipos de Sincronização de Threads:

Mutex (Mutual Exclusion):


● O Mutex é um mecanismo de sincronização que permite que apenas uma
thread tenha acesso exclusivo a um recurso compartilhado em um
determinado momento.
● É como uma chave que uma thread pega antes de acessar o recurso e libera
quando termina, permitindo que outras threads o acessem.
● Exemplo: Imagine um recurso compartilhado, como um arquivo. Antes de
uma thread modificar o arquivo, ela adquire um mutex exclusivo para ele.
Enquanto ela estiver usando o arquivo, outras threads que tentarem adquirir
o mutex serão bloqueadas até que a thread atual o libere.

Semáforo (Semaphore):
● O semáforo é um contador inteiro que é usado para controlar o acesso
concorrente a um conjunto de recursos.
● Ele pode ser usado para permitir que um número específico de threads
acessem um recurso simultaneamente.
● Exemplo: Suponha que você tenha um conjunto de 5 conexões de banco de
dados disponíveis. Você pode usar um semáforo com um contador inicial de
5 para controlar o acesso a essas conexões. Cada vez que uma thread
adquire uma conexão, o contador do semáforo é decrementado, e quando a
conexão é liberada, o contador é incrementado.

Variável de Condição (Condition Variable):


● As variáveis de condição são usadas para sincronizar o comportamento entre
threads quando uma thread precisa esperar por uma condição específica
antes de prosseguir.
● Elas são frequentemente usadas em conjunto com mutexes para criar
seções críticas condicionais.
● Exemplo: Suponha que você tenha uma fila onde uma thread produtora
insere dados e uma thread consumidora os retira. Se a fila estiver cheia, a
thread produtora precisa esperar até que haja espaço disponível. Uma
variável de condição pode ser usada para sinalizar quando espaço é liberado
na fila.

Thread Safety - Projetar e implementar algoritmos e estruturas de dados de modo que


possam ser usados de forma segura por múltiplas threads simultaneamente, sem causar
resultados inesperados ou corrupção de dados.

Tipos de Thread Safety:

Imutabilidade:
● Isso significa que uma vez que algo é criado, não pode ser alterado. Se algo parece
mudar, na verdade estamos criando uma nova versão em vez de modificar o
original, deixando assim muito mais seguro.
Bloqueio:
● Isso é como uma porta que só pode ser aberta por uma pessoa de cada vez.
Garante que apenas uma thread possa acessar um recurso compartilhado de cada
vez, para evitar bagunça, ou seja, se uma thread acessar um recurso, as outras não
vão poder acessar até que essa thread pare de acessar esse recurso.
Atomicidade:
● Isso significa que uma operação é feita de uma vez só, sem ser interrompida no
meio. Como um movimento único que não pode ser dividido, ou seja, se você
começar a criar uma operação, você tem que ir até o fim, não pode parar e depois
continuar, começou, tem que terminar.

Tipos de Comunicação das threads:

Compartilhamento de Memória:
● É como se todas as pessoas em uma equipe compartilhassem um quadro branco
gigante. Cada pessoa pode escrever ou ler informações nesse quadro para que
todos saibam o que está acontecendo.

Troca de Mensagens:
● É como enviar notas ou cartas para outras pessoas na equipe. Cada pessoa pode
enviar uma mensagem para outra e receber mensagens de volta.

Essas são as formas básicas de comunicação entre threads. É importante que as threads
se comuniquem de forma clara e organizada para garantir que o trabalho em equipe seja
eficiente e que não ocorram problemas de coordenação.

Macroprocesso - O macroprocesso é como a empresa organiza suas principais


atividades para alcançar seus objetivos e missão. Ele inclui as funções organizacionais, que
devem estar alinhadas com os objetivos da empresa. É como se fosse uma lista do que
fazer.

Exemplo: Imagine que você tem uma padaria. Seu macroprocesso seria tudo o que você faz
para fornecer pães frescos aos clientes. Isso inclui comprar ingredientes, assar o pão,
embalar e vender. As funções organizacionais seriam como você organiza sua equipe para
fazer tudo isso de forma eficiente.
Estudo Threads - Faculdade ADS 11/03/24

Introdução.
Os primeiros sistemas operacionais suportavam apenas uma tarefa por processo, o que se
tornou uma complicação quando as aplicações foram se tornando cada vez mais
complexas, por exemplo: um editor de texto geralmente executa várias tarefas
simultaneamente, como formatação, paginação e verificação ortográfica. Essas demandas
demonstraram a necessidade de suportar mais de uma tarefa operando sobre os mesmos
recursos, ou seja, dentro do mesmo processo.

O que é?
Thread, traduzindo para o portugues significa fio ou linha e é uma forma como um
processo/tarefa de um programa de computador é dividido em duas ou mais tarefas que podem
ser executadas de forma simultânea.
O modelo de thread seria um espaço de endereço e múltiplas linhas de controle e de
execução, porém, uma thread compartilha um espaço de endereçamento pertencente a um
processo. As linhas de execução de uma thread compõem a execução de um processo.

Por compartilhar espaço de endereçamento de uma mesma thread, o sistema operacional


tem que criar mecanismos para evitar que haja competição no uso dos espaços de
endereçamento, que pode acarretar em condições de corrida e deadlocks.

Uma condição de corrida ocorre quando o comportamento de um programa depende da


ordem específica em que as operações são executadas concorrentemente. Isso pode levar
a resultados inesperados, inconsistências ou falhas no programa. Condições de corrida
ocorrem quando duas ou mais threads acessam dados compartilhados ao mesmo tempo, e
pelo menos uma delas realiza uma operação de escrita. Já um deadlock é uma situação em
que dois ou mais processos (ou threads) ficam bloqueados indefinidamente, aguardando
uns aos outros para liberar recursos que eles possuem. Isso impede a execução contínua
do programa e requer intervenção externa, como reiniciar o sistema.

Portanto, é crucial projetar e implementar cuidadosamente o uso de threads para garantir


um comportamento correto e eficiente do programa.

Lembrando que um endereço em memória é como o "número da casa" de um local


específico na memória de um computador. Assim como uma casa tem um endereço único
para ser localizada, cada pedaço de informação na memória do computador também tem
um endereço exclusivo. Esse endereço é usado para acessar e manipular os dados
armazenados na memória durante a execução de programas. Em resumo, é uma forma de
identificar onde estão guardadas as informações no computador.

Há outros fatores que podem ser mencionados para se distinguir um processo de um thread
e evidenciar a importância desses para os sistemas operacionais e o gerenciamento de
processos. Dentre eles está o fato de que, para cada processo criado, além da alocação de
recursos, a comunicação entre os processos é essencial para a otimização do tempo. Logo,
há os seguintes mecanismos que servem para realizar o envio de sinais:
● pipe: permite o tráfego unidirecional de informações entre processos e utiliza a
estrutura de dados array com apenas duas posições, que indicam 0 para leitura e 1
para gravação;
● semáforos: servem para testar e incrementar a sincronização de processos;
● troca de mensagens: este também pode ser descrito como uma forma de
sincronização e comunicação entre processos, uma vez que esses podem estar
localizados em outro endereço na memória e, por esse motivo, será mais demorada
a comunicação.

Com isso, é possível dizer que um thread é uma sub-rotina de um programa que é
executado de forma concorrente e assíncrona, portanto, aos processos em execução.
Essas definições de ações de threads devem ser estabelecidas no momento do
planejamento da arquitetura do sistema operacional e são implementadas por
desenvolvedores que associam cada ação de um thread ao respectivo tipo de processo ou
comportamento que o sistema deve ter. Em função dessas características, threads também
passam pelas mesmas mudanças de estados que os processos. Da mesma forma que há o
bloco de controle de processos, há um bloco de controle de threads conhecido como TCB
(Thread Control Block).

O TCB (Bloco de Controle de Tarefa) é responsável por controlar a prioridade e o estado de


execução de threads, além de armazenar informações sobre o estado e contexto de
execução de uma thread específica. Podemos considerar o TCB como uma espécie de
‘cartão de identidade’ que mantém as informações cruciais sobre uma thread, permitindo ao
Sistema Operacional gerenciar e alternar entre diferentes threads de forma eficiente.

Threads também são utilizadas para implementar fluxos de execução dentro do núcleo do
Sistema Operacional, recebendo o nome de threads de núcleo, incluindo atividades internas
do núcleo, como rotinas de drivers de dispositivos ou tarefas de gerência.
A figura abaixo ilustra o conceito de threads de usuário e de núcleo, onde o processo A tem
várias threads, enquanto o processo B é sequencial, ou seja, possui uma única thread.
Para que serve? 1°
O conceito de thread foi criado com o intuito de reduzir o tempo que se leva para criar um
novo processo, que pode ser tanto um monothread ou multithread.
Em resumo, monothread e multithread são execuções de processos em um sistema
operacional, onde um processo Monothread executa apenas uma thread de cada vez, onde
a execução das tarefas ocorre de maneira sequencial, sendo menos eficiente na questão de
aproveitamento de recursos, em comparação com sistemas multithread, que por sua vez é
um sistema que permite a execução simultânea de várias threads, sendo essas threads
unidades independentes de execução dentro de um processo, possibilitando a execução
concorrente de diferentes partes de um programa, melhorando o desempenho e
responsividade de aplicativos. Quando falamos em thread, especialmente em multithreads,
podemos dizer que um processo, ou os seus subprocessos, estão ocupando o mesmo
endereço em memória, reduzindo o tempo de comunicação entre processos.

Quando é necessário?
Sistemas mais recentes e sofisticados usam de forma conjunta processos e threads,
buscando realizar múltiplas tarefas simultaneamente. Algumas situações em que o uso de
threads pode ser benéfico:

● Melhoria de Desempenho: Em operações intensivas, como processamento de dados


ou cálculos complexos, o uso de threads pode acelerar a execução, permitindo que
diferentes partes do código sejam executadas em paralelo.
● Responsividade em Interfaces Gráficas: Em aplicativos com interfaces gráficas de
usuário (GUI), como por exemplo o Word, threads podem ser usados para garantir
que a interface permaneça responsiva enquanto outras tarefas pesadas são
realizadas em segundo plano.
● Processamento Concorrente: Quando há a necessidade de realizar várias tarefas ao
mesmo tempo, como processar várias solicitações de clientes em um servidor,
threads podem ser utilizadas para lidar com cada solicitação simultaneamente.
● Manipulação de Entrada/Saída (I/O): Quando uma aplicação precisa lidar com
operações de entrada/saída, como leitura ou escrita em arquivos ou comunicação de
rede, o uso de threads pode ajudar a evitar bloqueios, permitindo que outras
operações continuem enquanto uma está em espera.

É importante notar que o uso de threads também apresenta desafios, como a necessidade
de sincronização para evitar problemas de concorrência. Portanto, é fundamental considerar
cuidadosamente a utilização de threads em um programa e garantir uma implementação
adequada para evitar possíveis problemas.

Por que existe?


A existência de threads em sistemas operacionais está relacionada a várias necessidades e
objetivos práticos no desenvolvimento de software e na execução eficiente de programas.
A razão fundamental para a existência de threads é possibilitar a execução concorrente de
tarefas dentro de um mesmo programa. Além disso, o uso de threads em sistemas
operacionais oferece diversas vantagens, especialmente em termos de eficiência e
desempenho. Aqui estão algumas das principais vantagens:
● Concorrência - As threads permitem a execução concorrente de várias tarefas em
um processo. Isso é útil para sistemas multitarefa, onde várias operações podem
ocorrer simultaneamente, melhorando a eficiência e a capacidade de resposta do
sistema.
● Responsividade - O uso de threads pode melhorar a responsividade de um sistema,
permitindo que tarefas críticas e de alto impacto sejam executadas em segundo
plano, enquanto a interface do usuário continua a responder a eventos e entradas do
usuário.
● Economia de Recursos - Threads compartilham recursos dentro do mesmo
processo, como espaço de endereçamento e recursos do sistema operacional. Isso
reduz a sobrecarga associada à criação e gerenciamento de múltiplos processos.
● Eficiência de Memória - Como threads compartilham o mesmo espaço de
endereçamento, é mais eficiente em termos de uso de memória do que processos
separados. A comunicação entre threads também pode ser mais fácil e mais rápida
do que a comunicação entre processos.
● Compartilhamento de Dados - Threads podem compartilhar dados diretamente entre
si, simplificando a comunicação e a cooperação entre diferentes partes de um
programa. No entanto, é importante gerenciar cuidadosamente o acesso concorrente
a dados compartilhados para evitar problemas de concorrência.
● Rapidez na Criação e Término - Criar e encerrar threads é geralmente mais rápido
do que criar e encerrar processos, o que pode ser vantajoso em situações onde a
agilidade é crucial.
● Desempenho em Sistemas Multiprocessador - Em sistemas com múltiplos
processadores, threads podem ser executadas em paralelo, aproveitando os
recursos de hardware disponíveis e melhorando o desempenho global do sistema.
● Escalonamento Eficiente - O escalonamento de threads é geralmente mais eficiente
do que o escalonamento de processos, uma vez que menos contexto de execução
precisa ser trocado.
● Facilidade de Programação - Muitos programadores acham mais fácil trabalhar com
threads do que com processos separados, já que compartilham o mesmo espaço de
endereçamento e recursos, simplificando a comunicação e a sincronização.

Conclusão 3°
Em resumo, o uso de threads em sistemas operacionais oferece flexibilidade, melhora o
desempenho, permite a execução concorrente de tarefas e contribui para uma melhor
utilização dos recursos do sistema, desempenhando um papel fundamental na otimização
dos sistemas. No entanto, é crucial ter em mente os desafios associados à sincronização e
à comunicação entre threads para evitar problemas de concorrência e garantir a
consistência dos dados. Por último, as threads oferecem uma poderosa ferramenta para os
desenvolvedores de sistemas, permitindo a criação de aplicativos mais rápidos, responsivos
e escaláveis em uma variedade de plataformas e ambientes operacionais.

Você também pode gostar