📄 os.txt
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>// getch()
#include<time.h>
#include<malloc.h>
#define OK 1;
#define ERROR 0;
#define PageSize 1024// 1K
typedef int Status;
typedef long address;
typedef struct LNode{
int page;//逻辑页
int phy_page;//物理块
struct LNode *next;
}PageTable,ExpTable,*LinkList;//页表、快表链式存储结构
int a[10];//随机产生10个不同的小于15的数
void produce(int no)
{int i, k=0, n=0;
for(i=0;i<no;i++)a[i]=-1;
srand((unsigned)time(NULL));
a[0]=rand()%15;
for(i=1; i<no; i++)
{loop:
a[i]=rand()%15;
for(k=0; k<i; k++)
{if(a[i]==a[k])
goto loop;}
}}//produce()
Status InitPT(LinkList &PT,int No)
{
LinkList p,Lt;
Lt = (LinkList)malloc(sizeof(LNode));PT=Lt;
Lt->next = NULL; // 建立一个带头结点的单链表
for(int j=0;j<No;j++)
{p=(LinkList)malloc(sizeof(PageTable));
p->page=j;
p->phy_page=a[j];
Lt->next=p;Lt=p;Lt->next=NULL;//顺序插入结点
}return OK;}//生成No个结点
Status InitET(LinkList &ET)//建立空的快表 头结点
{ET=(LinkList)malloc(sizeof(ExpTable));ET->next=NULL;return OK;}
Status InsertET(LinkList &ET,int PageNo,int phy_page)
{//在快表里逆序插入访问过的在地址(逻辑页,物理块)
LinkList p;
p=(LinkList)malloc(sizeof(ExpTable));
p->page=PageNo;p->phy_page=phy_page;
p->next=ET->next;ET->next=p;//插入到表头
return OK;}
Status SearchTable(LinkList ET,int page,int &phy_page)
{LinkList p=ET->next;
while(p!=NULL){
if(page==p->page)
{phy_page=p->phy_page;//物理块号
return OK;}
else p=p->next;}
return ERROR;//没找到
}//在快表里寻找逻辑页,并取得物理块号
Status AddrTransfer(address &InputAddr,int &TransPage,address &TransAddr)
{TransPage=int(InputAddr/PageSize);//计算页号
TransAddr=InputAddr%PageSize;//计算页内地址
return OK;}
Status AddressOut(int phy_page,address TransAddr,address &PhyAddr)
{PhyAddr=phy_page*PageSize+TransAddr;return OK;}
void printPT(LinkList L)
{LinkList p=L->next;
cout<<"\t页号\t"<<"块号\n";
while(p!=NULL)
{ cout<<"\t"<<p->page<<"\t"<<p->phy_page<<"\n";
p=p->next;}
cout<<"\t--------------------------------\n";
}
void main()
{
LinkList PT,ET;
cout<<"\t初始化状态...\n\t页表10页,物理块16\n\n";
InitET(ET);
int No=10;//页数
produce(No);
InitPT(PT,No);
printPT(PT);
VISIT:
cout<<"\n\n请输入你要访问的地址(十进制):";
address InputAddr,TransAddr,PhyAddr;
int TransPage,phy_page;
cin>>InputAddr;
cout<<"分页地址变换机构正在分析逻辑地址"<<InputAddr<<endl;
AddrTransfer(InputAddr,TransPage,TransAddr);//返回页号,偏移量。
cout<<"结果: 页号:"<<TransPage<<"\t页内地址:"<<TransAddr<<endl;
if(TransPage>No) cout<<"越界中断\n";
else{cout<<"地址变换机构将页号送入高速缓冲寄存器,CPU检索快表...\n";
if(!SearchTable(ET,TransPage,phy_page))
{cout<<"页表项不在快表中,进行页表访问\n";
SearchTable(PT,TransPage,phy_page);
cout<<"修改快表...\n";
InsertET(ET,TransPage,phy_page);
}
AddressOut(phy_page,TransAddr,PhyAddr);
cout<<"查得物理块号为:"<<phy_page<<"\n你所访问的实际物理地址为:"<<PhyAddr<<endl;
}
goto VISIT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -