虚拟地址如何转换到物理地址

        这里以32位虚拟地址为例。

        我们假设32个比特位都用来编址,那么页表中的条目就是2^32(4,294,967,296),一个条目大小是4个字节,4*2^32,换算成GB就是16GB,所以如果32位地址都用来编制,一个程序的页表就需要16GB,更何况机器上运行着那么多程序呢。

        所以32位地址被分割成10+10+12,前两个10分别表示一级页表偏移量和二级页表偏移量,二级页表中存放物理页框的地址:

虚拟地址如何转换到物理地址_第1张图片

        说一下转换过程,首先一级页表每个程序都有只有一张,一级页表的地址被存放在CR3寄存器中,虚拟地址的前10位表示在一级页表中的偏移,从该地址处读取到某张二级页表存在的位置,第二个10比特位是一个二级页表的偏移量,从相应的位置读取到物理内存中某个页框的位置,最后12位是在页框中的偏移量,通过该地址定位到你要的指令或者数据。

        我们再计算一下多级页表要管理物理内存需要多大的空间,一级页表一个条目32个比特位,4个字节,总共1024个条目,4*1024=4KB,二级页表也按照32位计算,4*1024*1024=4MB,但是要知道,所有的页表都不可能被填满,所以,用总大小小于4MB的页表就能完成虚拟地址到物理地址的映射。

        程序中,一个变量通常是4或者8个字节,当我们取地址的时候,取的实际上是该变量在第一个字节的地址,而数据类型是写给cpu看的,数据类型关键字被会变成一些指令,这些指令被内置在cpu中来确定当我读取数据时应该读取多少个字节。

        当数据第一次被加载到cpu时,它会被放到CPU内部的缓存中,目的是为了暂时保存从内存中加载的数据,访问页表寻址是消耗时间的,缓存的存在就是为了优化cpu频繁访问内存中的同一个数据的情况,并且加载到内存中的不仅仅是你访问的数据,还有该数据上下地址范围内的一些数据(预加载),所以cpu的访问数据的顺序是先去缓存中查找,包括一级缓存二级缓存三级缓存,如果缓存中存放了自己需要的数据,那么就叫做一次命中。

        再说一下线程切换为什么比进程切换的效率要高。当进程切换的时候,对应的是两个程序,每个程序都有自己的数据,进程切换的时候,缓存中的内容也需要切换,将原来缓存中不属于自己的数据逐渐替换为自己程序的数据,整个过程被叫做缓存数据由冷变热。而多个线程由于访问的都是同一个程序的数据,所以线程切换的时候缓存中的数据不需要替换。

        

你可能感兴趣的:(操作系统)