Skip to content

Instantly share code, notes, and snippets.

@gregori
Created May 15, 2018 19:48
Show Gist options
  • Save gregori/72f9112b5897da4b23950bd2a4145299 to your computer and use it in GitHub Desktop.
Save gregori/72f9112b5897da4b23950bd2a4145299 to your computer and use it in GitHub Desktop.
Algoritmo first-fit em C
#include <stdio.h>
#define MAX 20
/**
* Algorítmo first-fit didático
* escrito em C ANSI
*/
/* tipo para o obloco de memória */
typedef struct memoria {
int tamanho;
int alocado;
int pid;
} memoria_t;
/* tipo para o processo */
typedef struct processo {
int tamanho;
int alocado;
} processo_t;
int main(int argc, char **argv) {
memoria_t blocos[MAX]; /* memória(qtde de blocos) */
processo_t processos[MAX]; /* processos */
int numero_processos, numero_blocos; /* variaveis que conterão o no de processos e de blocos */
int cproc, cblocos; /* contador para processos e blocos */
int alocado; /* flag de alocação de processo */
/* Obtem numero de blocos e seus tamanhos */
printf("Entre o número de blocos de memória: ");
scanf("%d", &numero_blocos);
for (cblocos = 0; cblocos < numero_blocos; cblocos++) {
printf("Entre o tamanho do bloco de memória %d: ", cblocos);
scanf("%d", &blocos[cblocos].tamanho);
blocos[cblocos].alocado = 0;
blocos[cblocos].pid = -1;
}
/* Obtem número de processos e seus tamanhos */
printf("Entre o número de processos: ");
scanf("%d", &numero_processos);
for (cproc = 0; cproc < numero_processos; cproc++) {
printf("Entre o tamanho do processo %d: ", cproc);
scanf("%d", &processos[cproc].tamanho);
processos[cproc].alocado = 0;
}
/* Aloca os processos */
for (cproc = 0; cproc < numero_processos; cproc++) { /* para cada processo */
alocado = 0; /* flag para verificar se o processo foi alocado */
/* itera por todos os blocos de memória até que o processo seja alocado */
for (cblocos = 0; !alocado && cblocos < numero_blocos; cblocos++) {
/* se o processo cabe no bloco */
if (processos[cproc].tamanho <= blocos[cblocos].tamanho && !blocos[cblocos].alocado) {
printf("O processo %d, com %dk foi alocado ao bloco de memória %d de espaço %dk.\n", cproc, processos[cproc].tamanho, cblocos, blocos[cblocos].tamanho);
processos[cproc].alocado = 1; /* marca o processo como alocado */
blocos[cblocos].alocado = 1; /* marca o bloco como alocado */
blocos[cblocos].pid = cproc; /* indica a alocação do processo */
alocado = 1; /* informa ao loop que precisa acabar, pois o processo foi alocado */
}
}
}
/* imprime os processos não alocados */
for (cproc = 0; cproc < numero_processos; cproc++) {
if (!processos[cproc].alocado) {
printf("O processo %d não foi alocado.\n", cproc);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment