
本文共 2579 字,大约阅读时间需要 8 分钟。
本文学习自狄泰软件学院 唐佐林老师的 操作系统课程,另外本文图片全部来源于唐佐林老师课程PPT,只用于个人笔记学习
目录:
一 虚拟内存
- 1 从现象引入虚拟内存
- 2 虚拟内存的由来
- 3 虚拟内存的意义以及虚拟内存的映射机制
二 内存保护
一 虚拟内存
1 从现象引入虚拟内存
system(“pause”); 暂定执行,暂定到我们在键盘上按下一个值为止。假若我们这个程序编译好了,编译出可执行程序了,接下来我们执行这个可执行程序两次,执行两次的结果就是得到了图中所示的两个进程,那么问题来了。
问题:这两个进程所输出的全局变量的地址是不是一样的 ? 答案:不同,为什么?问题1分析:

这个地方牵扯到程序与进程之间的区别,程序与进程是不同的,程序是静态的概念,程序其实就是存储器上面一段静态的二进制数据,这个静态的二进制数据就是可执行程序对应的文件。而进程是可执行程序运行之后所得到的动态的概念,这个动态的概念对应着内存上的实体,比如上图内存中的进程,一个可执行程序可以多次,这里运行两次,得到两个进程。而这两个进程在内存里面显然是位于不同的位置的,所以可以推论出,这两个进程中的各自的全局变量的地址是不一样的,下面我们做实验验证一下。

答案1 : 针对于问题1所对应的实例,理论上,不同进程在内存中的不同位置执行,因此,全局变量的地址是不同的。而问题2的实验中所打印的是虚拟地址。
注意:我们在做软件开发时候经常忘记的东西:我们在开发软件的时候,所面对的内存都是虚拟内存。
2 虚拟内存的由来
很久以前最初的软件开发,在没有虚拟内存这个概念的时候,那时候的开发都是直接操作的就是真实的物理内存的,那时候指定一个地址值,那么那一个地址值就对应着真真正正的物理内存里面的地址值了。这种开发模式叫做实模式软件开发,在实模式下的软件开发,我们所操作的地址就是真是的物理内存地址。然而随着软件和操作系统的发展,实模式的开发方式对于应用程序的开发是非常致命的。于是就提出了使用虚拟内存的开发模式。
3 虚拟内存的意义以及虚拟内存的映射机制
在上面的说明中,在需要的时候,将即将执行的进程的局部代码加载到物理内存中,这个过程就是虚拟内存重新映射到物理内存的过程,因为之前这个局部代码位于交换区中,即在磁盘中。此时要加载到物理内中,是需要重新映射,因为每次的加载的物理内存的起始地址可能是不同的,所以从虚拟内存到物理内存之间会有一个映射机制。物理内存中地址就是实地址。
如上图的活动页,他之前是在交换区中,当需要这个活动页中的代码的时候才把他加载到物理内存中。这个活动页在交换区里面的时候,肯定是有一个虚拟地址的,这个虚拟地址就是我们做应用程序开发的时候所面对的地址。在加载的过程中,就会更新这个映射表,如 虚拟页号,物理页号,以及相关属性,如只读只写等内存特性。
映射原理:
首先,我们的应用程序要访问 0xAABBCC12这个虚拟地址的时候,内存管理单元就会开始查询页面映射表,查找该虚拟地址页号所对应的物理地址页号。将对应的物理页号取出来,将虚拟地址的地位与物理地址页号拼接在一起,就得到了真正的物理地址了。
问题3: 假如查找目标虚拟地址所对应的物理内存地址的时候,映射表里面查不到该虚拟地址,没有该映射怎么办?
答案3: 假如查找目标虚拟地址所对应的物理内存地址的时候,映射表里面查不到该虚拟地址,没有该映射怎么办,说明此时的虚拟地址所在的页面还没有加载到物理内存中。按照上图的方法添加到映射表即可。
方法2: 增加物理内存,是我们平常常见的提高电脑性能的方法,从上面的映射的过程中可以看出,增加物理内存之后,换入换出的时间就会减少了,因为物理内存充足,我们可以将大量的进程里面的页面全部一次性的加载到物流内存中,这时候没有页面的换入换出操作,那换入换出操作又有什么影响呢?将页面从内存里面换到交换区,其实就是从内存里面写入到磁盘中,这是换出。而从磁盘中将数据读如到内存中是换入,而磁盘的读写操作是一种很低级很费时的IO操作。如果我们能减少页面的换入换出的次数的话,就节约了时间,这样电脑的反应就更快了。
方法3 :更换固态硬盘,为什么呢?从上面的映射的过程中可以看出,假如物理内存不变,但是我们换一个固态硬盘,而这个固态硬盘上就有交换区,此时的换出换入页面的次数不变,但是在读写磁盘的时候速度更快了,时间更短了,这样整体的性能也更快了。这样就解释了我们把系统作在固态硬盘上的时候,电脑性能就提高了。
以上三中方法提高电脑性能的方法就是因为操作系统内部是使用虚拟内存管理内存的,需要地址的映射,以及页面的换入换出,就是磁盘的IO读写操作。
二 内存保护
假如写该虚拟地址的时候,此时内存管理单元发现映射关系表中的属性项目中是只读的,不可写,就会发生中断,起到了内存保护的作用。
发表评论
最新留言
关于作者
