所以Belady的Anomaly指出,当使用FIFO页面替换策略时,当添加更多页面空间时,我们会有更多的页面错误.
我的直觉说我们应该减少或最多相同数量的页面错误,因为我们添加了更多的页面空间.
如果我们将FIFO队列视为管道,添加更多页面空间就像使管道更大:
____
O____O size 4
________
O________O size 8
Run Code Online (Sandbox Code Playgroud)
那么,为什么会出现更多页面错误?我的直觉说,使用更长的管道,你需要花费更长的时间才能开始出现页面错误(因此,使用无限管道,你没有页面错误)然后你会遇到同样多的页面错误,就像通常与较小的管道一样.
我的推理出了什么问题?
我想知道分段错误和页面错误之间有什么区别和关系?
分段故障只属于分段内存模型吗?
页面错误只属于分页内存模型吗?
如果两者都是,那么由于大多数计算机系统(如x86和Linux)使用分页内存模型而不是分段内存模型,为什么GCC C编译器有时会报告分段错误错误?
感谢致敬!
我最近在自定义Linux内核(2.6.31.5,x86)驱动程序中遇到了一个问题,其中copy_to_user会定期不将任何字节复制到用户空间.它将返回传递给它的字节数,表明它没有复制任何东西.代码检查后,我们发现代码在调用copy_to_user时禁用了中断,这违反了它的合同.纠正此问题后,问题就停止了.因为问题很少发生,我需要证明禁用中断会导致问题.
如果你从arch/x86/lib/usercopy_32.c rep看下面的代码片段; movsl通过CX中的计数将单词复制到用户空间.退出时使用CX更新大小.如果movsl正确执行,CX将为0.因为CX不是零,所以movs?为了符合copy_to_user的定义和观察到的行为,指令不得执行.
/* Generic arbitrary sized copy. */
#define __copy_user(to, from, size) \
do { \
int __d0, __d1, __d2; \
__asm__ __volatile__( \
" cmp $7,%0\n" \
" jbe 1f\n" \
" movl %1,%0\n" \
" negl %0\n" \
" andl $7,%0\n" \
" subl %0,%3\n" \
"4: rep; movsb\n" \
" movl %3,%0\n" \
" shrl $2,%0\n" \
" andl $3,%3\n" \
" .align 2,0x90\n" \
"0: rep; movsl\n" \
" movl %3,%0\n" \
"1: rep; …Run Code Online (Sandbox Code Playgroud) 我正在努力学习考试......我找到了这个例子但却无法理解他们是如何得到答案的.有人能解释一下吗?
题:
考虑二维数组A:int A [] [] = new int [100] [100]; 其中A [0] [0]位于页面大小为200的分页存储器系统中的位置200处.操作矩阵的小进程驻留在页面0(位置0到199)中.因此,每次取指令都来自第0页.对于两个页面帧,下面的数组初始化循环产生了多少页面错误,使用LRU替换并假设第一个页面帧包含进程而另一个最初是空的?
A:
for (int j=0;j<100;j++)
for (int i=0; i<100; i++)
A[i][j] = 0;
Run Code Online (Sandbox Code Playgroud)
B:
for(int i=0; i<100; i++)
for (int j=0; j<100; j++)
A[i][j] = 0;
Run Code Online (Sandbox Code Playgroud)
给出的正确答案是:a:100 x 50 = 5000 b:50
我有点理解第一部分.共有50页.(10000/200 = 50)并且每次j发生变化时,都会发生页面错误...总共有100页错误...但为什么会乘以50?为什么第二个50?
谢谢!!
如果页表项(PTE)未标记为有效,则意味着所需的数据不在内存中,而是在磁盘上。因此,现在发生页面错误,操作系统负责将这页数据从磁盘加载到内存。
我的问题是,操作系统如何知道确切的磁盘地址?
我的问题是Linux特定的,需要了解内核,虚拟内存,mmap,pagefaults.我有大型静态数组的C程序,它将进入bss部分(内存,初始化为零).程序启动时,此内存不是物理分配的,只有虚拟内存,虚拟内存的每一页都映射到特殊的零页面(全零的页面).当应用程序访问此页面时,将生成页面故障并分配物理页面.
问题是:是否会在第一次读取访问时或从bss部分对页面进行第一次写访问时生成此类页面错误?
如果问题的答案是否定的,为什么这样做不是一个好主意?内核是否可以处理和修复内核模式中发生的页面错误?如果使用可分页存储器的代码仅作为中断下半部分的一部分执行,答案是否会改变?
谢谢!
linux paging memory-management linux-device-driver page-fault
在Linux中,当进程从系统请求某些(虚拟)内存时,它只是在vma(进程的虚拟内存的描述符)中注册,但是在调用时不保留每个虚拟的物理页面.稍后,当进程将访问此页面时,它将出现故障(访问将生成Page Fault中断),PF#handler将分配物理页面和更新进程页面表.
有两种情况:读取时的故障可能变为写入保护的零页面(特殊全局预归零页面)的链接; 写入时的错误(无论是在零页面上还是在刚刚需要但尚未物理映射的页面上)都将导致实际的私有物理页面分配.
对于mmaps(和brk/sbrk,也是内部mmap),这个方法是每页; 所有mmaped区域都在vma中注册为整体(它们具有开始和结束地址).但堆栈是以其他方式处理的,因为它只有起始地址(在典型平台上较高的地址;增长到较低地址).
问题是:
当我在堆栈附近访问新的未分配内存时,它将获得PF#并且增长.如果我不访问堆栈旁边的页面,而是访问堆栈10或100页的页面,这种增长如何处理?
例如
int main() {
int *a = alloca(100); /* some useful data */
int *b = alloca(50*4096); /* skip 49 pages */
int *c = alloca(100);
a[0]=1;
/* no accesses to b - this is untouched hole of 49 pages */
c[0]=1;
}
Run Code Online (Sandbox Code Playgroud)
该程序是否会为堆栈分配2或50个私有物理页面?
我认为要求内核在单个页面故障中分配数十个物理页面然后进行逐页分配的数十个页面故障(1个中断+ 1个上下文切换+简单,缓存友好的循环,N个页面分配请求与N个中断+,这可能是有利可图的N个上下文切换+ N页分配,当mm代码可以从Icache中逐出时).
我遇到一个奇怪的问题.
我使用Delphi和Indy上传和备份一些文件.它在许多计算机上运行得很好(Win7 64bit,WinXP).CPU使用率低于1%和最大值.RAM为20MB.
但是有一台计算机(Win 2008 R2)存在问题,我无法找到原因.CPU使用率为5-20%,内存需要100MB +,并且增加了很多.此外,"页面错误"上升很多,例如.每秒10万(我的电脑没有增加)
代码很简单
var
IdHTTP: TIdHTTP;
IdPostData: TIdMultiPartFormDataStream;
sResponse: string;
begin
IdHTTP := TIdHTTP.Create(nil);
IdPostData:=TIdMultiPartFormDataStream.Create;
try
IdPostData.AddFile('file', 'C:\data.dat', '');
sResponse:=IdHTTP.Post('http://web.com', IdPostData);
ShowMessage(sResponse);
finally
IdHTTP.Free;
IdPostData.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么"页面错误"增加了很多?是否有可能存在硬件问题?怎么找到它?
我正在比较一些系统调用,我从/向内存读/写.是否有任何API定义来测量页面错误(页面输入/输出)C?
我找到了这个库 libperfstat.a,但它是为了AIX,我找不到任何关于linux的东西.
编辑:
我知道linux中的time&perf-stat命令,只是探索我是否可以在C程序中使用.