¿Por qué se introducen la señalización y las operaciones P, V en el sistema operativo?
[1] Teoría de las primitivas P y V
Hablando de la teoría de las primitivas P y V, tenemos que mencionar al famoso científico holandés E.W. Dijkstra si te interesa esto. Si los científicos no tienen ninguna impresión, deberíamos estar familiarizados con el algoritmo de Dijkstra para resolver el problema del camino más corto en la teoría de grafos. En 1965 propuso el concepto de primitivas P,V y el concepto de semáforos utilizados en operaciones P,V.
Las señales son el primer mecanismo para resolver problemas de sincronización y exclusión mutua de procesos. Consisten en una variable llamada señal y dos operaciones básicas sobre ella. La señal es un número entero, configuramos esta señal en: sem. Obviamente, estipulamos que cuando sem es mayor o igual a cero, representa la cantidad de entidades de recursos disponibles para procesos concurrentes; cuando sem es menor que cero, representa la cantidad de procesos que esperan usar la sección crítica; De acuerdo con este principio, cuando asignamos un valor inicial a un semáforo, obviamente tenemos que establecer que el valor inicial sea mayor que cero.
La operación p y la operación v son segmentos de programa ininterrumpibles, llamados primitivos.
P en las primitivas P y V es Passeren en holandés, que equivale a pass en inglés, y V es Verhoog en holandés, que equivale a incremnet en inglés.
La operación de la operación primitiva P es:
(1) sem se reduce en 1
(2) Si sem es menor que cero, entonces sem; se reducirá a 1;
(3) Si sem es menor que cero, entonces sem se reducirá a cero. p>(2) Si sem menos 1 sigue siendo mayor o igual a cero, el proceso continúa ejecutándose
(3) Si sem menos 1 es menor que cero, el proceso se bloquea, luego ingresa; la cola correspondiente a la señal y luego ingresa a la programación del proceso.
La operación de V operación original es:
(1) sem más 1
(2) Si el resultado de la suma es mayor que cero, el proceso continúa ejecutándose;
(3) Si el resultado de la suma es menor o igual a cero, despierta un proceso en espera de la cola de espera de la señal y luego regresa al proceso original para continuar la ejecución o cambiar al programador de procesos.
Recordamos que las operaciones P y V sólo se pueden realizar una vez por cada proceso. Y debe usarse en pares. Y no se permite ninguna interrupción durante la ejecución de los deseos P y V.
Existen muchos métodos de implementación específicos, que pueden ser implementación de hardware o implementación de software.
Usamos la siguiente definición:
Proceso p(var s: Samephore);
{
s.value=s.value-1; >
if (s.valuelt; 0) dormido(s.queue);
}
}
procedimiento v(var s: Samephore)
{
s.value=s.value 1;
if (s.valuelt;=0) despertar(s.queue); p >
}
Se utilizan dos procedimientos estándar:
asleep(s.queue); el bloque de control del proceso que realiza esto irá al final de s.queue; , el proceso entrará en estado de espera
wakeup(s.queue); despierta el proceso al principio de s.queue y lo inserta en la cola lista
Durante este proceso , s.value El valor inicial es 1, utilizado para implementar la exclusión mutua del proceso.
Aunque el mecanismo de señalización es mucho mejor que el método de bloqueo, no está exento de defectos. De esto también podemos ver claramente que este mecanismo de señalización debe tener memoria pública y no puede usarse en sistemas operativos distribuidos. Esta es su mayor debilidad.
[2] Aplicación de las primitivas P y V
Como mencionamos al principio de este artículo, las primitivas P y V no solo pueden resolver el problema de exclusión mutua en la gestión de procesos, sino que También puede resolver problemas de sincronización y comunicación de procesos.
(1) Utilice las primitivas P y V para realizar la exclusión mutua del proceso
Coloque una sección crítica entre P(sem) y V(sem). Cuando un proceso quiere ingresar a la sección crítica, primero debe realizar una operación primitiva P para reducir el semáforo sem en 1; cuando el proceso completa la operación en la sección crítica, debe realizar una operación primitiva V para liberar la sección crítica; ocupa.
Por lo tanto, estos dos procesos son mutuamente excluyentes:
El proceso se puede describir brevemente de la siguiente manera:
PA:
P(sem)
lt; sargento;
V(sem)
PB:
P(sem)
lt; p>
V(sem):
P(sem)
lt; <
V(sem)
p>(2) Utilice la sincronización de procesos original de P V
La solución al problema de sincronización de procesos también se puede resolver mediante esta operación. Supongamos que hay dos procesos que deben sincronizarse, uno es el de computación. proceso, y el otro es el proceso de impresión, entonces las definiciones de los dos procesos en este momento se pueden expresar de la siguiente manera:
PC (que indica el proceso de cálculo)
A: local buf
repetir
repetir
p>
buf=buf
hasta buf=vacío
Compute
obtener Compute
buf=compute
ir a A
PP: (representa el proceso de impresión)
B: pri local
repetir
pri=buf
pri=buf
p>
hasta pri! =null
Imprimir los datos en buf
Borrar los datos en buf
Ir a B
Usar primitivas P, V Las correspondientes la implementación es
PA: deposit(data)
Comenzar local x
P(bufempty)
Seleccione un buffer vacío buf( x ) en modo FIFO
buf(x)=data
buf(x) establece la marca completa
V(buffull)
end
PB: remove(data)
Iniciar local x
P(buffull)
Selecciona uno completo
búfer de datos buf(x)
data= buf(x)
buf(x) establece la marca vacía
V(bufempty)
fin
(3) Utilice el código fuente de PV para implementar la comunicación de procesos
Tomemos la comunicación del buzón como ejemplo para ilustrar este problema:
Buzón comunicación Se deben cumplir las siguientes condiciones:
lt;1gt;Enviar Cuando un proceso envía un mensaje, debe haber al menos un espacio en el buzón para acomodar el mensaje.
lt;2gt;;Cuando el proceso de recepción recibe el mensaje, hay al menos un mensaje en el buzón.
El proceso de envío y el proceso de recepción se describen a continuación:
Depósito (m) es el proceso de envío y el proceso de recepción es eliminar (m). Fromnum es el delimitador privado del proceso de envío y el espacio del buzón es n. mesnum es el delimitador privado del proceso receptor, con un valor inicial de 0.
Depósito(m):
Comenzar local x
P(fromnum)
Selecciona el espacio x
Poner el mensaje m en el espacio x
Establecer la bandera del espacio x al máximo
V(mesnum)
end
Eliminar(m)
Comenzar x local
P(mesnum)
Selecciona mueve información desde el espacio completo x a m
Seleccionar el espacio completo x
Eliminar el mensaje del espacio completo x a m
P(mesnum)
Seleccione el espacio completo x
Eliminar el mensaje del espacio completo x a m
Colocar el marco x como indicador vacío
V(fromnum)
end