# data[].attributes.body
Por lo general termina en un tiempo determinado y el hilo, proceso o tarea sólo tendrá que esperar un período determinado de tiempo para entrar. Se necesita un mecanismo de sincronización en la entrada y salida de la sección crítica para asegurar la utilización en exclusiva del recurso

# data[].attributes.body
Dependiendo de la función que cumple el semáforo, vamos a diferenciar los siguientes tipos:
* semáforos de exclusión mutua, inicialmente su contador vale1 y permite que haya un único proceso simultáneamente dentro de la sección critica
*semáforo contador, permiten llevar la cuenta del numero de unidades de recursos compartido disponibles, que va desde 0 hasta N
*semáforo de espera, generalmente se emplea para forzar que un proceso pase a estado bloqueado hasta que se cumpla la condición que le permita ejecutarse.
Por lo general, el contador vale 0 inicialmente, no obstante, podría tener un valor distinto de cero

# data[].attributes.body
Basados en quorums: Cada nodo pertenece a la red que a su vez se divide en subconjuntos de nodos (quorums),cada que entren a una región crítica el quorum se bloquea.

Algoritmo de Maekawa

# data[].attributes.body
No basados en tokens: El acceso a la región crítica se otorga mediante turnos y mensajes, se usan marcas de tiempo para accesos equitativos. Ejemplo:

Algoritmo de cola compartida.

# data[].attributes.body
Basados en tokens: Un único token se comparte en varios nodos, el proceso que posea el token se entrega a la región crítica.

Algoritmo de servidor centralizado

Algoritmo en anillo

Algoritmo de Ricart y Agrawala

# data[].attributes.body
La sección crítica es un segmento de código que no puede ser ejecutado por más de un proceso al mismo tiempo. Los semáforos se utilizan para garantizar que sólo un proceso esté en la sección crítica en un momento dado. Los semáforos se utilizan para resolver el problema de la sección crítica y lograr la sincronización de procesos en el entorno de multiprocesamiento.

# data[].attributes.body
Inhabilita las interrupciones durante el conjunto de instrucciones más pequeño que impedirá la corrupción de la estructura compartida (la sección crítica). Esto impide que el código de la interrupción se ejecute en mitad de la sección crítica.

# data[].attributes.body
Algunos sistemas tienen instrucciones multioperación indivisibles similares a las anteriormente descritas para manipular las listas enlazadas que se utilizan para las colas de eventos y otras estructuras de datos que los sistemas operativos usan comúnmente.

# data[].attributes.body
En un sistema multiprocesador de memoria compartida, se usa la operación indivisible test-and-set sobre una bandera, para esperar hasta que el otro procesador la despeje. La operación test-and-set realiza ambas operaciones sin liberar el bus de memoria a otro procesador. Así, cuando el código deja la sección crítica, se despeja la bandera. Esto se conoce como spin lock o espera activa.

# data[].attributes.body
Los algoritmos de exclusión mutua ayudan a garantizar que un proceso pueda escribir en una sola dirección y que en ciertas secciones de código otro proceso pueda acceder a los recursos necesarios.

# data[].attributes.body
Cuando múltiples procesos dependen de un recurso y necesitan acceder al mismo tiempo, el Sistema Operativo necesita asegurar que solo un procesador acceda a dicho recurso en un momento dado.

Esto reduce la concurrencia.

# data[].attributes.body
En este tipo de relación, el proceso consumidor depende del proceso productor hasta que la información / salida necesaria haya sido producida.

La primera implementación consistía de un componente que protegía el transporte de información entre el almacén y el periférico, conocido como "canal".

Dos semáforos de conteo (productor y consumidor) aparecen: uno indicaba la longitud de la cola (incremento por CPU y decremento por el canal), el otro contaba el número de tareas completadas no reconocidas (incremento por el canal y decremento por CPU.)

# data[].attributes.body
Suponga el siguiente ejemplo en el que se quieren sincronizar dos hilos de un proceso, de manera que se de la siguiente secuencia de ejecución: A,B,A,B... y así sucesivamente. El siguiente código resolvería el problema

semaforo a = semaforo.create(1);
semaforo b = semaforo.create(0);

/* codigo del hilo A */
while (1) {
a.down();
printf("hilo A\n")
b.up();
}
/* CODIGO DEL HILO DE b */
while (1) {
b.down();
printf("hilo B\n")
a.up();
}

# data[].attributes.body
Se usan en programación concurrente para evitar que entre más de un proceso a la vez en la sección crítica.

La mayor parte de estos recursos son las señales, contadores, colas y otros datos que se emplean en la comunicación entre el código que se ejecuta cuando se da servicio a una interrupción y el código que se ejecuta el resto del tiempo.

# data[].attributes.body
Cuando una tarea llega a un punto de ramificación, esta se divide en n sub-tareas que son ejecutadas en n actividades. Al completarse su ejecución, esperan a que las demás sub-tareas estén listas para volver a unirse y dejar el sistema.

Comúnmente usada en la programación paralela.

# data[].attributes.body
Es un técnica donde un proceso repetidamente verifica una condición, tal como esperar una entrada de teclado o si el ingreso a una sección crítica está habilitado. Puede ser una estrategia válida en algunas circunstancias especiales, sobre todo en la sincronización de procesos en los sistemas con múltiples procesadores (SMP). En general, debe ser evitada, ya que consume tiempo de CPU sin realizar ninguna operación.

# data[].attributes.body
La Sincronización de Procesos o Sincronización es la forma en que los procesos que comparten el mismo espacio de memoria son gestionados en un Sistema Operativo.

Ayuda a mantener consistentes los datos al usar variables o hardware para que solo un proceso a la vez pueda realizar cambios.

# data[].attributes.body
La sincronización de procesos es un problema común en la programación de sistemas operativos. Los semáforos son una herramienta que se utiliza para resolver este problema. Los semáforos son variables especiales que se utilizan para señalizar entre procesos.

El Semáforo fue propuesto por Dijkstra en 1965, que es una técnica muy importante para administrar procesos concurrentes mediante el uso de un valor entero simple, que se conoce como semáforo.

Semaforo es simplemente una variable entera que se comparte entre subprocesos. Esta variable se utiliza para resolver el problema de la sección crítica y lograr la sincronización de procesos en el entorno de multiprocesamiento.