⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 task.c

📁 solutions for some problems in Linux
💻 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 + -