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

Entradas más populares de este blog

Ensayo: Memoria en Informática y las Nuevas Tecnologías de IA

Perfil Profesional

Cuadro comparativo: Arquitecturas Harvard y Von Neumann.