Mecanismo de semáforo de iOS

En los sistemas iOS y en la mayoría de los sistemas operativos modernos, se pueden ejecutar varios subprocesos al mismo tiempo y la CPU alterna entre subprocesos para compartir ciertos recursos y mejorar la utilización de los recursos. Pero, ¿cómo lidiamos con las limitaciones mutuas entre varios hilos? Por ejemplo, si solo hay una impresora y ambos subprocesos necesitan imprimir archivos, si simplemente se les permite acceder a la impresora al mismo tiempo, es probable que no se imprima nada o que los archivos impresos se estropeen. Obviamente, necesitamos agregar un mecanismo para controlar las restricciones mutuas entre subprocesos.

En pocas palabras, necesitamos un mecanismo para controlar el orden de ejecución de los subprocesos.

El semáforo puede proporcionar un mecanismo de este tipo para que solo un subproceso pueda acceder a una sección crítica (la sección crítica se refiere al fragmento de programa en el subproceso que accede a los recursos más comunes) al mismo tiempo. En otras palabras, el semáforo se utiliza para coordinar el acceso de los hilos a recursos compartidos.

El semáforo puede entenderse como un contador de recursos. Hay dos operaciones en el semáforo para lograr la exclusión mutua, a saber, las operaciones P y V. La situación general es así para el acceso crítico o el acceso mutuamente excluyente: suponga que el valor del semáforo es 1. Cuando se ejecuta un subproceso A, utiliza recursos y realiza la operación P, es decir, el valor del semáforo se reduce en 1, es decir, el número de recursos se reduce en 1. . En este momento el valor del semáforo es 0. El sistema estipula que cuando el valor del semáforo es 0, debe esperar hasta que el valor del semáforo no sea cero antes de continuar con la operación. En este momento, si el subproceso B quiere ejecutarse, también debe realizar la operación P, pero en este momento el semáforo es 0, por lo que no se puede reducir a 1, es decir, la operación P no se puede realizar y está bloqueada. De esta forma se consigue el acceso exclusivo del hilo A. Cuando el hilo A termina de ejecutarse, los recursos se liberan y se realiza la operación V. La cantidad de recursos aumenta en 1 nuevamente y el valor del semáforo se convierte en 1. En este momento, el subproceso B descubre que la cantidad de recursos no es 0 y el semáforo puede realizar la operación P e inmediatamente realiza la operación P. El valor del semáforo vuelve a ser 0, el subproceso B tiene el recurso y otros subprocesos deben esperar hasta que se alcance el acceso exclusivo del subproceso B. Este es el principio del semáforo para controlar la exclusión mutua de hilos.

Hay tres funciones en GCD que operan el semáforo, a saber:

La primera función tiene un parámetro entero largo, que podemos entender como la cantidad total de la señal de despacho_semaphore_signal. una señal naturalmente aumentará la cantidad total de señal en 1. Dispatch_semaphore_wait espera la señal cuando la cantidad total de señal es menor que 0, esperará para siempre. De lo contrario, se puede ejecutar normalmente y la cantidad total de señal será -1. De acuerdo con este principio, podemos crear rápidamente un control de concurrencia para sincronizar tareas y controlar el acceso limitado a recursos.

Los semáforos se utilizan en concurrencia de subprocesos múltiples. Cuando un subproceso completa una determinada acción, se lo indica a otros subprocesos a través del semáforo, y los otros subprocesos luego realizan ciertas acciones.

1. La diferencia entre semáforos y bloqueos

2. Una breve discusión sobre los semáforos en GCD

3. Utilice semáforos para resolver la sincronización de procesos y la exclusión mutua Discusión