<commit_before>Τι αλλάξαμε στον SLOB allocator:
	Αλλάξαμε το Next Fit για τα pages σε Best Fit.
	Αλλάξαμε το First Fit για τα blocks σε Best Fit.
	Στην ουσία, πλέον όταν ο SLOB θέλει να δεσμεύσει μνήμη, σαρώνει γραμμικά
	την (κατάλληλη) λίστα με τα free pages και ψάχνει ποια είναι αυτή 
	που όταν τη γεμίσει θα αφήσει το μικρότερο υπόλοιπο(με το κατάλληλο search για blocks)
	
	Η συνάρτηση best_fit_page που φτιάξαμε επιστρέφει το καλύτερο block size
	σε ένα δοθέν page.
	Όπως θα δείτε και στα σχόλια, παίρνει τιμές 0(exact fit), -1(δεν υπάρχει block)
	ή ένα θετικό αριθμό που δείχνει το size
	
	H συνάρτηση *slob_page_alloc που τροποποιήσαμε κάνει *allocate* το καλύτερο block
	Οι αλλαγές που κάναμε εκεί ήταν το να μην μπαίνει στο 1o διαθέσιμο block
	που μπορεί να μας εξυπηρετήσει αλλά να να κρατάμε ένα best block όσο διαπερνούμε 
	όλη τη λίστα για να βρούμε το min available size που μπορεί να εξυπηρετήσει το request.
	
	Η συνάρτηση *slob_alloc που τροποποιήσαμε διαπερνάει τις σελίδες στην κατάλληλη λίστα
	μέσω του macro "list_for_each_entry" και κρατάει την καλύτερη σελίδα στην οποία 
	πρέπει να βολέψουμε χώρο σύμφωνα με τον αλγόριθμο του Best Fit
	
	Εκτός των παραπάνω, θα βρείτε και άλλα σχόλια μέσα στον κώδικα του slob.c
	
	
3.1.5 :	"Συγκρίσεις μεταξύ First-Fit και Best-Fit"

	Πως περιμένουμε τον αλγόριθμο:
		Αλγοριθμικά κοιτώντας, περιμένουμε το Best Fit να είναι πιο αργό διότι
		διαπερνάει όλη τη λίστα, έχοντας δηλαδή μια πολυπλοκότητα τουλάχιστον ~O(n)
		αν τα blocks βρίσκονται σε μια απλά-συνδεδεμένη λίστα μεταξύ τους. )
		Αυτό μπορούμε να το επιβεβαίωσουμε καθώς η ανταπόκριση του πυρήνα μας όταν χρησιμοποιούμε
		Best Fit αντί για First Fit είναι πιο αργή.Το σύστημα μπορεί να χαρακτιρίζεται 
		από πιο 'καλή-οικονομική' δέσμευση μνήμης, όμως αυτό είναι κάτι που επιβαρύνει το σύστημα 
		στην απόδοση του.
	
	*Παρατηρηση για το 3.1.5*:
		Το πιο τρανό παράδειγμα επιβεβαίωσης του παραπάνω είναι το "βασανιστικά" αργό boot που κάνει
		o kernel μας πλέον όταν χρησιμοποιούμε τον "ακριβό" Best Fit παρά τον "φθηνό" First Fit.
		Η σύγκριση αυτή παρατηρείται εύκολα αν σκεφτούμε τα μαζικά και μεγάλα memory allocation requests που κάνει
		το λειτουργικό για να bootάρει.
	<commit_msg>fixed report + added Statistics 3.2<commit_after>Τι αλλάξαμε στον SLOB allocator:
	Αλλάξαμε το Next Fit για τα pages σε Best Fit.
	Αλλάξαμε το First Fit για τα blocks σε Best Fit.
	Στην ουσία, πλέον όταν ο SLOB θέλει να δεσμεύσει μνήμη, σαρώνει γραμμικά
	την (κατάλληλη) λίστα με τα free pages και ψάχνει ποια είναι αυτή 
	που όταν τη γεμίσει θα αφήσει το μικρότερο υπόλοιπο
	(με το κατάλληλο-αντίστοιχο linear search για blocks)
	
	H συνάρτηση *slob_page_alloc που τροποποιήσαμε κάνει *allocate* το καλύτερο block
	Οι αλλαγές που κάναμε εκεί ήταν το να μην μπαίνει στο 1o διαθέσιμο block
	που μπορεί να μας εξυπηρετήσει αλλά να να κρατάμε ένα best block όσο διαπερνούμε 
	όλη τη λίστα για να βρούμε το min available size που μπορεί να εξυπηρετήσει το request.
	
	Η συνάρτηση *slob_alloc που τροποποιήσαμε, διαπερνάει τις σελίδες στην κατάλληλη λίστα
	μέσω του macro "list_for_each_entry" και κρατάει την καλύτερη σελίδα στην οποία 
	πρέπει να βολέψουμε χώρο σύμφωνα με τον αλγόριθμο του Best Fit.
	Έχουμε μία λούπα μέσα στη λούπα του list_for_each_entry
	που διαπερνάει κάθε σελίδα και κοιτάει ποιο μπλοκ είναι το καλύτερο
	Στο τελευταίο συμβάλλουν και ο κώδικας που προσθέσαμε με τις συγκρίσεις του "fits_exact", 
	όπου παίρνει τιμές 0,-1, ή >=0 αναλόγως με το αν βρήκε τέλειο fit, αν δεν βρήκε κανένα fit, 
	ή αν βρήκε ένα block που θα έχει ένα (το καλύτερο) υπόλοιπο.Αυτό θα μπορούσε να υλοποιηθεί 
	για μεγαλύτερη ευκολία στο διάβασμα και σε μια συνάρτηση.
	
	Τέλος, αν παίξετε με τα #define (και τα σχόλια αν πρόκειται για το slob_alloc), μπορείτε
	να τρέξετε την Οriginal έκδοση του slob.c
	
	Εκτός των παραπάνω, θα βρείτε και άλλα σχόλια μέσα στον κώδικα του slob.c
	που θα σας βοηθήσουνε.
	
	
3.1.5 :	"Συγκρίσεις μεταξύ First-Fit και Best-Fit"

	Πως περιμένουμε τον αλγόριθμο:
		Αλγοριθμικά κοιτώντας, περιμένουμε το Best Fit να είναι πιο αργός διότι
		διαπερνάει όλη τη λίστα, έχοντας δηλαδή μια πολυπλοκότητα τουλάχιστον ~O(n)
		αν τα blocks βρίσκονται σε μια απλά-συνδεδεμένη λίστα μεταξύ τους. )
		
	
	*Παρατηρηση για το 3.1.5*:
		Τα προηγούμενα μπορούμε να τα επιβεβαίωσουμε καθώς η ανταπόκριση του πυρήνα μας όταν χρησιμοποιούμε
		Best Fit αντί για First Fit είναι τρομακτικά πιο αργή, λαγκάρει.Το σύστημα μπορεί να χαρακτιρίζεται 
		από πιο 'καλή-οικονομική' δέσμευση μνήμης, όμως αυτό είναι κάτι που επιβαρύνει το σύστημα 
		στην απόδοση του.
		Το πιο τρανό παράδειγμα επιβεβαίωσης του παραπάνω είναι το "βασανιστικά" αργό boot που κάνει
		o kernel μας πλέον όταν χρησιμοποιούμε τον "ακριβό" Best Fit παρά τον "φθηνό" First Fit.
		Η σύγκριση αυτή παρατηρείται εύκολα αν σκεφτούμε τα μαζικά και μεγάλα memory allocation requests που κάνει
		το λειτουργικό για να bootάρει.
	
3.2 "Λήψη στατιστικών στοιχείων"

	Για τα στατιστικά στοιχεία, χρησιμοποιήσαμε τις μεταβλητές total_free_mem και total_alloc_mem
	Τις επιστρέφουμε με τις κατάλληλες συναρτήσεις(σαν 'get' methods στον αντικειμενοστραφή προγραμματισμό)
	
	total_free_mem :το μέγεθος της μνήμης που δε χρησιμοποιήθηκε κατά την εξυπηρέτηση μιας αίτησης δέσμευσης μνήμης.
	total_alloc_mem : το μέγεθος που έχει δεσμευθεί
	
	Το total_free_mem μηδενίζεται κάθε φορά στην slob_alloc και υπολογίζεται 
	μετά από το spin_unlock συνολικά, όπως και ζητήθηκε.
	Το total_alloc_mem αλλάζει κάθε φορά στη slob_new_pages και στη slob_free_pages.
	
	Οι παραπάνω μεταβλητές, σε συνδυασμό με τα κατάλληλα syscalls kαι test programs που φτιάξαμε μας δίνουν τα παρακάτω:
	
	Για την τροποποιημένη έκδοση του Κernel: 
		Best Fit για pages, Best Fit για blocks:
		Average Allocated Mem    :	1325478   # 1251721   # 12534558  # 1261345   # 1264345  
		Average Free Mem         :	380       # 1213      # 1670      # 421	  	  #   875     
		
	Για την original έκδοση του Kernel:
		Next Fit για pages, First Fit για blocks:
		
		Average Allocated Mem 	: 	1427404   # 1336643     # 1330132    # 1335321   # 1337845   
		Average Free 			: 	2907      # 2499        # 1976       # 1184      # 1073   

	Παρατηρήσεις:
	Μπορούμε να δούμε ότι το Free Memory είναι πάρα πολύ μικρότερο στο Best Fit απ'ό,τι στο First Fit.
	Σίγουρα έχουμε fragmentation ακόμα, αλλά στην τροποποιημένη έκδοση είναι *αισθητά* λιγότερο.
	Σε αντίθεση, το "πριονίδι" στην original έκδοση του kernel μας παραμένει ακόμα 
	ένα μεγάλο πρόβλημα και η αναλογία του Allocated/Free είναι πολλές φορές μικρότερη από αυτή του Best Fit
	επιβεβαιώνοντας το *αρκετό* fragmentation που υπάρχει στην οriginal έκδοση του SLOB Allocator.

{'fraction_non_alphanumeric': 0.030718265321487727, 'fraction_numerical': 0.0197259448878181, 'mean_word_length': 4.020408163265306, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4960051', 'n_tokens_mistral': 5552, 'n_tokens_neox': 3307, 'n_words': 966}