Para controlar el acceso a la impresora (u otro dispositivo periférico), el sistema operativo debe anotar si la impresora ya ha sido asignada. Una forma de hacerlo sería utilizando un indicador, que en este contexto sería un bit en la memoria cuyos estados se suelen denominar activado (set) y desactivado (clear), en lugar de 1 y 0.
Un indicador desactivado (valor 0) señala que la impresora está disponible mientras que un indicador activado (valor 1) nos informa de que la impresora está actualmente asignada. Cada vez que un proceso termina de utilizar la impresora, el sistema operativo asigna la impresora a uno de los procesos en espera o , si no hay ninguno, se limita a desactivar el indicador.
Para que la tarea de comprobar y posiblemente configurar el indicador se complete sin interrupciones existe la posibilidad de usar las instrucciones de desactivación y activación de interrupciones que se proporcionan en la mayoría de los lenguajes de máquina. Al ejecutarse, una instrucción de desactivación de interrupciones hace que se bloqueen las interrupciones futuras, mientras que una instrucción de activación de interrupciones futuras, mientras que una instrucción de activación de interrupciones hace que el procesador comience de nuevo a responder a las señales de interrupción. Así ninguna otra actividad podrá interrumpir a esa rutina después de que esta haya comenzado.
Otra solución sería emplear la instrucción de comprobación y configuración (test-and-set) disponible en muchos lenguajes de máquina. Esta instrucción hace que el procesador lea el valor de un indicador, anote el valor recibido y luego configure el indicador, todo ello dentro de una misma instrucción de lenguaje máquina. La ventaja es que, como el procesador siempre completa la instrucción en curso antes de atender a ninguna otra interrupción, la tarea de comprobar y configurar el indicador no puede partirse cuando se implementa una única instrucción.
Un indicador adecuadamente implementado se denomina semáforo.
A una secuencia de instrucciones que solo debe ser ejecutada por un proceso cada vez se la denomina región crítica. El requisito de que solo se permita a un proceso cada vez ejecutar una región crítica se conoce con el nombre de exclusión mutua. Si un semáforo está activado, el proceso que está intentando entrar en la región crítica deberá esperar hasta que el semáforo se desactive.
Otro problema que puede surgir durante la asignación de recursos es el interbloqueo, que es la condición en la que dos o más procesos están impedidos de progresar debido a que cada uno de ellos está esperando por un cierto recurso que está asignado al otro.
Un interbloqueo resultante de la competencia por cruces de vías férreas que no son compatibles
Otro ejemplo es el que a veces surge en sistemas en los que se permite a los procesos crear nuevos procesos (bifurcació, forking) para realizar subtareas. Si el planificador ya no dispone de espacio libre dentro de la tabla de procesos y cada proceso del sistema tiene asignada, entonces ninguno de los procesos podrá continuar. Dichas condiciones, al igual que las que surgen en otros entornos, puede degradar seriamente el rendimiento de un sistema.
El análisis de las situaciones de interbloqueo revela que estas situaciones no pueden producirse a menor que se satisfagan las siguientes tres condiciones:
El problema del interbloqueo puede afrontarse consiguiendo que cualquiera de estas tres condiciones no se cumpla. Si se produjera un interbloqueo debido a que la tabla de procesos está llena, una serie de rutinas del sistema operativo puede eliminar algunos de los procesos, esto hace que se libere espacio dentro de la tabla de procesos, rompiendo el interbloqueo y permitiendo a los restantes procesos continuar con sus tareas. A la técnica de guardar datos de salida para enviarlos en un momento posterior más conveniente se denomina spooling.
Hemos introducido el spooling como una técnica que sirve para conceder acceso a varios procesos a un recurso común.