Código en C++: Simulación de Particiones de Memoria
A continuación, un código en C++ que simula el funcionamiento simplificado de las particiones de memoria:
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm> // Para std::find_if
using namespace std;
// Función para comprobar si una tarea con el mismo nombre y tamaño ya existe
bool tareaExiste(const vector<string>& RAM, const queue<pair<string, int>>& tareas_pendientes, const string& tarea, int tamaño_tarea) {
// Verificar en la RAM
for (const auto& ram_tarea : RAM) {
if (ram_tarea.find(tarea) != string::npos && ram_tarea.find(to_string(tamaño_tarea)) != string::npos) {
return true;
}
}
// Verificar en la cola de tareas pendientes
queue<pair<string, int>> temp = tareas_pendientes;
while (!temp.empty()) {
if (temp.front().first == tarea && temp.front().second == tamaño_tarea) {
return true;
}
temp.pop();
}
return false;
}
int main() {
vector<string> RAM(6, " - "); // Incluyendo el sistema operativo
RAM[0] = "Sistema Op: "; // Asignando el sistema operativo
vector<int> Particiones = {10, 30, 40, 50, 70}; // Tamaños de particiones
queue<pair<string, int>> tareas_pendientes;
int x = 1;
int op;
while (x != 0) {
cout << "\n1. Ingresar otra tarea." << endl;
cout << "2. Finalizar una tarea." << endl;
cout << "3. Mostrar Memoria." << endl;
cout << "4. Mostrar Cola de Tareas Pendientes." << endl;
cout << "5. Salir." << endl;
cout << "-> Ingrese la opción que desea realizar: ";
cin >> op;
switch (op) {
case 1: {
string tarea;
int tamaño_tarea;
cout << "-> Ingrese el nombre de la tarea: ";
cin >> tarea;
cout << "-> Ingrese el tamaño de la tarea: ";
cin >> tamaño_tarea;
// Verificar si la tarea con el mismo nombre y tamaño ya existe
if (tareaExiste(RAM, tareas_pendientes, tarea, tamaño_tarea)) {
cout << "Error: Una tarea con el mismo nombre y tamaño ya existe." << endl;
break;
}
bool tarea_asignada = false;
// Verificar si hay espacio en RAM para la nueva tarea
for (int i = 1; i <= 5; i++) {
if (RAM[i] == " - " && tamaño_tarea <= Particiones[i - 1]) {
if (tamaño_tarea == Particiones[i - 1]) {
RAM[i] = tarea + " (ocupó todo el tamaño)";
} else {
RAM[i] = tarea + " (ocupó " + to_string(tamaño_tarea) + "k de " + to_string(Particiones[i - 1]) + "k)";
}
tarea_asignada = true;
break;
}
}
// Si no hay espacio en RAM, se agrega a la cola de tareas pendientes
if (!tarea_asignada) {
cout << "// La tarea no cabe en ninguna partición, disminuya el tamaño o elimine tareas." << endl;
tareas_pendientes.push(make_pair(tarea, tamaño_tarea));
}
break;
}
case 2: {
cout << "Ingrese el nombre de la tarea que desea finalizar: ";
string nombre_fin;
cin >> nombre_fin;
bool tarea_eliminada = false;
for (int i = 1; i <= 5; i++) {
if (RAM[i] == nombre_fin || RAM[i].find(nombre_fin) != string::npos) {
RAM[i] = " - "; // Liberar la partición
tarea_eliminada = true;
// Revisar si alguna tarea pendiente cabe en la partición liberada
queue<pair<string, int>> temp; // Para almacenar tareas que no se puedan asignar
while (!tareas_pendientes.empty()) {
pair<string, int> tarea_pendiente = tareas_pendientes.front();
tareas_pendientes.pop(); // Sacar la tarea para revisar
if (tarea_pendiente.second <= Particiones[i - 1]) {
// La tarea cabe en esta partición
if (tarea_pendiente.second == Particiones[i - 1]) {
RAM[i] = tarea_pendiente.first + " (ocupó todo el tamaño)";
} else {
RAM[i] = tarea_pendiente.first + " (ocupó " + to_string(tarea_pendiente.second) + "k de " + to_string(Particiones[i - 1]) + "k)";
}
break; // Se asignó una tarea pendiente
} else {
// Si no cabe, guardarla en la cola temporal
temp.push(tarea_pendiente);
}
}
// Restaurar la cola de tareas pendientes
while (!temp.empty()) {
tareas_pendientes.push(temp.front());
temp.pop();
}
break; // Salir del bucle una vez eliminada la tarea
}
}
if (!tarea_eliminada) {
cout << "Tarea no encontrada." << endl;
}
break;
}
case 3: {
cout << "\nEstado de la memoria RAM: ";
for (int i = 1; i <= 5; i++) {
cout << RAM[i] << ", ";
}
cout << endl;
break;
}
case 4: {
cout << "Las tareas que están en espera son: ";
queue<pair<string, int>> temp = tareas_pendientes;
while (!temp.empty()) {
cout << temp.front().first << " (tamaño: " << temp.front().second << "), ";
temp.pop();
}
cout << endl;
break;
}
case 5:
x = 0; // Salir del programa
break;
default:
cout << "Opción inválida." << endl;
break;
}
}
return 0;
}
Comentarios
Publicar un comentario