El segundo tipo es el semáforo (include/asm/semaphore.h): puede tener más de un receptáculo en algún momento (el número se decide en tiempo de inicialización), aunque es usado más comúnmente como un bloqueo de receptáculo-simple (un mutex). Si no puedes obtener el semáforo, tus tareas se pondrán en una cola, y serán despertadas cuando el semáforo sea liberado. Esto significa que la CPU hará algo mientras que estás esperando, pero hay muchos casos en los que simplemente no puedes dormir (ver Sección 4.8), y por lo tanto tienes que usar un spinlock en vez del semáforo.
Ningún tipo de bloqueo es recursivo: ver Sección 4.2.
Los semáforos todavía existen, porque son requeridos para la sincronización entre contextos de usuario, tal como veremos a continuación.