我有一个项目,我被要求开发一个应用程序来模拟不同的页面替换算法如何执行(具有不同的工作集大小和稳定期).我的结果:




我的结果合理吗?我期望LRU比FIFO更好.在这里,它们大致相同.
对于随机,稳定期和工作集大小似乎根本不影响性能?我预计类似的图表如FIFO和LRU只是性能最差?如果引用字符串是高度稳定的(小分支)并且具有较小的工作集大小,那么具有许多分支和大工作集大小的应用程序应该仍然具有较少的页面错误?
更多信息
工作集大小(e)和稳定周期(t)会影响参考字符串的生成方式.
|-----------|--------|------------------------------------|
0 p p+e P-1
Run Code Online (Sandbox Code Playgroud)
因此,假设上面是大小为P的虚拟内存.要生成参考字符串,使用以下算法:
m在[p,p + e]中选择数字.m模拟或引用页面被引用的次数更新(回应@ MrGomez的回答)
但是,回想一下您如何播种输入数据:使用random.random,从而为您提供具有可控熵级别的统一数据分布.因此,所有值都可能同样发生,并且因为您在浮点空间中构造了这些值,所以重现非常不可能.
我正在使用random,但它也不是完全随机的,虽然使用工作集大小和数字页引用参数,但是通过某些地方生成引用?
我尝试增加numPageReferenced亲戚,numFrames希望它能更多地引用当前在内存中的页面,从而显示LRU相对于FIFO的性能优势,但这并没有给我一个明确的结果.仅供参考,我尝试使用以下参数的同一个应用程序(页面/框架比率仍然保持不变,我减少了数据的大小以使事情更快).
--numReferences 1000 --numPages 100 --numFrames 10 --numPageReferenced 20
Run Code Online (Sandbox Code Playgroud)
结果是

仍然没有这么大的差异.我是否正确地说,如果我numPageReferenced相对增加numFrames,LRU应该有更好的性能,因为它更多地引用内存中的页面?或许我错误地理解了什么?
对于随机,我正在思考:
嗯,也许我要考虑更多:)
更新:在较低的稳定性下不太明显的垃圾

在这里,我试图显示垃圾,因为工作集大小超过内存中的帧数(100).然而,通知捶打似乎不太明显,稳定性较低(高t),为什么会这样?解释是,当稳定性变低时,页面错误接近最大值,因此工作集大小是多少并不重要?
我已经开始学习C(所以,你知道..指针).
我有这个代码:
#include <stdio.h>
#include <string.h>
int main (int argc, char* argv[])
{
char c = 'c';
char* cptr = &c;
printf("c = %c\n", c);
printf("*cptr = %c\n", *cptr);
printf("c address = %p\n", &c);
}
Run Code Online (Sandbox Code Playgroud)
我的输出是:
c = c
*cptr = c
c address = 0x7fff0217096f
Run Code Online (Sandbox Code Playgroud)
当我将上面的十六进制转换为十进制时,我得到:140720994002157
我的问题:
1)这个十进制值是否代表内存地址?不是太大了吗?
2)如何将指针的值(表示c变量的地址)打印为小数?
我对这些问题非常困惑.
在32位处理器上,每个进程都有4 GB的虚拟内存.但是,如果evey进程有4GB的空间,那么如果100个进程正在运行,那么它将是每个巨大的数量 - 这大于交换区域.有人可以解释一下; 我很迷茫.
操作系统如何将内存分配给进程?假设一个过程有a = malloc(2).谁将这个记忆分配给这个过程?操作系统是否会为进程提供这2个字节的内存.
(我们访问a [2]它会产生分割错误).
进程的不同部分(主代码或数据,堆栈,堆)在主存储器或辅助存储器中的位置.
请给我一些很好的链接,这样我也可以理解虚拟内存及其整个机制,因为我发现的链接并不能完全解释虚拟内存.