Sistemas operativos modernos
números de dispositivo principal y secundario y los usa como índices de la tabla de contro ladores apropiada para localizar el controlador de dispositivo. Esta indirección facilita la recon- figuración del sistema, porque los programas manejan nombres de dispositivo simbólicos, no nombres de controladores de dispositivo. Un ejemplo más de indirección se presenta en los sistemas que transfieren mensajes y que dan un buzón en vez de un proceso como desfino del mensaje. Al efectuar indirección por me dio de buzones (en vez de dar un nombre de proceso como destino), es posible lograr una fle- xibfiidad considerable (por ejemplo, hacer que una secretaria se encargue de los mensajes de su jefe). En cierto sentido, el uso de macros como #define PRO C _ T A B L E _ S IZ E 256 también es una forma de indirección, porque el programador puede escribir código sin tener que saber qué tamaño fiene en realidad la tabla. Es recomendable asignar nombres simbólicos a todas las constantes (excepto, a veces, —1, Oy 1) y colocarlos en encabezados con comenta rios que expliquen para qué sirven. Reusabilídad A menudo es posible reutilizar el mismo código en contextos un poco distintos. Esto es una buena idea porque reduce el tamaño del binario e implica que el código sólo tiene que depu rarse una vez. Por ejemplo, supongamos que se usan mapas de bits para llevar el control de los bloques libres en el disco. La administración de bloques de disco puede efectuarse con proce dimientos alloc y free que administren los mapas de bits. Como mínimo, tales procedimientos deberán funcionar con cualquier disco, pero podemos hacer algo más. Los mismos procedimientos podrían funcionar también en la administración de bloques de memoria, del caché de bloques del sistema de archivos y de nodos-i. De hecho, pueden servir para asignar y liberar cualesquier recursos que puedan numerarse de modo lineal. Reentrabílídad La reentrabilidad se refiere a la capacidad de un fragmento de código dado para ejecutarse dos o más veces de forma simultánea. En un multiprocesador siempre existe el peligro de que mientras una CPU está ejecutando algún procedimiento, otra comience a ejecutarlo también, antes de que el primero haya terminado. En este caso, dos (o más) subprocesos en diferentes CPUs podrían estar ejecutando el mismo código al mismo tiempo. Esta situación debe mane jarse con mutex o algún otro mecanismo para proteger las regiones críticas. Sin embargo, el problema también se presenta en los uniprocesadores. En particular, la ma yor parte de cualquier sistema operativo se ejecuta con las interrupciones habilitadas. Si no se hiciera así, se perderían muchas interrupciones y el sistema dejaría de ser confiable. Mientras el sistema operativo está ocupado ejecutando algún procedimiento P, es muy posible que se presente una interrupción y que el manejador de interrupciones también invoque a P. Si las es
RkJQdWJsaXNoZXIy MjI4NDcx