La revocación de recursos es más compleja que la asignación dado que habitualmente acarrea agravios para las aplicaciones cuyos recursos se revocan.
En sistemas convencionales es el SO el que decide de forma inapelable qué recursos y a quién deben revocarse. En la mayoría de los casos las aplicaciones ni siquiera pueden percatarse de la revocación y toman sus decisiones ignorantes de este hecho. La ignorancia de las aplicaciones ante la revocación es una causa de problemas derivados de falsas suposiciones sobre la misma.
Consiguientemente, en Off hemos optado por el uso de revocación
explícita, en la que el
kernel permite que las aplicaciones conozcan
cuando y qué recursos se les van a revocar. Hay también algunos SO
adaptables que se comportan de este modo, aunque otros no permiten a
las aplicaciones tener conocimiento de revocaciones. Sólo unos pocos
SO adaptables permiten a las aplicaciones participar en la decisión
de revocación.
Las preguntas que hay que contestar para diseñar un mecanismo de revocación de recursos son (ver tabla 2.1):
| ¿Cuando? | ¿Quién? | ¿Ámbito? | ¿Cómo? | |
| SO monolítico | siempre | kernel | sistema | implícita |
| siempre | | sistema | implícita | |
| exokernel | en demanda | kernel+aplicación | aplicación | explícita |
| DAMN | en demanda | aplicación | aplicación | explícita |
No obstante, en sistemas monolíticos y
kernels no adaptables la
situación suele ser aún más dictatorial ya que en ciertas
ocasiones el sistema reclama recursos incluso cuando no es necesario
hacerlo.
En Off el
kernel dispara un suceso de revocación cuando hay
peticiones de asignación que no pueden satisfacerse, esto es, cuando
no hay más unidades libres del recurso que consideremos. En aquellos
casos en que desee mantenerse un porcentaje libre de un tipo de
recurso dado deberían ser las propias aplicaciones las que iniciasen
la revocación.
En
kernels adaptables, exokernels y DAMNs las aplicaciones suelen
participar en la elección de recursos a revocar. En Off el
kernel
sólo dispara un suceso de revocación como vimos en el punto
anterior. La decisión está distribuida por completo entre las
aplicaciones involucradas, como veremos al final de este apartado.
Tradicionalmente el SO revoca los recursos que él controla. En SSOO
distribuidos basados en
kernel éste revoca recursos restringidos a
un nodo, con independencia de la aplicación que los utiliza. Esta
revocación puede ser adecuada en relación a la disponibilidad de
recursos locales aunque, en muchas ocasiones, puede no ser la
óptima considerando todos los nodos involucrados.
En exokernels los recursos se revocan también localmente, dentro del nodo considerado. En este caso las aplicaciones pueden decidir qué unidades liberar del recurso revocado.
En DAMNs el
kernel no revoca recursos, tan sólo dispara sucesos de
revocación. Las aplicaciones deberán recurrir a algún mecanismo de
arbitraje que permita seleccionar los recursos a revocar. En este
caso es posible que dicho arbitraje actúe de forma diferente en
función de las circunstancias, operando localmente en unos casos y
globalmente en otros.
Considerando ahora el caso de un DAMN, la revocación se basa en los siguientes puntos:
Como puede verse, Off sólo dispara un evento de revocación para
un recurso determinado cuando alguna petición de asignación no puede
satisfacerse. El
kernel ha concluido con eso su trabajo.
En el caso de aplicaciones que compiten por un recurso será el árbitro el que establezca un reparto adecuado del mismo entre ellas. En general, la revocación de los recursos en un nodo podría proceder como sigue:
Si las aplicaciones funcionan correctamente este sistema no causa problemas. Si las aplicaciones se comportan con malicia o error la responsabilidad de revocar los recursos cae ahora en el árbitro. Este árbitro puede incorporar un esquema de liberación mixto similar al empleado en Aegis: