内存和磁盘的亲密关系
1.前提
内存与磁盘都是存储部件,内存利用电流来存储、磁盘利用磁效应来存储。内存高速高价,磁盘低速廉价。
存储在磁盘中的程序必须先加载到内存中才能运行。这是因为cpu需要程序计数器指定内存地址,然后才能读出程序来运行。即使可以从磁盘中读取,程序的运行速度还是会降低。
2.磁盘缓存
磁盘缓存指把磁盘中的数据读出并存储在内存中,这样下次再要读取相同的数据时,只需到磁盘缓存中读取,提升了磁盘数据的访问速度。
windows操作系统中就提供了磁盘缓存机制,但随着硬盘访问速度的提高,磁盘缓存效果也没之前明显。
但把低速设备的数据保存在高速设备中,需要时直接从高速设备读取,这种缓存机制在其他情况下也会用到;比如cache高速缓冲存储器、标准I/O的缓冲区等。
3.虚拟内存
虚拟内存指把磁盘的一部分当做假想的内存来使用。借助虚拟内存,在内存不足时也可以运行程序;
cpu只能运行加载到内存中的程序,所以为了实现虚拟内存,就必须将实际内存的内容和磁盘上虚拟内存的内容进行置换。就相当于流水线,一边运行一边从磁盘向内存加载程序。
windows操作系统中就提供了虚拟内存机制。虚拟内存方法有分页式和分段式,而windows使用的是分页式。指不考虑程序构造,将程序按一定大小的页(page)进行分割,并以页为单位与磁盘置换; windows计算机一般的页大小是4KB。
page in : 磁盘到内存page out : 内存到磁盘
windows在磁盘上提供了虚拟内存用的文件( page file),文件大小就是虚拟内存大小,一般为实际内存的一倍到两倍。
4.节约内存的编程方法
虚拟内存虽然可以一定程度解决内存不足的情況,但 page in和 page out也会让运行程序变慢;要想从根本上解决内存不足问題,要不增加内存容量,要不尽量将运行文件变小;
1)通过DLL文件实现函数共有
多个应用共有一个DLL文件,这样就可以节约内存。 windows其实也是多个DLL文件的集合体。
2)调用_ stdcall来减小程序文件大小
c语言中,在调用函数后,会执行栈清理处理指令,将不需要的数据从函数传参时用到的栈区中清理出去。
该命令是编译器自动加到程序中的,默认加到函数调用方。比如在main函数中调用其它函数,就会加到main函数方。但是,如果main函数中调了同一个函数多次,就会处理多次,造成内存浪费。
在函数前加_ stdcall,可以把栈处理变成在被调函数一方进行。
5.磁盘的物理结构
磁盘将物理表面划分成多个空间来使用,有扇区方式和可变长方式,一般windows计算机的硬盘和软盘都是扇区方式。
扇区是对磁盘进行物理读写的最小单位,windows中1个扇区是512字节。不过在软件方面对磁盘读写的单位是簇,簇是扇区的整数倍。不同文件不能存在同一簇中,所以一个文件就算再小也占一个簇,没被填满的区域会保持不被使用的状态。
6.说明
本文为《程序是怎样跑起来的》读书笔记,如有错误,请兄弟们指正,大家一起进步!
如果觉得《磁盘与内存的亲密关系 -磁盘缓存和虚拟内存》对你有帮助,请点赞、收藏,并留下你的观点哦!