You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OSTEP内存虚拟化实验异常:多程序实例未同时运行排查

内存虚拟化实验异常问题排查

实验背景

我正在学习操作系统,遵循《Operating Systems: Three Easy Pieces》(OSTEP)教材,尝试通过同时运行内存分配程序的多个实例理解内存虚拟化特性。

使用的C代码

#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 &时,两个程序实例应同时运行,展示内存虚拟化特性:每个实例在相同虚拟地址独立更新值。但在我的环境中执行./mem &; ./mem时,仅输出单个实例的运行日志,未出现多实例同时运行的预期效果。

环境信息

  • 操作系统:Microsoft Windows 11 Home Single Language
  • 系统版本:10.0.22631 N/A Build 22631
  • 编译器:gcc (MinGW.org GCC-6.3.0-1) 6.3.0

异常原因

  1. Windows命令行不支持POSIX后台运行语法:&在Linux/Unix的bash shell中是将程序放入后台运行的指令,但在Windows的CMD或PowerShell中,&仅作为命令分隔符使用,不会让程序在后台执行。执行./mem &时,程序会在前台阻塞运行,后续的./mem需等待第一个程序退出才会启动,而代码中的死循环导致第一个程序永远不会退出,因此仅能看到单个实例的输出。
  2. 命令语法不兼容:教材中的./mem &; ./mem &是bash环境下的语法,;;用于分隔命令,但Windows环境不识别该语法,会导致命令解析异常,进一步影响多实例启动。

解决建议

  • 使用支持POSIX环境的终端(如MinGW的MSYS2、Git Bash)执行教材中的命令,这类终端兼容&后台运行语法。
  • 在PowerShell中使用Start-Process ./mem命令启动后台进程,多次执行即可同时运行多个实例。
  • 打开多个独立的命令行窗口,分别执行./mem来启动多个实例。

内容的提问来源于stack exchange,提问作者Harshal Malani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:53:11