Sistemas operativos modernos
Al volver automática la exclusión mutua de las regiones críticas, los monitores hacen que la programación paralela sea mucho menos propensa a errores que con semáforos. No obstante, tie nen algunas desventajas. No es casualidad que nuestros dos ejemplos de monitores hayan estado en Pascal Simple y en Java en lugar de C, como los demás ejemplos de este libro. Como ya se ñalamos, los monitores son un concepto del lenguaje de programación. El compilador debe reco nocerlos y, de alguna manera, tramitar la exclusión mutua. C, Pascal y casi todos los demás lenguajes carecen de monitores, por lo que no sería razonable esperar que sus compiladores ha gan cumplir reglas de exclusión mutua. De hecho, ¿cómo podría el compilador saber siquiera cuáles procedimientos están en monitores y cuáles no? Esos mismos lenguajes también carecen de semáforos, pero es fácil añadirlos: lo único que necesita es incluir en la biblioteca dos rutinas cortas en lenguaje ensamblador para emitir las llamadas al sistema up y dOwn. Los compiladores ni siquiera tienen que saber que existen. Desde luego, los sistemas operativos sí necesitan tener conocimiento de los semáforos, pero si usted tiene un sistema operativo basado en semáforos, de todos modos podrá escribir progra mas de usuario para él en C o C++ (o incluso lenguaje ensamblador, si se es lo bastante maso- quista). Para usar monitores necesita un lenguaje que ya los tenga integrados. Otro problema con los monitores, y también con los semáforos, es que fueron diseñados pa ra resolver el problema de la exclusión mutua en una o más CPUs, las cuales tienen acceso a una memoria común. Al colocar los semáforos en la memoria compartida y protegerlos con ins trucciones TSL, podemos evitar las competencias. Cuando pasamos a un sistema distribuido que consta de varias CPUs, cada una con su propia memoria privada y conectadas por una red local, ya no pueden usarse estas primitivas. La conclusión es que los semáforos son de nivel demasia do bajo y los monitores con muy pocos lenguajes de programación. Además, ninguna de estas primitivas considera el intercambio de información entre máquinas. Necesitamos algo más. 2.3.8 Transferencia de mensajes Ése algo más es la transferencia de mensajes. Este método de comunicación entre procesos utiliza dos primitivas, send y receive, que, al igual que los semáforos y a diferencia de los monitores, son llamadas al sistema, no construcciones del lenguaje. Como tales, pueden in cluirse con facilidad en procedimientos de biblioteca como send(destino, &mensaje): receive(origen, &mensa]e); La primera llamada envía un mensaje a un destino dado y la segunda recibe un mensaje de un origen dado (o de ANY —cualquiera—, si al receptor no le importa el origen). Si no hay men sajes disponibles, el receptor puede bloquearse hasta que llegue uno, o bien, regresar de inme diato con un código de error.
RkJQdWJsaXNoZXIy MjI4NDcx