计算机|内存与磁盘的关系,我相信你应该知道的w

​1、程序运行于内存

编过程序的人都知道,程序保存在存储设备中,通过有序地读出来实现运行,这一机制称为存储程序方式

计算机内的主要存储部件是内存和磁盘。磁盘中存储的程序必须加载到内存后才能运行,这是因为,负责解析和运行程序的CPU需要通过内部程序计数器(就是那个只有一个的寄存器)来指定内存地址,然后才能读出程序。即使CPU能运行磁盘内的程序,由于磁盘读取速度慢,程序的运行速度还是会降低。(你见过在你GB/TB级别磁盘上直接运行程序的CPU吗/雾)

讲CPU的推送链接:计算机|程序&CPU

总之,CPU、内存、磁盘的关系如下:

在这个大前提下,内存和磁盘存在着很多亲密的关系,下面慢慢说。

2、磁盘缓存

众所周知,计算机读取数据时,速度比较:寄存器>内存>磁盘。计算机早期为了加速数据的读取,采用了磁盘缓存的方式。

磁盘缓存指的是把磁盘中读出的数据存储到内存空间的方式。这样,如果我们还需要读取同一数据,就不需要通过实际的磁盘,直接从磁盘缓存中读取数据。效果:大大改善磁盘数据的访问速度。

这种把低速设备的数据保存在高速设备在,需要时直接将其从高速设备中读出的方法也常用在Web浏览器中使用。Web浏览器通过网络获取远程Web服务器的数据并将其显示出来,因此遇到较大的文件时,就会卡掉,花费不少时间。于是Web浏览器就可以把获取的数据暂时保存在磁盘中,再次打开网站时调用磁盘中的数据,实现将低速的网络数据保存到相对高速的磁盘中。

同样的,这种东西就可以解释你电脑磁盘为啥越来越小。很多软件也用缓存的思想存储数据,加速软件体验,但整体上电脑跑数据越来越慢。因此,安装软件时,能不装C盘就不要装C盘。(不信在「我的电脑上」搜TEMP,一大堆文件和文件夹/狗头)

3、虚拟内存

虚拟内存指把磁盘的一部分作为假想的内存来使用,与磁盘缓存(虚假的内存)相对,是虚假的内存。

借助虚拟内存,在内存不足时也可以运行程序,如只剩下5M的内存时也可以运行10M的程序。不过,CPU依然只能执行加载到内存中的程序,所以,虚拟内存虽然是把磁盘作为内存的一部分使用,但实际运行的程序部分必须存在在内存中,即为了实现虚拟内存,必须把实际内存(真正的内存)上的内容和磁盘上的虚拟内存(虚假的内存)进行置换并同时运行程序

4、DLL文件

 

以上,说的都是合理利用甚至可以说是巧用内存的方式,但是却不能从根本上解决内存过小而产生的问题。比如你一个8G的内存自然运行不了10G的程序吧。

一般来说,解决问题的方式有两种,尽人事,听天命。天命就是扩大内存,内存一大,啥都好说,就跟钱能解决的事都不叫事一样。尽人事,则是尽量减少程序的大小。天命那是你有没有钱买大内存的事,尽人事才是计算机科学家该考虑的。

DLL文件,全名Dynamic Link Library文件,是在程序运行时可以动态加载Library(函数和数据的集合,就是调包)的文件。在windows操作系统中经常看到这些文件。(想起了以前看见想删又不敢删的我)

DLL文件有个特点,就是多个应用可以共有同一个DLL文件,从而节省内存使用。比如应用A和应用B都要运行相同的函数F,一般来说,同时运行这两个应用,内存就要加载2次应用F,但是如果这个函数是独立的DLL文件而不是执行文件EXE文件,那么内存就只需要加载1次DLL文件就可以了。这样一来,内存的利用效率就会高很多。

同样的,DLL还有个优点,如果以后我要修改函数了,只需要升级DLL文件即可,而不同每个应用单独升级。

简单来说,就是模块化思想,所有的代码只出现一次,至于多次使用,调用就完事了。

5、_stdcall

这是C里面减小程序文件的方法。

之前内存篇提到,内存中有栈储存函数调用,用后进先出的方式达到正确调用。注意到,后进先出,这里函数的调用指令终究要出栈,涉及到一个栈清理的问题。

内存篇:计算机|内存

在C里面,调用函数后,会自动执行栈清理指令。栈清理处理定义上讲,是把不需要的数据从「接收和传递函数的参数时使用的内存上的」栈区域中清理出去。这个部分是编译器自动附加到程序中的。

在同一个程序中,同样的函数可能会被反复调用,这时栈清理的内容也是一样的,就会导致这个函数在栈内反复去世。而内存作为刀斧手就会觉得好麻烦啊,为了给函数和内存一个痛快,在函数前加上_stdcall就会让这个默认的清理过程不进行,节省内存空间。(这里节省的是多个清理过程的机器代码,但是调用代码还是不能节省的)

6、磁盘的物理结构

 

讲了这么多磁盘和内存的关系,那磁盘又是什么样的?

磁盘是通过把其物理表面划分成多个空间来使用的,划分方式有扇区方式和可变长方式。

扇区方式就是把磁盘划分为固定长度的空间,可变长方式把磁盘划分为长度可变的空间。一般Windows计算机用前者,把磁盘表面分成若干同心圆的空间(磁道),磁道按固定大小(能存储的空间)划分成的空间就是扇区。

以前Windows中使用的磁盘,一个扇区512B,现在大了,一个扇区4K。但一个扇区一个扇区地读太慢了,你的电脑再怎么256G该有吧,256GB÷4KB=64M,电脑内有6400万个扇区,按扇区读取的话,那你的硬盘真的是飞快地转。

实际上Windows在磁盘中进行读写的单位是扇区的整数倍簇。1簇可以是4K/8K/16K等等。磁盘越大,簇越大。

贴一下涉及到的之前的文章

CPU篇:计算机|程序&CPU

内存篇:计算机|内存


码文不易,ballball关注了,给大家表演debug了

发布了13 篇原创文章 · 获赞 2 · 访问量 944

猜你喜欢

转载自blog.csdn.net/chengduxiu/article/details/104385132
今日推荐