虚拟化CPU

问题描述 投票:0回答:1

了解操作系统中的 CPU 虚拟化:概念和实现

运行内存分配程序的多个实例时出现意外行为

我正在学习操作系统并遵循 OSTEP(操作系统:三个简单的部分)教科书。我试图通过同时运行程序的多个实例来理解内存虚拟化。这是我正在使用的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

int main(int argc, char *argv[]) {
    int *p = malloc(sizeof(int)); // a1
    assert(p != NULL);
    printf("(%d) address pointed to by p: %p\n", getpid(), p); // a2
    *p = 0; // a3
    while (1) {
        Spin(1);
        *p = *p + 1;
        printf("(%d) p: %d\n", getpid(), *p); // a4
    }
    return 0;
}

根据教科书,当使用命令

./mem &; ./mem &
运行时,该程序应通过同时运行两个实例来演示内存虚拟化。文中写道:

我们从示例中看到,每个正在运行的程序都在同一地址(0x200000)分配了内存,但每个程序似乎都在独立更新 0x200000 处的值!就好像每个正在运行的程序都有自己的私有内存,而不是与其他正在运行的程序共享相同的物理内存。事实上,这正是这里发生的情况,因为操作系统正在虚拟化内存。

但是,当我在本地运行该程序时,我得到以下输出:

本地运行的输出

两个实例没有按预期同时运行。什么可能导致这种行为?我是否在设置或理解中遗漏了一些内容?

附加信息:

  • 操作系统:Microsoft Windows 11 Home 单语言
  • 操作系统版本:10.0.22631 不适用 Build 22631
  • 编译器:gcc (MinGW.org GCC-6.3.0-1) 6.3.0
c powershell operating-system
1个回答
0
投票

将其输入 bash 即可运行。

& 在 bash 中表示后台运行,但在 powershell 中表示其他含义;我很惊讶你没有收到错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.