Compartilhamento de tecnologia

OS_Synchronization e exclusão mútua

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

04/07/2024: Sincronização do sistema operacional e notas de estudo de exclusão mútua


Processos ou programas simultâneos perderão seu fechamento quando executados. Ou seja, se dois programas utilizarem um recurso compartilhado em áreas separadas, os resultados de cada execução poderão ser diferentes.
Insira a descrição da imagem aqui
A razão é que não protegemos o recurso compartilhado x que tanto o programa a quanto o programa b precisam acessar.


9.1 Conceitos básicos de sincronização e exclusão mútua

9.1.1 Relacionamento de sincronização

O relacionamento mutuamente restritivo é a sincronização. Uma compreensão simples da sincronização é que deve haver uma ordem na execução dos processos.
Insira a descrição da imagem aqui


9.1.2 Relacionamento mutuamente exclusivo

O relacionamento que se restringe indiretamente é chamado de relacionamento mutuamente exclusivo, por exemplo, impressora.
Insira a descrição da imagem aqui


9.1.3 Recursos críticos

  • Recursos que apenas um processo tem permissão para acessar dentro de um período de tempo são chamados de recursos críticos (ou recursos exclusivos).
  • Para o compartilhamento de recursos críticos, a exclusão mútua deve ser utilizada entre processos

“Modelo Produtor e Consumidor”
Insira a descrição da imagem aquicontador+ +

首先把变量放到寄存器里面
register1 = counter;
接下来对寄存器进行一个自增
register1 = register1 + 1;
再把结果返回到counter里
counter = register1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

contador- -

首先把变量放到寄存器里面
register2 = counter;
接下来对寄存器进行一个自减
register2 = register2 - 1;
再把结果返回到counter里
counter = register2;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Insira a descrição da imagem aqui

Solução: trate o contador como um recurso crítico e permita que o processo acesse a variável contador mutuamente (você aprenderá o mecanismo de sincronização mais tarde)


9.1.4 Seção crítica

Quer se trate de um recurso crítico de hardware ou de software, vários processos devem acessá-lo mutuamente.
Insira a descrição da imagem aqui
Essas áreas são essencialmente códigos

  • Área de entrada
  • seção Crítica
  • Área de saída
  • área restante

9.1.5 Os mecanismos de sincronização devem seguir regras

  • Livre para deixar entrar

Quando nenhum processo está na seção crítica, isso indica que os recursos da seção crítica estão ociosos. Um processo que solicita a entrada na seção crítica deve ter permissão para entrar imediatamente em sua própria seção crítica para utilizar os recursos de maneira eficaz.

  • Se você estiver ocupado, espere

Quando um processo existente entra na seção crítica, indica que o recurso crítico está sendo acessado. Portanto, outros processos que tentam entrar na seção crítica devem esperar para garantir acesso mutuamente exclusivo ao recurso crítico.

  • espera limitada

Para processos que requerem acesso a recursos críticos, devem garantir que podem entrar na sua própria secção crítica dentro de um tempo limitado para evitar cair num estado de “espera para morrer”.

  • ceda e espere

Quando um processo não consegue entrar em sua própria seção crítica, o processador (CPU) deve ser liberado imediatamente para evitar que o processo caia no estado de "espera ocupada".


9.2 Mecanismo de sincronização de software

9.2.1 Método de marca única

  • Defina uma variável inteira pública para indicar se existe um processo na seção crítica. Se já houver um processo na seção crítica, ele aguardará uma verificação de loop na área de entrada. será modificado na área de saída.
  • O método de sinalização única define uma variável pública inteira turn para indicar o número do processo que tem permissão para entrar na seção crítica. Quando turn=0, o processo P0 tem permissão para entrar na seção crítica.
  • Quando turn=1, o processo P1 pode entrar na seção crítica, e ao sair da seção crítica, o direito de usar a seção crítica é dado a outro processo (quando Pi sai da seção crítica, deixe turn=j)

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
两个进程必须交替进入临界区,若一个进程不再进入临界区,则另一个进程也无法进入临界区,违背了“空闲让进”准则


9.2.2 Método de primeira verificação com marca dupla

O método de primeira verificação de sinalização dupla define um sinalizador de matriz booleana[2] para marcar a disposição de cada processo de entrar na seção crítica sinalizador[i]=true significa que Pi deseja entrar na seção crítica.

  • Antes de Pi entrar na seção crítica, primeiro verifique se a outra parte entrou na seção crítica. Em caso afirmativo, espere.
  • Caso contrário, defina flag[i] como true antes de entrar na seção crítica
  • Quando Pi sai da seção crítica, defina flag[i] como falso

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

  • O loop while é equivalente ao mecanismo de semáforo
  • Definir a bandeira da outra parte equivale a alterar o semáforo da outra parte.
  • Porém, como ambos os processos verificam primeiro a bandeira [olhar primeiro para o semáforo], e ambos são falsos [ambos os semáforos verdes] inicialmente, é possível que os dois processos passem pelo semáforo ao mesmo tempo e entrem juntos na seção crítica .

9.2.3 Método de pós-inspeção com nota dupla

O método de pós-verificação de sinalização dupla verificará a bandeira da outra parte e, em seguida, definirá a sua própria. Essas duas operações não podem ser feitas de uma só vez, portanto, os dois processos podem entrar na seção crítica ao mesmo tempo. foi desenvolvido um método que primeiro define o próprio sinalizador e depois verifica o sinalizador da outra parte. Se o sinalizador da outra parte for verdadeiro, espere, caso contrário, entre na seção crítica;

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui


9.2.4 Algoritmo de Peterson

O algoritmo de Peterson combinamétodo de marca únicaeMétodo de pós-verificação de marca duplaA ideia é usar flag[] para resolver o problema de acesso mutuamente exclusivo e usar turn para resolver o problema de fome.

Se ambas as partes estiverem competindo para entrar na seção crítica, o processo pode ser permitido para dar à outra parte a oportunidade de entrar na seção crítica.
Antes de cada processo entrar na seção crítica, ele define seu próprio sinalizador e define o sinalizador de turno que pode entrar. Depois disso, ele detecta o sinalizador e o turno da outra parte ao mesmo tempo para garantir que apenas um processo possa entrar quando. ambas as partes solicitam entrar na seção crítica ao mesmo tempo.
Insira a descrição da imagem aqui
Falha em abrir mão do direito de esperar
Insira a descrição da imagem aqui


9.3 Mecanismo de sincronização de hardware

É difícil para o software resolver o problema de exclusão mútua de cada processo de entrar na seção crítica e tem grandes limitações, portanto, o computador fornece algumas instruções especiais de hardware para resolver o problema.

9.3.1 Desativar interrupções

(1) Definição de desligar interrupções

  • O desligamento de interrupções foi discutido nos princípios de composição do computador. Refere-se à modificação de um bit no registro PSW da CPU. Este bit controlará se a CPU atual responderá à interrupção correspondente. Interrupções não mascaráveis ​​não podem ser interrompidas
  • O agendamento de processos no sistema operacional depende de interrupções, como interrupções de relógio.
  • Durante a execução de um processo na seção crítica, o sistema computacional desliga interrupções, o que não acionará o escalonamento e não haverá troca de processos ou threads.

(2) Desvantagens de desligar interrupções

  • O uso indevido de terminais pode levar a consequências graves
  • Se o tempo de desligamento for muito longo, isso afetará a eficiência do sistema.
  • O método de desativação de interrupções não se aplica a sistemas com várias CPUs. Desativar interrupções em um processador não impede que o processo execute o mesmo código crítico em outros processadores.

9.3.2 Comando Test-and-Set (comando TS)

Insira a descrição da imagem aqui

A instrução TS pode ser considerada como um processo de função (primitivo) cujo processo de execução é indivisível.

  • lock tem dois estados:
    • *lock=FALSE indica que o recurso é gratuito
    • *lock=TRUE indica que o recurso está sendo usado

Use o TS para gerenciar seções críticas e definir um bloqueio para cada recurso crítico.

  • O valor inicial é FALSE, indicando que recursos críticos estão ociosos.
  • Antes de o processo entrar na seção crítica, ele primeiro usa TS para testar o bloqueio. Se for FALSE, ele pode inserir e atribuir o valor TRUE ao bloqueio, fechando o recurso crítico.

9.3.3 Comando de troca

Insira a descrição da imagem aqui
É chamada de instrução de troca e é usada para trocar o conteúdo de duas palavras.

  • Defina um bloqueio de variável booleana global para cada recurso crítico, com um valor inicial FALSE.
  • Use as instruções de hardware acima para concluir o processo de exclusão mútua
  • No entanto, este método também fará com que o processo de acesso seja continuamente testado e num estado de "espera ocupada", o que não cumpre o princípio da "espera certa".

9.4 Mecanismo de semáforo

9.4.1 Semáforo inteiro

É definido como um inteiro S usado para representar o número de recursos. Existem apenas três operações para este semáforo inteiro: inicialização (atribuição de um valor inicial), espera (decremento), sinal (incremento).
Insira a descrição da imagem aqui

  • Espera e sinal são operações atômicas e não podem ser interrompidas durante a execução.
  • Quando um processo modifica um semáforo, nenhum outro processo pode modificar o semáforo ao mesmo tempo.

9.4.2 Registrar semáforo

Mecanismo de sincronização de processos sem fenômeno de "espera ocupada"

  • Além de um valor variável inteiro usado para representar o número de recursos
  • Também é necessário adicionar uma lista vinculada de processos L para vincular todos os processos que aguardam o recurso.

Insira a descrição da imagem aqui

  • A operação de espera é equivalente à operação P
  • A operação do sinal é equivalente à operação V
  • Apenas dois nomes diferentes, as funções são exatamente as mesmas
  • espere(A) = P(A)
  • sinal(B) = V(A)

(1) Use o semáforo para realizar a exclusão mútua do processo

Defina um semáforo mutuamente exclusivo mutex=1 e, em seguida, coloque a seção crítica para cada processo para acessar recursos críticos entre wait(mutex) e signal(mutex)
Insira a descrição da imagem aqui


(2) Use semáforos para obter sincronização de processos

Defina um semáforo de sincronização S = 0, de modo que o sinal de instrução (S) que precisa ser executado primeiro e depois a espera (S)
Insira a descrição da imagem aqui