/** * ============================================================================ * PHM Open Source — Sistemas Operacionais & Concorrência * Algoritmo 03: Simulador de Memória Virtual & Substituição de Páginas (FIFO) * Autor: Prof. Paulo Henrique Maciel · PHM Tech * ============================================================================ * * CONCEITO TEÓRICO DE S.O.: * A Memória Virtual permite que o sistema execute processos maiores que a RAM * física disponível. A memória é dividida em blocos de tamanho fixo: * - Páginas: no espaço de endereçamento lógico do processo. * - Molduras (Frames): na memória física (RAM). * * FALTA DE PÁGINA (PAGE FAULT): * Quando a CPU requisita uma página que não está na RAM, ocorre um Page Fault. * O S.O. deve buscar a página no disco e, se os frames estiverem cheios, eleger * uma página vítima para descarte usando uma política de substituição (ex: FIFO). * * COMO COMPILAR E EXECUTAR: * gcc 03_gerenciador_memoria_paginacao.c -o so_memoria && ./so_memoria * ============================================================================ */ #include #include #define NUM_FRAMES 3 // Quantidade de molduras na memória física (RAM) int main(void) { // Sequência de referências de páginas requisitadas pela CPU int referencias[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2}; int totalRefs = sizeof(referencias) / sizeof(referencias[0]); int frames[NUM_FRAMES]; int ponteiroFifo = 0; int pageFaults = 0; int pageHits = 0; // Inicializa todos os frames como vazios (-1) for (int i = 0; i < NUM_FRAMES; i++) { frames[i] = -1; } printf("====================================================\n"); printf(" PHM TECH — S.O. · MEMORIA VIRTUAL E PAGINACAO (FIFO)\n"); printf(" Total de Frames na RAM = %d \n", NUM_FRAMES); printf("====================================================\n\n"); printf("Passo a Passo da Alocacao na RAM:\n"); printf("----------------------------------------------------\n"); printf(" Pagina Ref. | Frame 0 | Frame 1 | Frame 2 | Status \n"); printf("----------------------------------------------------\n"); for (int i = 0; i < totalRefs; i++) { int paginaAtual = referencias[i]; bool paginaEncontrada = false; // 1. Verifica se a página já está carregada em algum frame (Page Hit) for (int f = 0; f < NUM_FRAMES; f++) { if (frames[f] == paginaAtual) { paginaEncontrada = true; pageHits++; break; } } printf(" %2d |", paginaAtual); // 2. Se NÃO está na RAM, ocorre PAGE FAULT (Falta de Página) if (!paginaEncontrada) { frames[ponteiroFifo] = paginaAtual; ponteiroFifo = (ponteiroFifo + 1) % NUM_FRAMES; // Avança fila circular FIFO pageFaults++; for (int f = 0; f < NUM_FRAMES; f++) { if (frames[f] != -1) printf(" %2d |", frames[f]); else printf(" -- |"); } printf(" [PAGE FAULT]\n"); } else { for (int f = 0; f < NUM_FRAMES; f++) { if (frames[f] != -1) printf(" %2d |", frames[f]); else printf(" -- |"); } printf(" [HIT / RAM]\n"); } } printf("----------------------------------------------------\n\n"); printf("Estatisticas Finais da Memoria Virtual:\n"); printf(" -> Total de Requisicoes da CPU : %d\n", totalRefs); printf(" -> Falhas de Pagina (Page Faults): %d (%.1f%%)\n", pageFaults, (float)pageFaults / totalRefs * 100); printf(" -> Acertos na RAM (Page Hits) : %d (%.1f%%)\n", pageHits, (float)pageHits / totalRefs * 100); return 0; }