[Sistema operativo] 2.5 gestión de procesos (sincronización y exclusión mutua de procesos)

Sincronización de procesos

El proceso es asincrónico. La asincronía significa que cada proceso que se ejecuta simultáneamente avanza el
Inserte la descripción de la imagen aquí
proceso de lectura y el proceso de escritura simultáneamente a una velocidad independiente e impredecible . Dado que la concurrencia conduce inevitablemente a la asincronía, hay dos "procesos de escritura" y "procesos de lectura". El orden en el que se realizan las operaciones realizado es incierto. En aplicaciones prácticas, debe ejecutarse en el orden de "escribir datos → leer datos".
Cómo resolver este problema de un solo paso es lo que se analiza en "sincronización de procesos"

  • Sincronización de procesos: También conocida como relación de control directo , se refiere a dos o más procesos establecidos para completar una determinada tarea. Estos procesos necesitan coordinar su orden de trabajo en ciertas posiciones y producir la relación de restricción.
  • La restricción directa entre procesos se deriva de su cooperación mutua.

Proceso de exclusión mutua

Dos formas de compartir recursos:

  1. Uso compartido mutuamente exclusivo: aunque algunos recursos del sistema se pueden proporcionar a varios procesos, solo se permite que un proceso acceda al recurso en un período de tiempo
  2. Uso compartido simultáneo: varios procesos pueden acceder a ciertos recursos del sistema "simultáneamente" dentro de un período de tiempo (acceso alternativo)
  • Poner un período de tiempo solo permite que un proceso utilice recursos conocidos como recursos críticos. Muchos dispositivos físicos (como cámaras e impresoras) son recursos críticos. Además, muchas variables, datos, búferes de memoria, etc., pertenecen aRecurso crítico
  • El acceso a los recursos críticos debe ser mutuamente excluyente. Mutuamente excluyentes, es decir, relación de restricción indirecta .
  • Proceso de exclusión mutua: Se refiere a cuando un proceso accede a un recurso crítico, otro proceso que desea acceder al recurso crítico debe esperar . El acceso del proceso que actualmente accede al recurso crítico finaliza. Una vez liberado el recurso, otro proceso puede acceder al recurso crítico.
  • El acceso mutuamente exclusivo a los recursos críticos se puede dividir lógicamente en cuatro partes
    Inserte la descripción de la imagen aquí
    1. Zona de entrada : Responsable de verificar si puede ingresar a la zona crítica, si puede ingresar, debeEstablecer la bandera de acceso a recursos críticos (bloqueado), Para evitar que otros procesos ingresen al área crítica al mismo tiempo (cuando otros procesos quieran acceder al recurso crítico, verifique el área de entrada y descubra que hay un proceso que accede al recurso crítico en este momento)
    2. Sección crítica :accesoRecurso crítico
    3. Zona de salida : responsableDesbloquea la bandera de acceso a recursos críticos (desbloquear)
    4. Área restante : hacer otro procesamiento
  • Nota:
    1. La sección crítica es un segmento de código que accede a recursos críticos en un proceso.
    2. El área de entrada y el área de salida son segmentos de código responsables de lograr la exclusión mutua
    3. Sección crítica

Pensando:
Si un proceso no puede entrar en la zona crítica por el momento, ¿puede el proceso ocupar siempre el procesador? ¿Es posible que el proceso nunca entre en la sección crítica?

  • Los principios que deben seguirse para lograr un acceso mutuamente excluyente a los recursos críticos :
    1. Libre para dejar entrar : sección críticainactivoTiempo, puede dejar que un proceso que solicite ingresar a la sección críticaEntra ahoraSección crítica
    2. Esperando si está ocupado : cuandoYaCuando el proceso ingresa a la sección crítica, otros procesos que intentan ingresar a la sección críticaTiene que esperar
    3. Espera limitada : se debe garantizar que el proceso que solicita el acceso puedaTiempo limitadoIngrese a la zona crítica (garantizado que no tendrá hambre)
    4. Dar poder para esperar : cuando el proceso no puede entrar en la sección crítica, debeSuelte el procesador inmediatamente para evitar que el proceso espere(El proceso no se puede ejecutar, pero aún ocupa el procesador)

El método de realización de software de exclusión mutua de procesos.

  1. Método de signo único:

    1. Solo verifique en el área de entrada sin bloquear
    2. Transferir el derecho a utilizar recursos críticos a otro proceso en la zona de salida.
    3. Problema principal: no sigue el principio de dejar en inactivo
  2. Método de primera verificación de doble marca:

    1. Verifique antes de ingresar a la zona y luego bloquee y desbloquee la zona de salida
    2. El principal problema: no siga el principio de ocupado y espere
  3. Método de inspección posterior de doble marca:

    1. Verifique después de que la zona de entrada esté bloqueada primero y la zona de salida esté desbloqueada
    2. Problema principal: no sigue el principio de dejar pasar la espera inactiva y limitada
  4. Algoritmo de Peterson:

    1. Toma la iniciativa de luchar por la zona de entrada, toma la iniciativa de ceder, comprueba si la otra parte quiere entrar y si te rindes por última vez.
    2. El principal problema: si no sigue el principio de dar poder para esperar, habrá mucho tiempo esperando
  • Puede aprovechar el procesoAsincronía Verifique las deficiencias de estos algoritmos, verifique varias secuencias de ejecución y posibles problemas

Método de realización de hardware de exclusión mutua de procesos

  1. Interrumpir el método de blindaje:

    1. Principio: La realización de la "instrucción de interrupción de encendido / apagado" es la misma que la idea de realización original, es decir, cuando un proceso comienza a acceder al área crítica a la posición final, no se permite que se interrumpa y la programación del proceso no puede ocurren, por lo que es imposible que sucedan dos. Los procesos acceden simultáneamente a recursos críticos
    2. Desventajas:
      1. No es adecuado para sistemas multiprocesador, porque el apagado en un procesador no evita que el proceso ejecute el mismo código de sección crítica en otros procesadores
      2. Solo es adecuado para el programa del kernel del sistema operativo, no adecuado para el proceso del usuario, porque la instrucción de interrupción de cambio solo se puede permitir en el modo kernel.Si el usuario usa este grupo de instrucciones a voluntad, será muy peligroso
  2. TestAndSet (instrucción TS o instrucción TSL)

    1. La instrucción TSL se implementa por hardware y no se permite que se interrumpa durante la ejecución, y solo se puede hacer de una vez.
    2. ventaja:
      1. En el método anterior de primera verificación de doble marca y el segundo método de verificación de doble marca, la verificación y el bloqueo del área de entrada no se realizan de una vez. Esto hace que P1 verifique que el recurso no está bloqueado y se puede acceder a él, pero no se bloqueará en el futuro. Cuando se produce la programación del proceso , se ejecuta P2. En este momento, P2 también encuentra que el recurso no está bloqueado, y también piensa que puede acceder al recurso crítico. Esto provoca el fenómeno de que dos procesos acceder al recurso crítico al mismo tiempo. (El método de verificación posterior es bloquear primero y verificar después, de modo que haya un fenómeno de que ninguno de los recursos pueda acceder al recurso crítico). peroRealice la operación de verificación y bloqueo por hardware, Puede evitar lagunas lógicas en la implementación del software
      2. Adecuado para sistema operativo multiprocesador
    3. Desventajas: El principio de dar poder para esperar no se cumple. Los procesos que no pueden ingresar a la sección crítica ocupan temporalmente el procesador y ejecutan instrucciones TSL cíclicamente, lo que resulta en una espera ocupada.
  3. Instrucción de intercambio (instrucción XCHG) (los principios y características son los mismos que los de la instrucción TSL)

⭐Mecanismo de semáforo

Pensamiento: problemas con los métodos anteriores

  1. En el método de inspección de doble marca, la inspección y el bloqueo de la zona de entrada no se realizan de una sola vez y existen lagunas lógicas.
  2. Todos los algoritmos anteriores no siguieron el principio de "dar poder para esperar" (cuando se verifica que no se puede acceder al recurso crítico, siempre ejecutará la instrucción while y esperará en un bucle)
  • El proceso de usuario puede utilizar un par de primitivas del sistema operativo para operar en el semáforo, a fin de lograr fácilmente la exclusión mutua y la sincronización de procesos.
  • señal De hecho, es una variable (puede ser un número entero o una variable de registro más compleja). Se puede usar un semáforo para indicar la cantidad de un determinado recurso en el sistema. Por ejemplo, si el sistema tiene solo una impresora, puede establecer un valor inicial 1 semáforo
  • PrimitivoEs un segmento de programa especial cuya ejecución solo se puede realizar de una vez y no se puede interrumpir . La primitiva se realiza mediante la instrucción de interrupción de apagado / interrupción de apertura . El problema con la solución de software anterior es que "las operaciones de entrada a la zona no se pueden hacer de una vez". Por lo tanto, si las operaciones de entrada y salida de la zona se pueden implementar con "primitivas", estas operaciones se pueden completar de una vez. ve a evitar el problema.
  • Un par de primitivas: primitiva espera (s) y primitiva señal (s). La primitiva puede entenderse como una función escrita por nosotros mismos . Los nombres de las funciones son esperar y señal respectivamente. El semáforo s entre paréntesis es la transferencia de tiempo de llamada de función Entrante parámetros
  • Las primitivas de espera y señal se denominan operaciones P y V para abreviar , por lo que un par de primitivas se pueden escribir como P (s), V (s)
  • Clasificación del mecanismo de semáforo
    1. Semáforo entero: Use una variable entera como semáforo para indicar la cantidad de un determinado recurso en el sistema

        //整型信号量定义
        int S = 1;        	 //初始化整型信号量,表示当前系统中可以使用的打印机资源数
        void wait(int S){
              
               	//wait原语,相当于进入区
        	while(S<=0);   		//检查,如果资源不够就一直循环等待(一直在while中循环)导致会发生忙等
       	S=S-1;        		 //上锁,如果资源够,则占用一个资源
        }
        void signal(int S){
              
               	//signal原语,相当于退出区
        	S=S+1;           	//解锁,使用完资源后,在退出区释放资源
        }
      
        //进程P0:
        ...
        wait(S);			//进入区,申请资源
        使用打印机资源...	//临界区,访问资源
        signal(S);		//退出区,释放资源
        ...
      
      1. La diferencia con las variables enteras ordinarias: solo hay tres operaciones en semáforos, a saber, inicialización, operación P y operación V
      2. Ventajas: verifique y bloquee de una sola vez, evitando problemas causados ​​por concurrencia y asincronía
      3. Desventajas :Si no cumple con el principio de espera por energía, se producirá una espera ocupada
    2. ⭐Grabación de semáforo: La desventaja del semáforo entero está ocupado y otros problemas, por lo tanto, se propone el semáforo representado por una estructura de datos de tipo registro

      //记录型信号量的定义
      typedef struct{
              
              
      	int value;			//资源数
      	struct process *L;	//指向阻塞队列的指针
      } semaphore;
      
      void wait(semaphore S){
              
              
      	S.value--;			//使用一个资源,将资源数减一
      	if (S.value<0){
              
              		//如果资源数减一后发现其小于0,说明当前资源不够用
      		block(S.L);	//使用block原语使进程从运行状态进入阻塞态,并把它挂到信号量S的等待队列中
      	}
      }	
      
      void signal(semaphore S){
              
              
      	S.value++;		//释放一个资源,将资源数加一
      	if (S.value <= 0){
              
              	//若释放后,资源数小于等于0,则说明在释放之前,有进程正在等待刚被释放的资源
      		wakeup(S.L);	//故使用wakeup原语从等待队列中唤醒一个进程,该进程从阻塞态变为了就绪态
      	}
      }
      

      Ejemplo:
      hay dos impresoras en una computadora, al inicializar el semáforo S, el valor de S.value se establece en 2 y la cola SL se establece en nulo
      Inserte la descripción de la imagen aquí
      Inserte la descripción de la imagen aquí

      1. Primero, P0 se aplica a una impresora, después de ejecutar la primitiva de espera, el valor del número de recurso se convierte en 1, y luego P1 se aplica a una impresora y el valor se convierte en 0
      2. P2 se aplica a una impresora, y luego en la operación de espera de P2, el valor del valor se reduce en uno a -1 (lo que indica: un proceso está esperando) , y luego se juzga que el valor es <0, así que use la primitiva de bloque para cuelgue el proceso P3 en la cola de bloqueo
      3. P3 se aplica a una impresora, y luego, en la operación de espera de P3, el valor del valor se reduce en uno a -2 (lo que indica: dos procesos están esperando) , y luego se juzga que el valor es <0, así que use la primitiva de bloque para cuelgue el proceso P3 en la cola de bloqueo
      4. Cuando el proceso P0 termina de usar la impresora, ejecuta la primitiva de señal, el valor del número de recurso más uno es -1 (indicando que hay un proceso esperando a la impresora), y luego juzga ese valor <= 0, ejecuta la primitiva de reactivación y se despierta de la cola de bloqueo El proceso P2 en la cabecera de la cola y asigna la impresora a P2
      5. P2 usa directamente el recurso de la impresora ( no es necesario ejecutar la primitiva de espera para aplicar ), y luego ejecuta la primitiva de señal para liberar la impresora, el valor se incrementa en uno a 0, y se juzga que el valor <= 0 (indicando que hay procesos esperando a la impresora en la cola bloqueada), y luego ejecutan la reactivación La primitiva despierta el proceso P3, P3 cambia del estado bloqueado al estado listo, la impresora liberada por P2 se asigna a P3, y luego P3 usa la impresora directamente. . .
      6. Si el proceso P1 se agota en la impresora en este momento, la primitiva de señal libera el recurso y el valor se incrementa a 1. En este momento, se considera que el valor es> 0, lo que indica que ningún proceso está bloqueando la cola en espera. la impresora en este momento y la primitiva de activación no se ejecutará.

      resumen:

      1. La espera (S) y la señal (S) también se pueden denotar como P (S) y V (S). Este par de primitivas se puede utilizar para implementar los recursos del sistema. "Solicitud" con "liberado"
      2. S.valueValor inicialIndica el número de un determinado recurso en el sistema.
      3. Una operación P en el semáforo S significa que el proceso solicita una unidad de este tipo de recurso, por lo que S.value - debe ejecutarse, lo que significa que el número de recursos se reduce en uno, cuando valor <0 Tiempo, significa que el recurso ha sido asignado, por lo que el proceso debe llamarcuadraLos autobloques primitivos (el proceso en ejecución entra en el estado de bloqueo desde el estado de ejecución), abandona activamente el procesador y se cuelga hasta el final de la cola de espera SL del recurso, de modo que se realiza el principio de dar poder para esperar. , y no habrá ocupado esperando El problema (no siempre ejecutará el ciclo while como antes, esperando recursos)
      4. Una operación V en el semáforo S significa que el proceso libera una unidad de este tipo de recurso, por lo que necesita ejecutar S.value + +, lo que significa que el número de recursos más uno, cuando valor <= 0 Tiempo, significa que todavía hay recursos esperando el recurso, así que llamedespiertaPrimitivo, despierta el proceso principal de la cola de bloqueo (el proceso despertado entra al estado listo desde el estado bloqueado) y asigna la impresora al proceso. En este momento, el proceso ya ha obtenido la impresora. Si es su turno para usar el procesador, ya no puede ejecutar la primitiva de espera para solicitar una impresora, pero puede usar la impresora directamente para trabajar

Mecanismo semáforo para lograr la exclusión mutua de procesos

  1. Analizar las actividades clave de los procesos concurrentes y delimitar el área crítica (por ejemplo: el acceso a la impresora de recursos críticos debe ubicarse en el área crítica)
  2. ConfigurarMutexEl valor inicial es 1(Aquí seSección críticaVisto como un recurso especial, y solo existe uno de esos recursos )
  3. en Antes de la sección crítica Realizar P (mutex)
  4. en Después de la sección crítica Ejecutar V (mutex)
  5. Nota:
    1. Para diferentes recursos críticos, se deben configurar diferentes semáforos mutuamente excluyentes (impresora: mutex1; cámara: mutex2; ...)
    2. Las operaciones P y V deben aparecer en pares (la falta de operación P no puede garantizar el acceso exclusivo a recursos críticos; la falta de operación V hará que el recurso nunca se libere y el proceso de espera nunca se despertará)
	//信号量机制实现互斥
	semaphore mutex =1;	//初始化信号量
	 
	 P1(){
    
    
	 	...
	 	P(mutex);		//上锁
	 	临界区代码段...
	 	V(mutex);		//解锁
	 	...
	 }

 	P2(){
    
    
	 	...
	 	P(mutex);		//若P1还为使用完,此时资源数为-1,所以block原语会将P2进程挂到阻塞队列上
	 	临界区代码段...
	 	V(mutex);
	 	...
	 }

Mecanismo de semáforo para lograr la sincronización de procesos

  • Sincronización de procesos: deje que cada proceso concurrente proceda de manera ordenada según sea necesario
    P1(){
           
           
    	代码1;
    	代码2;
    	代码3}
    P2(){
           
           
    	代码4;
    	代码5;
    	代码6}
    

    Por ejemplo, P1 y P2 se ejecutan al mismo tiempo. Debido a la naturaleza asincrónica, el orden del avance alternativo de los dos es incierto.
    Si la ejecución del código 4 necesita usar el resultado de ejecución del código 2, se requiere que el código 4 debe ejecutarse después del código 2. En este momento, la relación se sincroniza, coopera entre sí y avanza de manera ordenada

  • Utilice el mecanismo de semáforo para lograr la sincronización de procesos
    1. Analizar dónde se debe lograr la relación de sincronización, es decir, las dos operaciones que se deben garantizar "un tándem" **
    2. Establezca la cantidad de señal de sincronización S , el valor inicial es 0
    3. en "Preoperación"llevado a caboTrasero Realizar V (S)
    4. en "Post operacion"llevado a caboantes de Realizar P (S)
     	//信号量机制实现进程同步
      	semaphore S=0;
     	P1(){
          
          
     		代码1;
     		代码2V(S);		//前操作执行后V
     		代码3}
     	P2(){
          
          
     		P(S);		//后操作执行前P
     		代码4;
     		代码5;
    		代码6}
    
    1. Si P1 ejecuta la operación V (S) primero , entonces S ++ es seguido por S = 1, y luego cuando P2 ejecuta P (S) , ya que S = 1, significa que hay recursos disponibles, S - se ejecutará, y el valor de S se convertirá en 0. No cumple con <0, por lo que la primitiva de bloque no se ejecutará, pero el código 4 continuará ejecutándose
    2. Si P2 realiza la operación P (S) primero , luego S - luego S = -1, lo que indica que no hay recursos disponibles en este momento, por lo que se llama a la primitiva de bloque y el proceso P2 bloquea activamente. Cuando P1 termina de ejecutarse código 2, luego ejecute V (S) , en este momento S ++, luego S = 0, luego se llamará a la primitiva de activación para activar P2 en la cola de bloqueo, de modo que P2 pueda continuar ejecutando el código 4
    3. De esta forma, la relación de sincronización del código 4 debe ejecutarse después del código 2

El mecanismo del semáforo se da cuenta de la relación precursora (expansión sincrónica)

Realmente es la expansión de la realización de la relación de sincronización

  • Por ejemplo: los procesos se ejecutan en el orden de la figura:
    Inserte la descripción de la imagen aquí
  • De hecho, cada par de relaciones predecesoras es un problema de sincronización de procesos (es necesario garantizar una operación uno a uno)
    1. Para establecer una variable de sincronización para cada relación predecesora
    2. en"Preoperación"DeTraseroRealice la operación V en la variable de sincronización correspondiente
    3. en"Post operacion"Deantes deRealice la operación P en la variable de sincronización correspondiente
//信号量机制实现前驱关系
semaphore a=0;		//要为每一个前驱关系各设置一个同步变量
semaphore b=0;
semaphore c=0;
semaphore d=0;
semaphore g=0;

P1(){
    
                           P2(){
    
        					 P3(){
    
         
    ... 						...							...
    S1;							P(a);						P(a);
	V(a);						S2; 						S3;
    V(b);						V(c);						V(g);
	...							V(d);						...
}								...						}
							}

Supongo que te gusta

Origin blog.csdn.net/Qmilumilu/article/details/112973036
Recomendado
Clasificación