Linux操作系统实验(3)(模拟实现请求分页虚存页面替换算法)
来源:互联网 发布:私家车包车软件 编辑:程序博客网 时间:2024/06/16 16:43
数据结构:
typedef struct _Page{ // 页面 int pageID; //页号}Page;typedef struct _PageQueue{ //页面队列 Page page; struct _PageQueue* next; //下一页面}PageQueue;typedef struct _Block{ //块记录结构 Page *page; //页面 long time; //最后访问时间 int state; //页块是否空闲}Block;typedef struct _BlockQueue{ //块队列 Block block; struct _BlockQueue *next;}BlockQueue;typedef struct process{ // 进程结构 PageQueue pages; //页面 unsigned int pageLength; // 页面数}process;//进程
函数:
BlockQueue* InitializeBlockQueue(unsigned int size); //初始化主存块,把首地址返回,如果分配失败返回NULLint GetBlockQueueSize(BlockQueue *blockQueue); //获取块长度void ResetBlockQueue(BlockQueue *blockQueue); //清空块内容void PrintBlockList(BlockQueue *blockQueue, int pageID, int color); //打印块信息PageQueue* InitializePageQueue(unsigned int pageLength, int maxPageID); //初始化页面void InitializeProcess(process *proc, unsigned int pageSize, unsigned int maxPageID); //初始化进程BlockQueue* SearchPage(BlockQueue *blockQueue, Page page); //搜索特定页面BlockQueue* SearchIdleBlock(BlockQueue *blockQueue); //搜索空闲块BlockQueue* GetOldestBlock(BlockQueue *blockQueue); //取得主存中停留最久的页面,返回它的地址void FIFO(BlockQueue *blockQueue, process *proc); //先进先出算法
代码:
#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<sys/time.h>#include<unistd.h>#define BUSY 1#define IDLE 0#define blockNumber 3#define n 10int Time = 0;typedef struct _Page{ // 页面 int pageID; //页号}Page;typedef struct _PageQueue{ //页面队列 Page page; struct _PageQueue* next; //下一页面}PageQueue;typedef struct _Block{ //块记录结构 Page *page; //页面 long time; //最后访问时间 int state; //页块是否空闲}Block;typedef struct _BlockQueue{ //块队列 Block block; struct _BlockQueue *next;}BlockQueue;typedef struct process{ // 进程结构 PageQueue pages; //页面 unsigned int pageLength; // 页面数}process;//进程BlockQueue* InitializeBlockQueue(unsigned int size){ //初始化主存块,把首地址返回,如果分配失败返回NULL BlockQueue *p1, *p2; BlockQueue *block; block = NULL; for(int i = 0; i < size; ++i){ p1 = (BlockQueue*)malloc(sizeof(BlockQueue)); p1->block.time = 0; p1->block.state = 0; p1->block.page = NULL; p1->next = NULL; if(block == NULL) block = p1; else p2->next = p1; p2 = p1; } return block;}int GetBlockQueueSize(BlockQueue *blockQueue){ //获取块长度 BlockQueue *presentBlock; presentBlock = blockQueue; int blockQueueSize = 0; while(presentBlock != NULL){ blockQueueSize++; presentBlock = presentBlock->next; } return blockQueueSize;}void ResetBlockQueue(BlockQueue *blockQueue){ //清空块内容 BlockQueue *presentBlock; presentBlock = blockQueue; while(presentBlock != NULL){ presentBlock->block.page = NULL; presentBlock->block.state = IDLE; presentBlock->block.time = 0; presentBlock = presentBlock->next; }}void PrintBlockList(BlockQueue *blockQueue, int pageID, int color){ //打印块信息 BlockQueue *presentBlock; char strl[5], *str2; presentBlock = blockQueue; while(presentBlock != NULL){ if(presentBlock->block.state == IDLE) printf("| |\n"); else{ printf("| %d |\n", presentBlock->block.page->pageID); } presentBlock = presentBlock->next; } printf("\n");}PageQueue* InitializePageQueue(unsigned int pageLength, int maxPageID){ //初始化页面 srand(100); PageQueue *head; head = NULL; PageQueue *p, *q; for(int i = 0; i < pageLength; ++i){ p = (PageQueue*)malloc(sizeof(PageQueue)); p->page.pageID = (int)(rand() % (maxPageID + 1)); printf("%d ", p->page.pageID); p->next = NULL; if(head == NULL) head = p; else q->next = p; q = p; } printf("\n"); return head;}void InitializeProcess(process *proc, unsigned int pageSize, unsigned int maxPageID){ //初始化进程 printf("进程初始化:\n"); proc->pageLength = pageSize; proc->pages.next = InitializePageQueue(pageSize, maxPageID);}BlockQueue* SearchPage(BlockQueue *blockQueue, Page page){ //搜索特定页面 BlockQueue *p; int blockSize; p = blockQueue; while(p != NULL){ if(p->block.page != NULL){ if(p->block.page->pageID == page.pageID) return p; } } return NULL;}BlockQueue* SearchIdleBlock(BlockQueue *blockQueue){ //搜索空闲块 BlockQueue *p; p = blockQueue; while(p != NULL){ if(p->block.state == IDLE) return p; else p = p->next; } return NULL;}BlockQueue* GetOldestBlock(BlockQueue *blockQueue){ //取得主存中停留最久的页面,返回它的地址 BlockQueue *p; p = blockQueue; if(p == NULL) return p; int cnt = 0, cur = 0; int t = p->block.time; while(p != NULL){ if(t > p->block.time){ t = p->block.time; cur = cnt; } p = p->next; cnt++; } BlockQueue *q; q = blockQueue; cnt = 0; while(q != NULL){ if(cnt == cur) return q; q = q->next; cnt++; }}void FIFO(BlockQueue *blockQueue, process *proc){ //先进先出算法 int blockQueueSize = GetBlockQueueSize(blockQueue); PageQueue *currentPage; currentPage = proc->pages.next; BlockQueue *p; p = blockQueue; int count = 0, cnt = 0; while(currentPage != NULL){ int ok = 0; p = blockQueue; Time++; while(p != NULL){ if(p->block.page !=NULL && p->block.page->pageID == currentPage->page.pageID){ ok = 1; break; } p = p->next; } if(ok){ PrintBlockList(blockQueue, currentPage->page.pageID, 0); } else{ BlockQueue *block; block = SearchIdleBlock(blockQueue); if(block != NULL){ block->block.state = BUSY; block->block.time = Time; block->block.page = (Page*)malloc(sizeof(Page)); block->block.page->pageID = currentPage->page.pageID; PrintBlockList(blockQueue, currentPage->page.pageID, 1); } else{ BlockQueue *block; block = GetOldestBlock(blockQueue); block->block.time = Time; block->block.page->pageID = currentPage->page.pageID; PrintBlockList(blockQueue, currentPage->page.pageID, 2); } } currentPage = currentPage->next; cnt++; } printf("%d\n", cnt);}int main(){ int pageNumber; scanf("%d", &pageNumber); printf("Block Number : %d, Page Number : %d\n", blockNumber, pageNumber); BlockQueue *blocks; process proc; InitializeProcess(&proc, pageNumber, n); blocks = InitializeBlockQueue(blockNumber); FIFO(blocks, &proc); ResetBlockQueue(blocks); return 0;}
阅读全文
0 0
- Linux操作系统实验(3)(模拟实现请求分页虚存页面替换算法)
- 模拟实现请求分页虚存页面替换
- 操作系统实验--页面替换算法
- 操作系统实验七之内存页面置换算法实验
- 操作系统实验之最近最久未使用算法(LRU)模拟
- 请求式分页存储管理算法(操作系统)C/C++
- 操作系统实验之页面置换算法(OPT、FIFO、LRU)C++简单实现
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
- 操作系统实验(2)-- 模拟操作系统的页面置换 LRU OPT FIFO
- 模拟-页面替换算法-javascript
- (操作系统)模拟操作系统的页面置换
- 操作系统 实验二 请求分页存储器管理
- 操作系统实验 之 存储管理---------常用页面置换算法模拟实验
- 操作系统实验四 页面置换算法(fifo 算法代码------页面置换代码集合)
- 操作系统实现之内存分页机制.虚拟空间
- 操作系统实现之内存分页机制.虚拟空间
- 操作系统实验三——页面替换算法的比较研究
- 页面置换算法模拟程序实现实验报告
- 修改arcgis infowindow 放大和缩小的模板
- mysql中的undo
- Android Studio新建项目Rendering Problems警告 处理办法
- NOIP2017模拟赛(11) 总结
- ZigBee_安全模式
- Linux操作系统实验(3)(模拟实现请求分页虚存页面替换算法)
- Ubuntu或Linux下安装flash插件
- [BZOJ 4542][Hnoi2016]大数:莫队
- PAT乙级 1001. 害死人不偿命的(3n+1)猜想 (15)
- spring 配置多数据源
- 基督教是那唯一让人踏实的信仰
- JDBC(1)—Connection
- Educational Codeforces Round 24B Permutation Game 补题
- PAT乙级 1002. 写出这个数 (20)