Sistema operativo ~ ¿Cómo logra el mecanismo del semáforo la sincronización, resuelve el problema del fumador y resuelve el problema de la comida del filósofo?

Mecanismo de semáforo

El proceso del usuario puede operar en el semáforo utilizando un par de primitivas proporcionadas por el sistema operativo, logrando así fácilmente la exclusión mutua y la sincronización de procesos.

Un semáforo es en realidad una variable (puede ser un número entero o una variable de tipo 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 solo hay una impresora en el sistema, se puede configurar Un semáforo con un valor inicial de 1.

Primitive es un segmento de programa especial cuya ejecución solo se puede realizar de una vez y no se puede interrumpir.
Las primitivas son implementadas por las instrucciones de interrupción off / on.
El principal problema de la solución de software es que "las diversas operaciones de entrada a la zona no se pueden realizar de una vez". Por lo tanto, si las operaciones de entrada y salida de la zona se pueden realizar con "primitivas", el problema se puede evitar mediante haciendo estas operaciones "todo de una vez".

Un par de primitivas: la primitiva
esperar (S) y la 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 en realidad cuando se llama a la función Un parámetro pasado.

Las primitivas de espera y señal a menudo se abrevian como operaciones P y v (del holandés proberen y verhogen). Por lo tanto, al hacer preguntas, la espera (S) y la señal (S) a menudo se escriben como P (S) y v (S) respectivamente.

Semáforo entero

Utilice una variable entera como semáforo para indicar la cantidad de un determinado recurso en el sistema.

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Semáforo grabado

El defecto del semáforo entero es el problema de "ocupado, etc.", por lo que la gente presenta el "semáforo grabado", es decir, el semáforo representado por la estructura de datos registrada.

La diferencia entre el semáforo grabado y el semáforo entero es que habrá una cola de bloqueo para evitar fenómenos inactivos y ocupados.

Inserte la descripción de la imagen aquí
La espera (S) y la señal (S) en el título también se pueden denotar como P (S) yv (S). Este par de primitivas se puede utilizar para realizar la "aplicación" y la "liberación" de los recursos del sistema. El valor inicial de S.value representa el número de un determinado recurso en el sistema.

Inserte la descripción de la imagen aquí
Una operación Р en el semáforo s significa que el proceso solicita una unidad de este tipo de recurso, por lo que necesita ejecutar S.value–, lo que significa que el número de recursos se reduce en 1.
Cuando S.value <0, significa que se ha asignado este tipo de recurso, por lo que el proceso debe llamar a la primitiva de bloque para autobloquear (el proceso que se está ejecutando actualmente es del estado de ejecución> estado de bloqueo), abandonar activamente el procesador e insertarlo en la cola de espera sL de este tipo de recurso. Puede verse que este mecanismo sigue el principio de "dar poder para esperar", y no habrá ningún fenómeno de "espera ocupada".

Una operación v en el semáforo s significa que el proceso libera una unidad de este tipo de recurso, por lo que es necesario ejecutar S.value ++, lo que significa que el número de recursos aumenta en 1. Si sigue siendo S.value <= 0 después de agregar 1, significa que todavía hay un proceso en él. Esperando este tipo de recurso, por lo que se debe llamar a la primitiva de activación para activar el primer proceso en la cola de espera (el proceso despertado pasa del estado de bloqueo → estado listo ).

para resumir

Inserte la descripción de la imagen aquí

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

1. Analice las actividades clave de los procesos concurrentes y delimite el área crítica (por ejemplo: el acceso a la impresora de recursos críticos debe ubicarse en el área crítica)
2. Configure el mutex semáforo mutex, el valor inicial es 1
3. Ejecute P antes el área crítica (mutex)
4. Ejecute v (mutex) después de la sección crítica
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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

Utilice semáforos para lograr la sincronización de procesos:
1. Analizar dónde debe realizarse la "relación de sincronización", es decir, deben garantizarse las dos operaciones (o dos frases de código) realizadas por "un tándem"
2. Establecer la señal de sincronización s, que inicialmente es 0
3. Ejecute v (s) después de "operación anterior"
4.
Inserte la descripción de la imagen aquí
Si P (S) se ejecuta antes de la "operación posterior", si la operación v (S) se ejecuta primero, entonces S ++ después de S = 1. Posteriormente, cuando se ejecute la operación P (S), porque S = 1, significa que hay recursos disponibles, se ejecutará S– y el valor de s volverá a 0. El proceso P2 no ejecutará la primitiva de bloque , pero continúe ejecutando el código 4.
Si la operación P (S) se ejecuta primero, ya que S = o, S– luego S = -1, significa que no hay recursos disponibles en este momento, por lo que la primitiva de bloque se ejecutará en la operación P, y la Se solicitará activamente el bloqueo. Después de que se ejecuta el código 2, se ejecuta la operación v (S), S ++, y s se cambia de nuevo a o. Dado que hay un proceso en la cola de bloqueo correspondiente al semáforo en este momento, la primitiva de activación se ejecutará en la operación v para despertar el proceso P2. Entonces P2 puede continuar ejecutando el código 4

Resolviendo el problema del fumador

Suponga que un sistema tiene tres procesos de fumador y un proceso de proveedor. Todo fumador sigue enrollando un cigarrillo y fumando, pero para enrollar y fumar un cigarrillo, el fumador necesita tres materiales: tabaco, papel y pegamento. Entre los tres fumadores, el primero tenía tabaco, el segundo papel y el tercero pegamento. El proceso del proveedor proporciona tres tipos de materiales de forma indefinida. El proveedor pone dos materiales sobre la mesa cada vez, y el fumador que posee el material restante enrolla un cigarrillo y lo fuma, y ​​envía una señal al proceso del proveedor de que se ha completado. El proveedor pondrá otros dos materiales sobre la mesa. Este proceso se repite (deje que los tres fumadores fumen uno por uno)

Inserte la descripción de la imagen aquí
En esencia, esta pregunta también pertenece al problema del "productor-consumidor". Más detalladamente, debería ser "un solo productor-múltiples consumidores que pueden producir múltiples productos".
Inserte la descripción de la imagen aquí
1. Análisis de relaciones. Conozca los distintos procesos descritos en el título y analice la relación de sincronización y exclusión mutua entre ellos.
2. Organiza tus ideas. Determine la secuencia aproximada de operaciones P y V de acuerdo con el flujo de operación de cada proceso
3. Configure el semáforo. Establezca el semáforo requerido y determine el valor inicial del semáforo de acuerdo con las condiciones del sujeto. (El valor inicial del semáforo mutuamente excluyente es generalmente 1, y el valor inicial del semáforo de sincronización depende del valor inicial del recurso correspondiente)
Combinación 1: Papel + pegamento
Combinación 2: Tabaco + pegamento
Combinación 3: Tabaco +
sincronización de papel relación (del evento Desde la perspectiva del análisis):
hay una combinación uno sobre la mesa → el primer fumador quita cosas de la
mesa hay una combinación dos → el segundo fumador quita cosas
hay una combinación tres sobre la mesa → el tercer fumador toma las cosas y las
envía Señal → El proveedor pone la siguiente combinación sobre la mesa
Secuencia de operación PV: "Anverso v y reverso P"

Inserte la descripción de la imagen aquí

resolver

Inserte la descripción de la imagen aquí
El problema del fumador puede darnos una idea para resolver el "productor único que puede producir múltiples productos".
La esencia que vale la pena aprender es: "Dejar que cada fumador se turne para fumar" requiere necesariamente "combinación uno, dos y tres en la mesa por turno". Preste atención a cómo usamos una variable entera i para lograr este proceso de "rotación".

El problema de la comida del filósofo

Hay cinco filósofos sentados en una mesa redonda, se coloca un palillo sobre la mesa entre cada dos filósofos, y en el medio de la mesa hay un cuenco de arroz. Los filósofos dedican la energía de su vida a pensar y comer, y los filósofos no influyen en los demás cuando piensan. Sólo cuando el filósofo tuvo hambre intentó coger los palillos izquierdo y derecho (uno por uno). Si los palillos ya están en manos de otros, debe esperar. El filósofo hambriento sólo puede empezar a comer cuando toma dos palillos a la vez, cuando termina la comida, deja los palillos y sigue pensando.
Inserte la descripción de la imagen aquí
1. Análisis de relaciones. Hay cinco procesos filósofos en el sistema, y ​​las
visitas de los cinco filósofos y sus vecinos a sus palillos del medio son mutuamente excluyentes. 2. Organizar ideas. Solo hay exclusión mutua en este problema, pero a diferencia de
los problemas encontrados antes , cada proceso filósofo necesita contener dos recursos críticos al mismo tiempo para comenzar a comer. Cómo evitar el fenómeno del estancamiento causado por la distribución inadecuada de recursos críticos es la esencia del problema del filósofo.
3. Configuración del semáforo. Defina el
palillo de matriz de semáforo mutuamente excluyente [5] = {1,1,1,1,1} para implementar el acceso mutuamente exclusivo a 5 palillos. Y los filósofos están numerados del 0 al 4, los palillos a la izquierda del filósofo i están numerados como i, y los palillos a la derecha están numerados (i + 1)% 5.

Para evitar un punto muerto, cuando utilizamos la implementación de semáforo, debemos asegurarnos de que el filósofo que sostiene los palillos a la izquierda y los palillos a la derecha es algo que se excluye mutuamente.

Una afirmación más precisa debería ser: el uso de palillos por los filósofos debe ser mutuamente excluyente. Esto asegura que incluso si un filósofo está bloqueado mientras sostiene los palillos a la mitad, ningún otro filósofo continuará tratando de sostener los palillos. En este caso, después de que el filósofo que está comiendo en ese momento deja los palillos, el filósofo bloqueado puede obtener los palillos que está esperando.

semáforo palillo [5] = {1,1,1,1,1};
semáforo mutex = 1;
// tomar palillos
Pi () { // el proceso del filósofo número i while (1) { P (mutex); P (palillo [i]); // toma la izquierda P (palillo [(i + 1)% 5]); // toma la derecha v (mutex); come ... v (palillo [i]); / / put Left v (chopstick [(i + 1)% 5]); // Pon la derecha y piensa ... } }











Supongo que te gusta

Origin blog.csdn.net/Shangxingya/article/details/113801594
Recomendado
Clasificación