El principio de realización del bloqueo de giro del sistema operativo y el bloqueo de exclusión mutua

0 Introducción

Los amigos que tengan conocimientos de programación multiproceso deben conocer el concepto de bloqueos. Su función es garantizar que el código de la sección crítica pueda funcionar normalmente en múltiples subprocesos. En otras palabras, el bloqueo garantizará que solo se pueda utilizar un recurso compartido en cualquier tiempo.
En el pasado, los blogueros solo sabían cómo se usaba el candado, pero no entendían su principio interno. Hoy, eché un vistazo a la clase en línea del profesor Chen Yu de la Universidad de Tsinghua y tengo cierto conocimiento de la realización de cerraduras.

1 manipulación atómica

Para comprender la realización de bloqueos, primero debemos comprender las operaciones atómicas de la CPU. Las CPU modernas proporcionan algunas operaciones atómicas especiales, que no se pueden interrumpir cuando se ejecutan, como CAS (comparar e intercambiar) y Test-And-Set. Ambas operaciones pueden implementar bloqueos. Hablemos de cómo se implementa Test-And-Set.
Esta operación no es complicada, para target, si es falso, modifíquelo a verdadero, pero el valor devuelto es rv; si es verdadero, no pasa nada. Esta simple operación es atómica , veamos cómo lograr el bloqueo por ella.

boolbean TestAndSet(boolbead *target)
{
	boolbead *rv = *target;
	*target = true;
	return *rv;
}

3 Bloqueo de giro

El llamado bloqueo de giro, la enciclopedia se define de la siguiente manera:

El bloqueo de autoselección es un mecanismo de bloqueo propuesto para realizar la protección de los recursos compartidos. El bloqueo de giro no hará que la persona que llama se duerma. Si el bloqueo de giro ha sido retenido por otra unidad de ejecución, la persona que llama seguirá girando allí para ver si el titular del bloqueo de giro ha liberado el bloqueo. El término "giro" es Por lo tanto el nombre.

En términos sencillos, si el bloqueo actual está ocupado, la persona que llama se bloqueará en su lugar, que es diferente de un bloqueo mutex. Para los bloqueos, generalmente consideramos sus operaciones de bloqueo y desbloqueo. Como se muestra en el siguiente pseudocódigo del lenguaje C, cuando necesite bloquear antes de la sección crítica, puede llamar al método Adquirir del bloqueo. Si está bloqueado actualmente y el valor es 1, la siguiente persona que llama bloqueará el while; si no está bloqueado, no bloqueará el while, y test-and-set establecerá el valor en 1 para evitar el desbloqueo de los llamantes antes y después de ejecutar el código de la sección crítica. Solo es necesario establecer el valor en 0 para desbloquear.

class Lock
{
    
    
int value = 0;

void Acquire()
{
    
    
	while(test-and-set(&value))
		;
}

void Release()
{
    
    
	value = 0;	
}

};

Spin Lock también tiene algunas deficiencias: en primer lugar, es un bloqueo de espera ocupado, que consume recursos de la CPU cuando se bloquea en while hasta que finaliza el bloqueo. En segundo lugar, el uso de cerraduras de giro puede provocar interbloqueos. Por ejemplo, cuando un proceso de baja prioridad ocupa recursos de la región crítica, llega un proceso de alta prioridad y toma la CPU, y luego el proceso de alta prioridad también adquiere el bloqueo, pero el bloqueo está en manos del proceso de baja prioridad. , y está muerto El bloqueo ocurrió.

4 Mutex

La diferencia entre un bloqueo de mutex y un bloqueo de giro es que cuando la persona que llama descubre que se ha usado el bloqueo, pondrá el proceso actual en suspensión, lo agregará a la cola de espera y luego usará el mecanismo de programación (función de programación) para ejecutar otros procesos en lugar de esperar en el lugar. Al desbloquear, elimine el proceso de sueño de la cabeza y despiértelo. El resto es igual que el bloqueo de giro.

class Lock
{
    
    
int value = 0;
WaitQueue q;

void Acquire()
{
    
    
	while(test-and-set(&value))
	{
    
    
		add this TCB to the waitqueue q;
		schedule();
	}
}

void Release()
{
    
    
	value = 0;	
	remove thread t from q;
	wake(t);
}

};

Supongo que te gusta

Origin blog.csdn.net/MoonWisher_liang/article/details/110671123
Recomendado
Clasificación