假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.
(这些样本说明不准确,但我相信这一点会被理解)
在第五个时钟周期,这些指令将在管道中,如下所示.
添加a,b,c [IF ID EX MEM WB]
添加a,b,d [IF ID EX MEM]
添加a,b,e [IF ID EX]
添加a,b,f [IF ID]
现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?
所以calloc()通过向操作系统询问一些虚拟内存来工作.操作系统正在使用MMU进行操作,并巧妙地响应虚拟内存地址,该地址实际上映射到一个写满了零的只读页面.当程序尝试写入该页面中的任何位置时,会发生页面错误(因为您无法写入只读页面),会创建该页面的副本,并且您的程序的虚拟内存将映射到这些全新的副本零.
既然Meltdown是一个东西,操作系统已被修补,因此不再可能跨内核用户边界推测性地执行.这意味着每当用户代码调用内核代码时,它就会有效地导致管道停顿.通常,当管道在循环中停顿时,它对性能造成破坏性,因为CPU最终会浪费时间等待数据,无论是来自缓存还是主存储器.
calloc(),并且重新映射到新的CoW页面时,是否正在执行内核代码?calloc()分配4GiB的内存,然后在紧密的循环中用一些任意值(比如说,0xFF而不是0x00)初始化它,我的(英特尔)CPU每次写入新页面时都会触及推测边界吗?performance memory-management cpu-architecture calloc page-fault