From cec685ff8647ab65de53096453e0843de0e25206 Mon Sep 17 00:00:00 2001 From: augustin64 Date: Sat, 9 Mar 2024 18:59:49 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20TD5:=20Loin=20d'=C3=AAtre=20parfait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TD/TD5/sujet.pdf | Bin 0 -> 63514 bytes TD/TD5/td5_lucas/Makefile | 17 ++++ TD/TD5/td5_lucas/bash.md | 11 +++ TD/TD5/td5_lucas/src/alloc.c | 128 +++++++++++++++++++++++++++ TD/TD5/td5_lucas/src/include/alloc.h | 52 +++++++++++ TD/TD5/td5_lucas/src/main.c | 30 +++++++ 6 files changed, 238 insertions(+) create mode 100644 TD/TD5/sujet.pdf create mode 100644 TD/TD5/td5_lucas/Makefile create mode 100644 TD/TD5/td5_lucas/bash.md create mode 100644 TD/TD5/td5_lucas/src/alloc.c create mode 100644 TD/TD5/td5_lucas/src/include/alloc.h create mode 100644 TD/TD5/td5_lucas/src/main.c diff --git a/TD/TD5/sujet.pdf b/TD/TD5/sujet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..69fa8b10105f0c92d7c98684770ac7b6a991900c GIT binary patch literal 63514 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󎿡p=9ddIbf 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 uw9C`u`VY6hmxTCy;WaN~ +#include + +#include "include/alloc.h" + + +linked_list* init_linked_list(void* start, size_t page_size, int page_count, int start_key) { + if (page_count == 0) + return NULL; + + linked_list* list = malloc(sizeof(linked_list)); + list->page = malloc(sizeof(PageInfo)); + + list->page->key = start_key; + list->page->start = start; + + list->next = init_linked_list(start+page_size, page_size, page_count-1, start_key+1); + + return list; +} + +int size(linked_list* l) { + if (!l) + return 0; + + return 1+size(l->next); +} + +mmap* init() { + mmap* m = malloc(sizeof(mmap)); + + m->memory = (void*)malloc(PAGE_SIZE*INITIAL_PAGE_COUNT); + m->page_count = 0; + m->swap = fopen(SWAP_FILE, "w+"); + m->alloc = NULL; + m->free = NULL; + + return m; +} + +PageInfo* page_alloc(mmap* mmap) { + if (mmap->page_count == INITIAL_PAGE_COUNT) + FAIL("Plus d'espace disponible"); + + PageInfo* p = malloc(sizeof(PageInfo)); + p->key = mmap->page_count; + p->start = mmap->memory+p->key*PAGE_SIZE; + mmap->page_count++; + + for (int i=0; i < PAGE_SIZE; i++) { + *(char*)(p->start+i) = '\0'; + } + + linked_list* l = malloc(sizeof(linked_list)); + l->next = mmap->alloc; + l->page = p; + + mmap->alloc = l; + return p; +} + +PageInfo* page_free(mmap* mmap) { + if (!mmap->free) { + FAIL("No more pages available\n"); + } + linked_list* l = mmap->free; + mmap->free = mmap->free->next; + l->next = mmap->alloc; + mmap->alloc = l; + + return l->page; +} + +int check_page_free_list(mmap* mmap) { + return size(mmap->free); +} + +int check_page_alloc(mmap* mmap) { + return size(mmap->alloc); +} + +void move_to_swap(mmap* mmap, int id_page) { + linked_list* prev = NULL; + linked_list* current = mmap->alloc; + while (current && current->page->key != id_page) { + prev = current; + current = current->next; + } + if (!current) { + FAIL("Page not found\n"); + } + + if (prev) { + prev->next = current->next; + } else { + mmap->alloc = current->next; + } + + current->next = mmap->free; + mmap->free = current; + + fseek(mmap->swap, 0, SEEK_END); + fwrite(&id_page, sizeof(int), 1, mmap->swap); + fwrite(current->page->start, PAGE_SIZE, 1, mmap->swap); + free(current); +} + +PageInfo* read_from_swap(mmap* mmap, int id_page) { + int key = -1; + fseek(mmap->swap, 0, SEEK_SET); + while (fread(&key, sizeof(int), 1, mmap->swap) && key != id_page) { + fseek(mmap->swap, PAGE_SIZE, SEEK_CUR); + } + if (key != id_page) + FAIL("Page not found\n"); + + PageInfo* p = malloc(sizeof(PageInfo)); + p->key = id_page; + p->start = malloc(PAGE_SIZE); + fread(p->start, PAGE_SIZE, 1, mmap->swap); + + linked_list* l = malloc(sizeof(linked_list)); + l->next = mmap->alloc; + l->page = p; + + mmap->alloc = l; + return p; +} diff --git a/TD/TD5/td5_lucas/src/include/alloc.h b/TD/TD5/td5_lucas/src/include/alloc.h new file mode 100644 index 0000000..ecd3916 --- /dev/null +++ b/TD/TD5/td5_lucas/src/include/alloc.h @@ -0,0 +1,52 @@ +#ifndef DEF_ALLOC_H +#define DEF_ALLOC_H +#include + +#define FAIL(s) { fprintf(stderr, (s)); exit(EXIT_FAILURE); } + +#define SWAP_FILE "/tmp/archisys.swap" +#define INITIAL_PAGE_COUNT 80 +#define PAGE_SIZE 64 + +typedef struct PageInfo { + void* start; + int key; +} PageInfo; + +typedef struct linked_list { + PageInfo* page; + struct linked_list* next; +} linked_list; + +typedef struct mmap { + linked_list* free; + linked_list* alloc; + void* memory; + FILE* swap; + int page_count; +} mmap; + +/* cette fonction initialise l'allocateur de mémoire. Elle génère les structures de données nécessaires pour gérer la +mémoire. De plus, elle alloue un "grand" espace mémoire que vous utiliserez pour émuler votre mémoire physique (évidemment, vous ne +travaillerez pas avec votre vraie mémoire physique */ +mmap* init(); + +/* cette fonction alloue une page physique. NOTE : la fonction doit remplir la totalité +de la page physique retournée avec des octets '\0'. */ +PageInfo* page_alloc(mmap* mmap); + +/* renvoie une page dans la liste des pages libres. */ +PageInfo* page_free(mmap* mmap); + +/* renvoie le nombre de pages libres */ +int check_page_free_list(mmap* mmap); + +int check_page_alloc(mmap* mmap); + +/* déplace une page vers votre swap émulé. Le swap doit être un fichier appelé (vous l'avez deviné) swap. Vous pouvez stocker ce fichier n'importe où dans votre système de fichiers (je suggère de le stocker dans le dossier /tmp/). */ +void move_to_swap(mmap* mmap, int id_page); + +/* Lit une page du swap et la supprime. */ +PageInfo* read_from_swap(mmap* mmap, int id_page); + +#endif diff --git a/TD/TD5/td5_lucas/src/main.c b/TD/TD5/td5_lucas/src/main.c new file mode 100644 index 0000000..d098de1 --- /dev/null +++ b/TD/TD5/td5_lucas/src/main.c @@ -0,0 +1,30 @@ +#include + +#include "include/alloc.h" + + +int main() { + mmap* m = init(); + + page_alloc(m); + page_alloc(m); + + PageInfo* p = page_alloc(m); + + for (int i=0; i < PAGE_SIZE; i++) { + *(char*)(p->start+i) = (i+20)%200; + } + + int key = p->key; + move_to_swap(m, key); + + for (int i=0; i < PAGE_SIZE; i++) { + *(char*)(p->start+i) = 0; + } + + p = read_from_swap(m, key); + + for (int i=0; i < PAGE_SIZE; i++) { + assert((i+20)%200 == *(char*)(p->start+i)); + } +}