📄 task.c
字号:
/****************************************************************************** * task.c * This file is part of "Assignment 2: Memory Management" * Copyright (C) 2008 - c506001 (email: c506001@cse.hcmut.edu.vn ) * * Note: * ----- * These codes are used for reference, but not complete. Students can modified * them to satisfy the requirements. * * Content: * -------- * Implementation of task-related functions * * System and Networking Department * Faculty of Computer Science and Engineering * Ho Chi Minh City University of Technology ******************************************************************************/#include <stdlib.h>#include <string.h>#include "sys.h"/** * addTask2List: add a task to a list of tasks * @taskList: list of tasks * @task: task will be added * * @return: always 0 **/int addTask2List(struct TaskList *taskList, struct Task *task) { if (taskList->first == NULL) { taskList->first = task; task->next = task; task->prev = task; } else { struct Task *last = taskList->first->prev; last->next = task; task->next = taskList->first; taskList->first->prev = task; task->prev = last; } taskList->nTasks++; return 0;}/** * removeTask: remove a task out of list * @taskList: list of tasks * @task: task will be removed * * @return: always 0 **/int removeTask(struct TaskList *taskList, struct Task *task){ (task->prev)->next = task->next; (task->next)->prev = task->prev; taskList->nTasks--; if (taskList->nTasks == 0) { taskList->first = NULL; } else if (taskList->first == task) { taskList->first = task->next; } /* free Task */ free(task); return 0;}/** * getFrameFromMem: from logical address, find the appropriate frame * @task: task * @memAddr: logical address * * @return: a pointer to appropriate page **/struct PageStatus* getFrameFromMem(struct Task *task, int memAddr){ int section; int page; int pageTblOffset; struct PageTable *pageTbl; section = (memAddr >> N_OFFSET_BITS); page = section & ((1 << N_PAGE_BITS) - 1); // get page number section = (section >> N_PAGE_BITS); // get section number pageTblOffset = task->sectionTbl->elems[section]; pageTbl = &(task->pageTbl[pageTblOffset]); return &(pageTbl->elems[page]);}/** * getFrameFromPage: from (section, page), find the appropriate frame * @task: task * @section: the first 10bit in logical address * @page: the next 10bit in logical address * * @return: a pointer to appropriate page **/struct PageStatus* getFrameFromPage(struct Task *task, int section, int page){ int pageTblOffset = task->sectionTbl->elems[section]; struct PageTable *pageTbl = &(task->pageTbl[pageTblOffset]); return &(pageTbl->elems[page]);}/** * updatePage: using a frame for a page * @page: page * @frame: frame * * @return: always 0 **/int updatePage(struct PageStatus *page, int frame, int pid, int memAddr, FILE *outFile){
// printf("Updating Page...\n"); page->frame = frame; page->state = VALID; /* Do something more if necessary */
page->lastAccessTime = 1; // not necessary
int section;
int p;
section = (memAddr >> N_OFFSET_BITS);
p = section & ((1 << N_PAGE_BITS) - 1); // get page number
section = (section >> N_PAGE_BITS); // get section number
fprintf(outFile,"SETVALID %d %d %d %d\n",pid, section, p, frame);
return 0;}/** * findUnusedPage: in a task, find the first INVALID page * @task: task * * @return: the first INVALID page **/struct PageStatus *findUnusedPage(struct Task *task){ struct PageStatus *page = NULL; int i = 0; int j = 0; for (i = 0; i < (1 << N_SECTION_BITS); i++) { for (j = 0; j < (1 << N_PAGE_BITS); j++) { page = getFrameFromPage(task, i, j); if (page->state == INVALID) { return page; } } } return NULL;}/** * initTask: initialize values of fields in task * @task: task **/int initTask(struct Task *task){ memset(task, 0, sizeof(struct Task)); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -