Repositório voltado para a implementação de códigos avançados em C, com base no estudo de sistemas operacionais Assuntos abordados:
-
Nesta parte é estudado um pouco do multiprocessamento que ocorre nas máquinas do nosso dia a dia, e como podemos fazer proveito disto.
O multiprocessamento tem suas vantagens e desvantagens,que podem afetar no resultado final, as nossas thread, podem dividir a mesma variável ou variáveis, ou um trecho de código pode ser semelhante para ambas threads.
Veja, algumas notações:-
Condição de corrida:
Quando dois ou mais processos precisam acessar um recurso em comum.
-
Seção crítica :
Região de código acessada por mais de um processo.
-
Exclusão mútua:
Quando garantimos que um único processo, seja ele leve ou pesado, possa acessar a seção crítica. Ou seja, quando a entrada de um processo na seção crítica, bloqueia a entrada de quaisquer outro processo.
Um dos métodos mais utilizados e aqui apresentado, são os semáforos. Utilizamos a biblioteca
dijkstra.h
aqui incluida.Os semáforos, garantem a exclusão mútua, evitando que outros processos acessem uma seção crítica.
Vejamos a documentação de cada função:-
sem_create_d(key_t key, int initval)
:cria um semáforo, o primeiro paramêtrokey
representa o uma chave única que identifica o semáforo para S.O., o segundo paramêtro indica qual o valor inicial do meu semáforo, logo, se quisermos garantir exclusão mútua, inserimos o valor 1, para oinitval
.Eventuais erros: Lembre-se, o key deve ser um valor único para cada semáforo, caso existam dois semáforos com a mesma chave, seu código pode não funcionar da maneira esperada.
-
wait_d(int semid)
: decrementa o valor do semáforo e verifica o valor daquele semáforo. Logo, um semáforo que começa com oinitval = 1
a função decrementa o valor do semafóro, e agora aquele semáforo agora tem o valor 0, Mas além de decrementar o valor ele verifica o valor do semafóro, caso o valor dele, seja menor ou igual a 0, aquele processo entra em estado de bloqueado. Desta forma podemos garantir exclusão mútua. -
signal_d(int semid)
: incrementa o valor do semáforo, e libera a seção crítica que estava sendo utilizada. Logo, quando o processo termina de executar a seção crítica ele incrementa o valor do semáforo. -
sem_delete(int semid)
: exclui um semáforo do SO.
-
Condição de corrida: