HY150a Φροντιστήριο 3 24/11/2017 1
Assignment 3 Overview Το πρόγραμμα ζητείται να διαβάζει μια λίστα δεδομένων που περιγράφει τα διαθέσιμα τμήματα μνήμης (blocks) ενός ΗΥ. Το πρόγραμμα ζητείται να μεταφορτώνει μια μικρή βάση δεδομένων από αρχείο να την παρουσιάζει στο χρήστη να του δίνει τη δυνατότητα να την επεξεργάζεται να την αποθηκεύει για μεταγενέστερη χρήση Για την αναπαράσταση και της δομής δεδομένων μπορείτε να χρησιμοποιήσετε το C/C++ struct για την δημιουργία μιας λίστας 2
Assignment 3 Overview Η αναπαράσταση των διαθέσιμων τμημάτων(block) μνήμης έχει την εξής μορφή: int blockid; // id του συγκεκριμένου block (1,2,3,...,Ν) int blocksize; // το μέγεθος των διαθέσιμων bytes του συγκεκριμένου block bool allocated; // διαθεσιμότητα του συγκεκριμένου block (true Ή false) string processname; // το όνομα της διεργασίας που καταλαμβάνει το συγκεκριμένο block int processsize; // εάν το συγκεκριμένο block είναι κατειλημμένο, το μέγεθος των bytes της διεργασίας που το καταλαμβάνει (<= blocksize) 3
Assignment 3 Overview Το πρόγραμμα ζητείται να εμφανίζει μια γραμμή εντολών (command prompt) με την οποία ο χρήστης θα μπορεί να δίνει εντολές για τη διαχείριση της δομής δεδομένων. Οι εντολές που ζητείται να μπορούν να δοθούν στη γραμμή εντολών είναι: mread filename print pread [process1-name, process1-size,..., processn-name, processn-size,] insert [blockid,blocksize] ff free processname delete blockid save quit 4
mread filename Ανάγνωση του αρχείου με όνομα filename και αναπαράσταση των στοιχείων του σε μία λίστα δεδομένων. Π.χ. mread MemBlock.txt Sample File MemBlock.txt 1,600,false,NULL,0 2,250,false,NULL,0 3,280,false,NULL,0 4,390,false,NULL,0... N,1250,false,NULL,0 Example 1,600,false,NULL,0 blockid = 1; blocksize = 600; allocated = false; processname = NULL; processsize = 0; 5
File I/O #include <iostream> #include <fstream> using namespace std; http://www.cplusplus.com/doc/tutorial/files / 6
print Εκτύπωση των στοιχείων της δομής με την μορφή [blockid], [allocated], [blocksize], [processname], [processsize] Example >print [1],[600],[false],[NULL],[0] [2],[250],[false],[NULL],[0] [3],[280],[false],[NULL],[0] [4],[390],[false],[NULL],[0]... [N],[250],[false],[NULL],[0] 7
pread [process1-name, process1-size,.., processn-name, processn-size,] Δήλωση ονομάτων και μεγεθών των διεργασιών που πρέπει να φορτωθούν στη δομή. Π.χ pread p1 100 p2 300 p3 250!!!Ο χρήστης μπορεί να δηλώσει όσες διεργασίες θέλει!!!κάθε νέα εντολή pread ακυρώνει την προηγόυμενη Μπορείτε να αποθηκεύσετε τις μεταβλητές της εντολής pread σε όποια μεταβλητή/δομή θέλετε 8
insert [blockid,blocksize] Χειροκίνητη εισαγωγή ενός νέου καινούργιου block στη λίστα. Π.χ insert 6 450 Δημιουργία ενος νέου κόμβου με στοιχεία blockid=6 blocksize=450 allocated=false processname=null processsize=0 και εισαγωγή στην λίστα 9
ff //First-Fit algorithm Μεταφόρτωση των δηλωμένων διεργασιών στη δομή χρησιμοποιώντας τον αλγόριθμο first-fit. Σε περίπτωση που μια διεργασία δεν μπορεί να φορτωθεί, διότι δεν υπάρχει κατάλληλο block από τα διαθέσιμα, τότε θα πρέπει να δεσμευτεί ένα νέο block από το αδιάθετο τμήμα μνήμης. Το block αυτό ζητείται να έχει blocksize ίσο με το size της διεργασίας για την οποία γίνεται η αίτηση. 10
First-Fit Example Εισαγωγή στο πρώτο διαθέσιμο block με block->processsize >=process-size 11
free processname Απελευθέρωση του block μνήμης το οποίο περιλαμβάνει την διεργασία με όνομα processname. Μετά την απελευθέρωση, το συγκεκριμένο block μπορεί να χρησιμοποιηθεί για την δέσμευση καινούργιας διεργασίας. Κατά την εκτέλεση της εντολής θα πρέπει να ενημερώνονται κατάλληλα οι τιμές των μεταβλητών allocated, processname, processsize του block. 12
More commands delete blockid Διαγραφή του block μνήμης με το συγκεκριμένο blockid από την δομή save Αποθήκευση της δομής στο αρχείο NewMemblocks.txt quit Τερματισμός προγράμματος 13
bf // Best-Fit Algorithm (Bonus 20%) Φόρτωση των διεργασιών στη δομή χρησιμοποιώντας τον αλγόριθμο bestfit. Ο αλγόριθμος best-fit βρίσκει το μικρότερο δυνατό Block το οποίο να μπορεί να αποθηκεύσει την συγκεκριμένη διεργασία Hint1: Ταξινομηση της λίστας Hint2: Εισαγωγή των κόμβων στη λίστα με βάση το processsize 14
Useful Functions void *malloc(size_t size); The malloc() function allocates size bytes and returns a pointer to the allocated memory.the memory is not initialized. void free(void *ptr); The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, if free(ptr) has already been called before, undefined behavior occurs. malloc and free are defined in the header <cstdlib> (known as <stdlib.h> in C) 15
Useful Functions char *strcpy(char *dest, const char *src); The strcpy() function copies the string pointed to by src, including the terminating null byte ('\0'), to the buffer pointed to by dest int strcmp(const char *s1, const char *s2); The strcmp() function compares the two strings s1 and s2. It returns an integer less than, equal to, or greater than zero if s1 is found, respectively, to be less than, to match, or be greater than s2 16
Structs 17
Questions? 18