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
异常原因
- Windows命令行不支持POSIX后台运行语法:
&在Linux/Unix的bash shell中是将程序放入后台运行的指令,但在Windows的CMD或PowerShell中,&仅作为命令分隔符使用,不会让程序在后台执行。执行./mem &时,程序会在前台阻塞运行,后续的./mem需等待第一个程序退出才会启动,而代码中的死循环导致第一个程序永远不会退出,因此仅能看到单个实例的输出。 - 命令语法不兼容:教材中的
./mem &; ./mem &是bash环境下的语法,;;用于分隔命令,但Windows环境不识别该语法,会导致命令解析异常,进一步影响多实例启动。
解决建议
- 使用支持POSIX环境的终端(如MinGW的MSYS2、Git Bash)执行教材中的命令,这类终端兼容
&后台运行语法。 - 在PowerShell中使用
Start-Process ./mem命令启动后台进程,多次执行即可同时运行多个实例。 - 打开多个独立的命令行窗口,分别执行
./mem来启动多个实例。
内容的提问来源于stack exchange,提问作者Harshal Malani
相关产品推荐
相关产品推荐

