虚拟内存

牵扯到的概念大概有 进程,操作系统,虚拟内存,RAM,交换空间,可执行文件,磁盘

可执行文件是一个文件,按指定格式记录了OS支持的可执行程序需要的数据,包括程序的指令,指令操作的数据,导出地址,导入的库、函数等。

磁盘只是用来作为持久存储使用,段电后数据然后保留的。

现代OS多为同时执行多个程序,为什么要这样?因为资源的利用率问题,CPU比其他硬件快太多,使得在等待IO的同时,CPU可以运行其他程序。

OS用进程的概念管理程序,官方定义是一个进程代表了一个运行中的程序。

另外进程的作用是让程序觉得自己是独占整个计算机资源,包括寄存器、CPU/GPU/RAM/磁盘、各种输入输出设备等。而真正的是计算机上同时存在多个程序,
那怎么模拟这种假象,基本的思路是分时,每个程序运行一会,切换到其他进程。

对CPU/GPU/寄存器等的模拟:
大致是在每次进程切换时,保存正在执行进程的CPU/寄存器。。。状态到内存中,加载将要执行的进程上次保存的值到寄存器/CPU,

对内存的模拟:
因为指令寄存器是32位原因(32位机器),所以对独占计算机的程序来说,最大内存大小是2^32(4G)大小,OS怎么模拟这个大小,且不说
一般计算机并没有4G的内存(至少那会是没有的),也不可能说只有一个程序在运行,

这需要中断+内存映射来实现,比方说我现在计算机只有4M RAM,但我要分配4G内存怎么办,我把4G的空间划分成4K的页,把4M的RAM也划分成4K的页,这样页之间可以相互对

应,然后我用一个内存管理器(MMC)管理RAM,每次进程需要访问内存时,不直接访问RAM,而是把要访问的地址(这个地址是对于4G大小内存而言)交给MMC,MMC查下这个

地址所在的页是不是在RAM的某个页里,如果不在就触发一个中断,OS捕获中断后根据相关信息,把需要的数据从磁盘加载到RAM空闲的页(OS知道程序在哪,且可执行文件的

格式固定),后继续运行中断之前的代码;而如果在,就直接运行。如果RAM已满,就是放满了东西,那就先把一部分能移动的移到交换空间(一般OS在磁盘上开辟一块作为

交换空间),下次用到这些时会发生一个中断,从而又会加载到RAM里。

这样看来这里说的4G内存并不是真正意义上的RAM,而是一个虚拟的内存。对进程来说,这就是它的内存。编码时参考的也是这个内存,并不关心用户有多少RAM,由OS完成从

虚拟内存到实际计算机RAM的映射.

RAM跟具体某个进程无关,进程看到的只有虚拟内存,RAM+中断+交换空间实现了虚拟内存。

用这样的方式有很多好处,比如如果RAM中有了某个DLL,现在多个程序使用这个DLL,这时,OS只需要把这些程序的虚拟内存页全部映射到这些RAM也就好,避免了每个程序都

对应一份RAM,节省了RAM的使用,加快了程序的启动,从这方面讲,内核代码是所有程序公用的,每个程序的高位内存地址全部映射到相同的RAM地址(内核代码)。

另外进程之间交换数据也能用这种共享的方式,只要修改虚拟内存映射到相同的RAM就可以了。

还有安全性,因为每个进程访问的都是自己的地址空间,不会轻易访问到其他进程的地址空间。

posted @ 2013-04-23 14:05  godion  阅读(494)  评论(0编辑  收藏  举报