在阅读了 Spectre & Meltdown 漏洞之后,我了解了推测执行。
给定以下简单的 C++ 程序:
#include <stdlib.h>
void mallocBranch(int i) {
if (i < 500) {
malloc(i);
}
}
int main(int argc, char** argv){
for (i := 0; i < 5000; i++) {
mallocBranch(1);
}
mallocBranch(500000000);
return 0;
}
- 我假设
malloc
编译器没有优化调用。
问:mallocBranch(500000000)
被调用时会发生什么?CPU 是否会查看分支预测缓存并查看过去的if (i < 500)
成功调用并推测性地执行分支malloc(500000000)
?malloc
每次分支预测缓存的全部内容都会覆盖分支的数量吗?如果malloc(500000000)
实际上是推测执行,是否会为进程分配 5 亿字节的内存,如果只是暂时的?