Sistemas operativos modernos

cesitaremos una variable, cuenta. Si el búfer puede contener N elementos como máximo, el có­ digo del productor determinará primero si cuenta es N. Si lo es, el productor se desactivará; si no lo es, añadirá un elemento e incrementará cuenta. El código del consumidor es similar: primero prueba cuenta para ver si es 0. Si lo es, se desactiva; si no lo es, saca un elemento y decrementa cuenta. Además, cada proceso determi­ na si el otro debe activarse o no y, en su caso, lo activa. El código del productor y el del con­ sumidor se muestran en la figura 2-23. #define N 100 int cuenta = 0; /* ranuras en el búfer */ /* elementos en el búfer V void productor{void) { int eiem; while (TRUE) { eiem = producir_elem(); If (cuenta == N) s!eep(); insertar_elem(elem); cuenta = cuenta + 1; if (cuenta == 1) wakeup(consumidor); /* se repite indefinidamente */ /* genera el siguiente elemento V /* si el búfer está lleno, se desactiva */ /* pone un elemento en el búfer 7 /* incrementa en núm. eiem. en el búfer V /* ¿el búfer está vacío? */ void consumidor(void) { Int eiem; while (TRUE) { /* se repite indefinidamente */ if (cuenta == 0) sleep( ); /* si el búfer está vacío, se desactiva 7 eiem = sacar_elem( ); /* saca un elemento del búfer 7 cuenta = cuenta - 1; /* decrementa el núm. eiem. en el búfer 7 if (cuenta == N - 1 ) wakeup(productor); /* ¿el búfer está lleno? 7 consumir_e)em(elem): /* imprime un elemento 7 } Figura 2-23. El problema del productor-consumidor con una condición de compe­ tencia fatal. Para expresar llamadas al sistema del tipo de sieep y wakeup en C, las mostraremos co­ mo llamadas a rutinas de biblioteca. No forman parte de la biblioteca estándar de C, pero es de suponer que estarán disponibles en cualquier sistema que tenga tales llamadas al sistema. Los

RkJQdWJsaXNoZXIy MjI4NDcx