logo

Crowdly

Browser

Add to Chrome

Problema del productor-consumidor con buffer acotado: El siguiente código mues...

✅ The verified answer to this question is available below. Our community-reviewed solutions help you understand the material better.

Problema del productor-consumidor con buffer acotado:

El siguiente código muestra una implementación en pseudocódigo estilo C. Asume que semWait decrementa el semáforo y bloquea si el valor es negativo, y semSignal lo incrementa y desbloquea un proceso si hay alguno esperando

 

Este programa puede llevar a una situación de interbloqueo (deadlock)? si es así, indica cuál sería la solución?

 

// Declaraciones globales

#define BUFFER_SIZE 5 // Tamaño máximo del buffer

semaphore mutex = 1; // Semáforo para exclusión mutua al acceder al buffer [2]

semaphore full = 0; // Semáforo que cuenta el número de elementos en el buffer [2]

semaphore empty = BUFFER_SIZE; // Semáforo que cuenta el número de espacios vacíos en el buffer [2]

item buffer[BUFFER_SIZE]; // Buffer circular compartido

int in = 0, out = 0; // Punteros para la gestión del buffer circular

// Función para simular la producción de un elemento

item generate_item() {

// Simula la producción

return some_data;

}

// Función para simular el consumo de un elemento

void consume_item(item data) {

// Simula el consumo

}

// Proceso Productor

void productor() {

item next_produced;

while (TRUE) {

next_produced = generate_item(); // Paso 1: Producir un elemento

semWait(empty); // Paso 2: Esperar si el buffer está lleno (no hay espacios vacíos) [2]

semWait(mutex); // Paso 3: Entrar en la sección crítica para acceder al buffer [2, 6]

// Sección crítica: añadir elemento al buffer

buffer[in] = next_produced;

in = (in + 1) % BUFFER_SIZE;

// Fin de la sección crítica

semSignal(mutex); // Paso 4: Salir de la sección crítica [2]

semSignal(full); // Paso 5: Indicar que hay un elemento más en el buffer [2]

}

}

// Proceso Consumidor

void consumidor() {

item next_consumed;

while (TRUE) {

semWait(mutex); // <--- LÍNEA CON ERROR POTENCIAL (Paso 1 del Consumidor)

semWait(full); // Paso 2: Esperar si el buffer está vacío (no hay elementos llenos) [2]

// Sección crítica: extraer elemento del buffer

next_consumed = buffer[out];

out = (out + 1) % BUFFER_SIZE;

// Fin de la sección crítica

semSignal(mutex); // Paso 3: Salir de la sección crítica [2]

semSignal(empty); // Paso 4: Indicar que hay un espacio vacío más en el buffer [2]

consume_item(next_consumed); // Paso 5: Consumir el elemento

}

}

void main() {

// Inicializar semáforos (ya hecho en las declaraciones globales)

// Lanzar procesos Productor y Consumidor en paralelo

paralelos(productor, consumidor); // Función hipotética para ejecutar hilos/procesos

}

0%
0%
0%
0%
0%
More questions like this

Want instant access to all verified answers on grado.pol.una.py?

Get Unlimited Answers To Exam Questions - Install Crowdly Extension Now!

Browser

Add to Chrome