/************************************************************************/
/* */
/* The 3rd experiment of OS course */
/* */
/* LUO Pengkui (SS31,2003010655) */
/* */
/* 2005-12-19 */
/* */
/* */
/************************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/************************************************************************/
struct Mem_page {
int flag;
int next;
int pre;
int m_page;
int pg_index;
} mem_page[1024]={{0,0,0,0,0}};
int swap_page[1024]={0};
unsigned long dir[1024]={0};
unsigned long page[1024][1024]={0};
int swapout,nrout,nrin;
int head=0;
int tail=1023;
/************************************************************************/
int swap_out()
{
int i;
for(i=0;i<1024;i++)
if (!swap_page[i]) break;
if (i>=1024) printf("ERROR OCCURS!\n");
else {
swap_page[i]=1;
page[mem_page[tail].pg_index][mem_page[tail].m_page]=(i<<22)|2;
nrout=i;
}
return i;
}
void visit_page(int i)
{
if (i!=head) {
mem_page[mem_page[i].pre].next=mem_page[i].next;
mem_page[i].next=head;
mem_page[head].pre=i;
if (i==tail) tail=mem_page[i].pre;
head=i;
}
head=i;
}
unsigned long get_freepage(int pg_index,int m_page,int* pswap)
{
unsigned long i;
if(mem_page[tail].flag) *pswap=swap_out();
else *pswap=-1;
i=tail;
swapout=tail;
mem_page[tail].flag=1;
mem_page[tail].pg_index=pg_index;
mem_page[tail].m_page=m_page;
visit_page(tail);
return i;
}
unsigned long genRan()
{
unsigned long res=0;
for (int i=10; i<=32; i++) res = res=(res<<1)+rand()%2;
return res;
}
/************************************************************************/
void main()
{
FILE * f;
int i,j,k;
unsigned long vAddr;
unsigned long pgd,pte;
int m_index=0;
int m_page=0;
int pg_index=0;
int nr;
/* initialization */
for(i=0;i<1024;i++) {
mem_page[i].next=i+1;
mem_page[i].pre=i-1;
}
srand((unsigned)time( NULL));
f=fopen("out.txt","w");
fprintf(f,"RefAddr \tPgd \t\tPte \t\tSwap_nr \n");
for(i=0;i<8192;i++)
{
vAddr=genRan();
m_index=vAddr>>22;
m_page=(vAddr>>12) & 1023;
if (!(dir[m_index]&1)) /* if last bit of m_index==0, table misses */
{
pgd = (m_index<<22) | 1;
dir[m_index]=pgd;
}
pgd=dir[m_index];
pg_index=pgd>>22;
j=(page[pg_index][m_page]<<30) >>30; /* last 2 bits of page */
k=page[pg_index][m_page]>>22; /* first 10 bits */
switch(j)
{
case 2: /* page on the swap page */
pte=(get_freepage(pg_index,m_page,&nr)<<22)|1;
page[pg_index][m_page]=pte;
swap_page[k]=0;
nrin=k;
break;
case 0: /* no mapping mem */
pte=(get_freepage(pg_index,m_page,&nr)<<22)|1;
page[pg_index][m_page]=pte;
break;
default: /* ==1, already point to a page */
pte=page[pg_index][m_page];
visit_page(k);
nr=-1;
}
if (nr==-1) fprintf(f,"%8X \t%8X \t%8X \t\t-1\n",vAddr,pgd,pte);
else fprintf(f,"%8X \t%8X \t%8X \t%8X\n",vAddr,pgd,pte,nr);
}
fclose(f);
}
/************************************************************************/
Linux内存管理模拟器.rar_Linux C语言_二级页表模拟_内存分页管理_内存管理模拟_数学建模
版权申诉
127 浏览量
2022-09-23
22:47:42
上传
评论 1
收藏 4KB RAR 举报
小贝德罗
- 粉丝: 65
- 资源: 1万+
最新资源
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
- 基于单片机的风力发电机转速控制源码
- 基于C++实现的风力发电气动平衡监测系统+源代码+测量数据(高分课程设计)
- 毕业设计- 基于STM32F103C8T6 单片机,物联网技术的太阳能发电装置+源代码+文档说明+架构图+界面截图
- 基于 LSTM(长短期记忆)(即改进的循环神经网络)预测风力发电厂中风力涡轮机产生的功率+源代码+文档说明
- 基于stm32f103+空心杯电机+oled按键+运动算法
- 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.1-1.4)
- 基于python实现的水下压缩空气储能互补系统建模仿真与经济效益分析+源代码+论文
- 华中科技大学-自然语言处理实验,Bi-LSTM+CRF的中文分词框架,并且利用基于深度学习的方法进行中文命名实体识别++源码报告
- 基于动态罚函数的铁路车流分配与径路优化模型python源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈