在有进程地址空间虚拟化概念之前,所有的程序都得实打实的知道自己在物理内存中的分配(程序员手写分配啊!!!)。如果程序小、少,还能凑合着进行管理,但是,面对实际的多程序,大体量程序,不得不将内存的管理与程序的编写进行分离,尽管这样做“有一点1”降低效率。
Using Physical Address:
![]()
Using Virtual Address:
![]()
一、地址虚拟化与进程私有地址空间
进程的地址空间是私有的,名曰:私有地址空间。何为私有,这就与虚拟化有关了。操作系统 将内存地址的概念(虚拟地址)从内存地址的实现(物理地址)中抽象出来了,使得编程工作者可以不用考虑自己编写的代码、变量等数据在终端运行的时候具体位于哪块物理内存地址中。在编写程序时,我们无需关心对物理内存的分配,也不用担心不同的进程对”相同地址值2“操作时是否产生冲突,带来数据的不一致性。
code
#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) memory address of p: %08x\n", getpid(), (unsigned) p); // a2
*p = 0; // a3
while (1) {
Spin(1); //这个函数的作用是1s之后返回
*p = *p + 1;
printf("(%d) p: %d\n", getpid(), *p);