1. 求一段C语言代码,实现近似LRU页置换,运用附加引用位算法。
网上查一下
2. 使用C语言模拟拥有若干个虚页的进程在给定的若干个实页中运行 在缺页中断使用FIFO和LRU算法进行页面置换。
比较有深度
3. 又没有c语言java语言比较厉害的帮我写个代码,不难,会的话估计不到20分钟就写完了页面lru算法
贴一个我写的LRU cache算法,用c++实现的
具体的数据结构用的一个链表加一张哈希表。
实现了set和get, 需要另外的功能我还可以再写。
class LRUCache{
struct cacheEntry{
int key;
int value;
cacheEntry(int c, int v):key(c),value(v){}
};
int _cap;
list<cacheEntry> entryList;
unordered_map<int, list<cacheEntry>::iterator> entryMap;
void moveToHead(list<cacheEntry>::iterator it, int key, int value)
{
entryList.erase(it);
cacheEntry tmp(key, value);
entryList.push_front(tmp);
entryMap[key]=entryList.begin();
}
public:
LRUCache(int capacity) {
_cap=capacity;
}
int get(int key) {
if(entryMap.find(key)==entryMap.end())
return -1;
else{
moveToHead(entryMap[key], key, entryMap[key]->value);
return entryMap[key]->value;
}
}
void set(int key, int value) {
if(entryMap.find(key)==entryMap.end()){
if(entryList.size()>=_cap){
entryMap.erase(entryList.back().key);
entryList.pop_back();
}
cacheEntry tmp(key, value);
entryList.push_front(tmp);
entryMap[key]=entryList.begin();
}
else{
entryMap[key]->value=value;
moveToHead(entryMap[key], key, value);
}
}
};
4. C语言用以下函数构造LRU算法,求大侠帮助
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAINMEM 3 //主存可存储的页面个数
#define QUEUEMAXLEN 30 //队列最大长度
struct LRUQueue //定义一个特殊的队列
{
int number;
int data[MAINMEM];
}lru;
void Init(); //初始化操作
void Add(int pageID); //加入队列
int Find(int pageID); //查找页面是否在主存中
void Update(int pos); //更新页所在的地址
void PrintQueue(); //输出主存内容
int main()
{
int i;
int queuelength;
int queue[QUEUEMAXLEN];
Init(); //初始化操作
printf("请输入队列的长度:");
scanf("%d",&queuelength);
printf("请以此输入队列的页号:");
for(i=0;i<queuelength;i++)
{
scanf("%d",&queue[i]);
Add(queue[i]);
PrintQueue();
}
system("pause");
return 0;
}
void Init()
{
lru.number = 0;
int i;
for(i = 0;i<MAINMEM;i++)
{
lru.data[i] = -1;
}
}
int Find(int pageID)
{
int i;
for (i=0;i<MAINMEM;i++)
{
if(lru.data[i] == pageID)
{
return i;
}
}
return 0;
}
void Update(int pos)
{
int tmp = lru.data[pos];
int i;
for(i = pos;i<lru.number;++i)
{
lru.data[i] = lru.data[i+1];
}
lru.data[lru.number-1] = tmp; //将被访问的页放在最后一位,其他的页前移,因为置换时删掉的是主存中第一块放置的页面
}
void PrintQueue()
{
printf("当前内存中的页号:\n");
int i;
putch('|');
for(i = 0;i<MAINMEM;i++)
{
if(lru.data[i] == -1)
printf(" |");
else
printf("%d |",lru.data[i]);
}
putch('\n');
}
void Add(int pageID)
{
printf("当前访问的页面:%d\n",pageID);
if(lru.number<MAINMEM) //如果主存没有填满
{
int pos = Find(pageID);
if(pos)
{
Update(pos);
}
else
{
lru.data[lru.number++]=pageID;
}
}
else
{
int pos = Find(pageID);
if(pos)
{
Update(pos);
}
else
{
int i;
for(i=0;i<MAINMEM-1;i++)
{
lru.data[i]=lru.data[i+1]; //数据左移一个单位
}
lru.data[i]=pageID; //加入新数据
}
}
}
5. 怎么样实现分页管理的缺页调度clock算法C语言代码
这个程序我做过,现在给你!!写了很久的!!
#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m];//定义页
int head=0;
struct
{
short int lnumber;//页号
short int flag;//表示该页是否在主存,"1"表示在主存,"0"表示不在主存
short int pnumber;//该页所在主存块的块号
short int write;//该页是否被修改过,"1"表示修改过,"0"表示没有修改过
short int dnumber;//该页存放在磁盘上的位置,即磁盘块号
short int times;//被访问的次数,用于LRU算法
}page[n];//定义页表
//各个函数的实现如下:
void computer()
{
int i;
for(i=0;i<n;i++)
{
page[i].lnumber = i;
page[i].flag = 0;
page[i].pnumber = 10000;//用10000表示为空
page[i].write = 0;
page[i].dnumber = i;
page[i].times = 0;
}//初始化页表
for(i=0;i<m;i++)
{
page[i].pnumber = i;
}
for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化页
}
void showpagelist()
{
int i;
printf("\n页号\t是否在主存中\t块 号\t是否被修改过\t磁盘块号\t访问次数\n");
for(i=0;i<n;i++)
{
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times);
}
}
void showpage()
{
int i;
for(i=0;i<m;i++)
{
printf("\t%d\n",p[i]);
}
}
void transformation() //缺页中断处理
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
int i, fail = 0;
int method,temppage=0;
short int times = 10000;
printf("请输入一个逻辑地址(四位十六进制数):");
scanf("%x",&logicAddress);//读入逻辑地址
logicNumber = logicAddress >> 10;//得到页号
printf("页号为:%ld\n",logicNumber);
innerAddress = logicAddress & 0x03ff;//得到页内地址
printf("页内地址为:%ld\n",innerAddress);
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
printf("请求的页面在主存中!\n");
page[i].times++;
physicsNumber = page[i].pnumber;//由页号得到块号
printf("请求的主存块号为:%ld\n",physicsNumber);
physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址
printf("请求的物理地址为:%ld",physicsAddress);//输出物理地址
break;
}
else
{
printf("请求的页面不在主存中! 将进行缺页中断处理!\n请选择算法!\n");
printf("1.先进先出\n2.最近最少用\n请选择置换算法:");
scanf("%d",&method);
if(method == 1) //采用先进先出算法
{
printf("采用先进先出算法!\n");
fail = p[head];
printf("第%d页将被替换!\n",fail);
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
printf("第%d页曾被修改过!\n",fail);
page[fail].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[fail].pnumber;
page[fail].pnumber = 10000;
page[logicNumber].times++;
break;
}
else if(method == 2) //采用最近最少用算法
{
printf("采用最近最少用算法!\n");
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
printf("第%d页将被替换!\n",temppage);
for(i=0;i<m;i++)
{
if(p[i] == temppage)
{
p[i] = logicNumber;
}
}
if(page[temppage].write == 1)
printf("第%d页曾被修改过!\n",temppage);
page[temppage].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[temppage].pnumber;
page[temppage].pnumber = 10000;
page[logicNumber].times++;
break;
}
else
{
printf("你输入有误,即将退出!");
exit(1);
}
}
}
}
}
void main()
{
char c,d,flag='y';
printf("页表正在初始化中...,3秒钟后为你显示页和页表!\n");
computer();
showpage();
showpagelist();
while(flag == 'y' || flag == 'Y')
{
transformation();
printf("是否显示页和页表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y')
{
showpage();
showpagelist();
}
else
{
while(c=='N'||c=='n')
{
printf("\n是否继续进行请求分页?(Y/N)");
d = getchar();
d = getchar();
if(d=='Y'||d=='y')
{
transformation();
printf("\n是否显示页和页表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y')
{
showpage();
showpagelist();
}
}
else if (d=='N'||d=='n')
exit(1);
else
printf("输入错误!\n");
}
}
printf("\n是否继续进行请求分页?(Y/N)");
flag = getchar();
flag = getchar();
}
}
6. 模拟页式虚拟存储管理中硬件地址变换和缺页中断,并用LRU算法处理缺页中断,用C语言做
这个问题太专业,人我不知道。
7. 谁会用c语言编写lru算法
是模拟还是直接操控操作系统内存?模拟的话简单,直接操控系统内存不会。。。
8. 求一段C语言代码,实现近似LRU页置换,运用二次机会算法。
二次机会算法我有。
但是我不明白你说的内存帧数是什么意思。是内存物理块的意思吗?
错误页数又是什么意思呢?
9. 问几个计算机组成与系统结构的问题 急用
1
因为,借由交叉存储方式,可以实现对连续字成块传递的多模块流水式并行存取. cpu同时访问4个模块,内存器控制部件控制它们分时使用数据总线进行信息传递。对每一个存储器模块而言,从cpu给出访存命令直到读出信息仍然使用一个存取周期时间,但对cpu而言,它可以在一个存取周期内连续访问4个模块,各模块的读写过程重叠进行。所以多模块交叉存储器是一种并行存储器结构,可以大大提高存储器器宽带。
2
(1)2^20*32/8=4mb
(2) (4mb*8)/(512kb*8)=8
(3) 8=2^3 3片
3
命中率 2000/(2000+180)=0.92
平均访问时间 0.92*40+(1-0.92)*250=56.8
效率 40/56.8=70%
4 不会
5页面访问序列 0 2 5 4 ⑤ ② ⑤ ② 3 ⑤ 2 ④ 命中率
fifo算法 a 0 2 5 4 4 4 4 4 3 3 2 2 6/12=50%
+ b 0 2 5 ⑤ ⑤ ⑤ ⑤ 4 4 3 3
lru算法 c 0 2 2 ② ② ② ⑤ ⑤ 4 ④
命中 命中命中命中 命中 命中