栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《操作系统导论》之虚拟化内存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《操作系统导论》之虚拟化内存

文章目录
  • 前言
  • 一、访问内存的程序
  • 二、运行单个程序
  • 二、运行多个程序
  • 总结


前言

现现机器提供的物理内存(physical memory)模型非常简单。内存就是一个字节数组。要读取(read)内存,必须指定一个地址(address),才能访问存储在那里的数据。要写入(write)或更新(update)内存,还必须指定要写入给定地址的数据。
程序运行时,一直要访问内存。程序将所有数据结构保存在内存中,甚通过各种指令来访问它们,例如加载和保存,或利用其他明确的指令,在工作时访问内存。不要忘记,程序的每个指令都在内存中,因此每一读取指令都会访问内存。

一、访问内存的程序
#include  
#include  
#include  
#include "common.h" 

int main(int argc, char *argv[]) 
{ 
	int *p = malloc(sizeof(int)); // a1 
	 assert(p != NULL); 
	printf("(%d) memory address of p: %08xn", getpid(), (unsigned) p); // a2 
	 *p = 0; // a3 
	 while (1) 
	 { 
		Spin(1); 
		 *p = *p + 1; 
		 printf("(%d) p: %dn", getpid(), *p); // a4 
	 } 
	 return 0; 
 }

该程序做了几件事。首先,它分配了一些内存(a1 行)。然后,打印出内存(a2)的地址,然后将数字 0 放入新分配的内存(a3)的第一个空位中。最后,程序循环,延迟一秒钟递增 p 中保存的地址值。在每个打印语句中,它还会打印出所谓的正在运行程序的进程标识符(PID)。该 PID 对每个运行进程是唯一的。

二、运行单个程序
prompt> ./mem 
(2134) memory address of p: 00200000 
(2134) p: 1 
(2134) p: 2 
(2134) p: 3 
(2134) p: 4 
(2134) p: 5 
ˆC
二、运行多个程序
prompt> ./mem &; ./mem & 
[1] 24113 
[2] 24114 
(24113) memory address of p: 00200000 
(24114) memory address of p: 00200000 
(24113) p: 1 
(24114) p: 1 
(24114) p: 2 
(24113) p: 2 
(24113) p: 3 
(24114) p: 3 
(24113) p: 4 
(24114) p: 4 

从示例中看到,每个正在运行的程序都在相同的地址(00200000)处分配了内存,但每个似乎都独立更新了 00200000 处的值!就好像每个正在运行的程序都有自己的私有内存,而不是与其他正在运行的程序共享相同的物理内存。

总结

这正是操作系统虚拟化内存(virtualizing memory)时发生的情况。每个进程访问自己的私有虚拟地址空间(virtual address space)(有时称为地址空间,address space),操作系统以某种方式映射到机器的物理内存上。一个正在运行的程序中的内存引用不会影响其他进程(或操作系统本身)的地址空间。对于正在运行的程序,它完全拥有自己的物理内存。但实际情况是,物理内存是由操作系统管理的共享资源。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020884.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号