Question: Please help me Encode, compile, debug the following code related to memory management. The output should be present when running the code. Thank you! NEED
Please help me Encode, compile, debug the following code related to memory management. The output should be present when running the code. Thank you! NEED ASAP
CODE:
//#include "stdafx.h" #include
using namespace std;
struct allocList { char *startAlloc; char *endAlloc; int fk_pid; allocList *nxt; };
struct procList { int pid; int jobStatus; char *startProc; char *endProc; procList *nxt; };
bool initProc(procList *&, int*, int); bool initAlloc(allocList *&, int*, int); int cmptFragmentation(procList*, allocList*); int search(procList*, int); bool reset(procList*,allocList*);
int main(int argc, _TCHAR* argv[]) { int arrMemory[] = {100, 500, 200, 300, 600}; int arrJobs[] = {212, 17, 112, 426, 500}; allocList *ptrAllocStart = NULL; procList *ptrArrProc = NULL, *ptrProcStart = NULL; initProc(ptrProcStart, arrJobs, (sizeof(arrJobs)/sizeof(int))); initAlloc(ptrAllocStart, arrMemory, (sizeof(arrMemory)/sizeof(int))); cout << "Memory Block: " << endl << "Block\tSpace" << endl; int i; for (i=0; i < sizeof(arrMemory)/sizeof(int); i++) cout << i + 1 << "\t" << arrMemory[i] << endl; cout << " Jobs: " << endl << "Job\tSize" << endl; for (i=0; i < sizeof(arrJobs)/sizeof(int); i++) cout << i + 1 << "\t" << arrJobs[i] << endl; int fragmentation = 0; fragmentation = cmptFragmentation(ptrProcStart, ptrAllocStart); allocList *memtrav = ptrAllocStart; getch(); return 0; }
bool initProc (procList *&ptrProcStart, int* ptrArrProc, int length) { int i; procList *ptrProc = ptrProcStart; procList *newprocList; for (i=0; i < length; i++) { if(ptrProc != NULL) { ptrProc -> nxt = newprocList; ptrProc = ptrProc -> nxt; ptrProc -> startProc = (char*)malloc(*(ptrArrProc + i)); ptrProc -> endProc =ptrProc -> startProc + *(ptrArrProc + i); memset(ptrProc -> startProc, 'a' + i, *(ptrArrProc + i)); ptrProc -> jobStatus = 0; ptrProc -> pid = i; ptrProc -> nxt = NULL; } else { ptrProc = newprocList; ptrProc -> startProc = (char*)malloc(*(ptrArrProc + i)); ptrProc ->endProc = ptrProc -> startProc + *(ptrArrProc + i); memset(ptrProc -> startProc, 'a' + i, *(ptrArrProc + i)); ptrProc -> jobStatus = 0; ptrProc -> pid = i; ptrProc -> nxt = NULL; ptrProcStart = ptrProc; } } return true; }
bool initAlloc (allocList *&ptrAllocStart, int *ptrArrAlloc, int length) { int i; allocList *ptrAlloc = ptrAllocStart;
for (i=0; i < length; i++) { if(ptrAlloc != NULL) cout << " First Fit: Memory Block\tSize\tJob\tInternal "<<" Fragmentation "; int j = 0; allocList *memory = ptrAlloc; while (memory != NULL) { j++; cout << "\t" << j << "\t" << memory -> endAlloc-memory -> startAlloc << "\t" << memory -> fk_pid << "\t" << memory -> endAlloc-memory -> startAlloc + *(ptrArrAlloc + i); cout<< endl; memory = memory -> nxt; } } return 0; }
int search(procList* job, int id) { int size = 0; while (job != NULL) { if (job -> pid ==id) { size = (int)(job -> endProc-job -> startProc); break; } job =job -> nxt; } return size; }
int cmptFragmentation(procList* jobs, allocList* mem) { allocList *memtrav, *temp; procList *jobtrav; jobtrav = jobs; memtrav = mem; int freespace = 0, memsize, jobsize; int i = 0; while (memtrav -> nxt != NULL) { if(memtrav -> nxt -> fk_pid==0) { freespace += (memtrav -> nxt -> endAlloc-memtrav -> nxt -> startAlloc); temp = memtrav -> nxt; memtrav -> nxt = memtrav -> nxt -> nxt; delete temp; } memtrav = memtrav -> nxt; } if (memtrav -> fk_pid == 0) { freespace += memtrav -> endAlloc-memtrav -> startAlloc; memtrav = memtrav -> nxt; } memtrav = mem; while (memtrav != NULL) { jobsize = search (jobs, memtrav -> fk_pid-1); memsize = memtrav -> endAlloc-memtrav -> startAlloc; if (memtrav -> fk_pid != 0) { memtrav -> endAlloc = memtrav -> startAlloc + jobsize; } freespace += (memsize-jobsize); memtrav = memtrav -> nxt; } memtrav = mem; allocList *newallocList; while (memtrav != NULL) { if (memtrav -> nxt==NULL) { memtrav -> nxt = newallocList; memtrav = memtrav -> nxt; memtrav -> startAlloc = (char*)malloc(freespace); memtrav -> endAlloc = memtrav -> startAlloc + freespace; memset (memtrav -> startAlloc, 0, freespace); memtrav -> fk_pid = 0; memtrav -> nxt = NULL; break; } memtrav = memtrav -> nxt; } memtrav = mem; cout << endl << endl << "Defragmentation Memory"<<"Block\tSize\tJob\tFreeSpace "; while (memtrav != NULL) { i++; cout << "\t" << i << "\t" << memtrav -> endAlloc-memtrav -> startAlloc << "\t" << memtrav -> fk_pid << "\t" << memtrav -> endAlloc-memtrav -> startAlloc- search(jobs,memtrav -> fk_pid-1) << endl; memtrav = memtrav -> nxt; } while(jobtrav != NULL) { if (jobtrav -> jobStatus==0) { cmptFragmentation (jobs, mem); } jobtrav = jobtrav -> nxt; } return 0; }
bool reset (procList* jobs, allocList* mem) { procList* tempj = jobs; allocList* tempa = mem; while (jobs -> nxt != NULL) { jobs = jobs -> nxt; free(tempj); tempj = jobs; } free(tempj); while (mem -> nxt != NULL) { mem = mem -> nxt; free(tempa); tempa = mem; } free(tempa); return true; }
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
