计算机内存和磁盘的关系

计算机内存和磁盘的关系

前言

上篇文章详细讲了计算机内存的物理结构,逻辑结构以及在内存的基础上理解几种常见的数据结构。但是,计算机系统出了内存之外,还有一个非常重要的硬件,那就是磁盘。他们都是用于计算机存储,但是内存是利用电流来实现存储,而磁盘是利用磁效应来实现存储,并且,从存储容量来看, 内存是高速高价,而磁盘则是低速廉价。在计算机这个系统中,高速小容量的内存与低速高容量的磁盘进行协同作业。本文详解内存与磁盘之间的那些事儿。

一、首先要明确一个前提

我们知道计算机是利用CPU进行数据的运算的,但CPU只能对内存中的数据进行运算,而对于磁盘中的数据是不能运算的。如果要运算磁盘中的数据,必须先把磁盘中的数据读入内存,CPU才能进行运算。
在这里插入图片描述

二、如何提高磁盘数据的访问速度?

磁盘缓存可以用来提高磁盘访问速度。什么是磁盘缓存呢?其实很简单,既然CPU只能运算内存中的数据,磁盘中的数据必须读入内存才能处理,那么提高磁盘访问速度的最直接的方法,就是把磁盘中的数据事先读入内存中去,存储磁盘数据的内存空间称为磁盘缓存,当接下来需要读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中把内容读出。
在这里插入图片描述

三、内存因高价,一般容量很小,那么如何通过低价大容量的磁盘来扩大内存的容量呢?

  • 虚拟内存是指把磁盘的一部分作为假想的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。
  • 那么,如何把磁盘当做内存来使用呢?CPU只能对内存中的数据进行处理,这点是不变的,如果想要把磁盘当做内存来用,那么也必须把磁盘中的数据读入内存才能使用。因此,虚拟内存虽说是把磁盘作为内存的一部分来使用,但实际上正在运行的程序部分,在这个时间点上是必须存在在内存中的。也就是说,为了实现 虚拟内存,就必须把实际内存(也可称为物理内存)的内容,和磁盘上的虚拟内存的内容进行部分置换(swap),并同时运行程序。也就是说在某一时刻,将内存中不用的数据放到磁盘中,空出内存空间,然后把磁盘中需要计算的数据读入内存中来完成置换。
  • 那么,又如何实现磁盘内存的内容和虚拟内存的内容进行置换呢?虚拟内存的方法有分页式和分段式两种。分页式和分段式都是磁盘和内存进行内容一次置换的基本单位。
  • 分段式虚拟内存是指,把要运行的程序分割成以处理集合为单位的段落,然后再以分割后的段落为单位在内存和磁盘之间进行数据置换。
  • 分页式虚拟内存是指, 在不考虑程序构造的情况下,把运行的程序按照一定大小的页(page) 进行分割,并以页为单位在内存和磁盘间进行置换。Windows 计算机的页的大小是 4KB。也就是 说,把大程序用4KB的页来进行切分,并以页为单位放入磁盘(虚拟 内存)或内存中
    在这里插入图片描述

四、真正节约内存的编程方法

  • 使用虚拟内存时发生的Page In和Page Out往往伴随着低速的磁盘访问,因此在这个过程中应用的运行会变得迟钝起来。也就是 说,虚拟内存无法彻底解决内存不足的问题。那么为了从根本上解决内存不足的问题,需要增加内存的容量,或者尽量把运行的应用文件变小。
  • 而增加内存的代价昂贵,因此一般是想方设法把应用文件变小。那么如何将应用文件变小呢?有两种方法
  • (1)通过 DLL 文件实现函数共有。DLL(Dynamic Link Library)文件 ,顾名思义,是在程序运行时可以动态加载Library(函数和数据的集合)的文件。此外,还有一个需要大家注意的地方,那就是多个应用可以共有同一个DLL文件,而通过共有同一个DLL文件则可以达到节约内存的效果。与动态链接库相对应的是静态链接库,动态链接库可以实现文件共享,而静态链接库则不能实现。如下对比图
    在这里插入图片描述在这里插入图片描述
  • (2)通过调用 _stdcall 来减小程序文件的大小 。C 语言中,在调用函数后,需要执行栈清理处理指令(把不需要的数据从内存上的栈区域中清理出去)。编译器默认将该处理附加在函数调用方,这会导致每次调用函数,都会重复执行同样的栈清理操作,就会造成内存的浪费。那么如果栈清理操作在被调用方执行,这样相同的栈清理工作就会只执行一次就可以了,起到节约内存的功能。通过调用_stdcall就可以实现栈清理操作在被调用方执行。
    在这里插入图片描述

五、磁盘存储数据的形式(磁盘的物理结构)

  • 磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是指把磁盘划分为长度可变的空间。一般的Windows计算 机所使用的硬盘和软盘,采用的都是扇区方式。
  • 扇区方式中,把磁盘 表面分成若干个同心圆的空间就是 磁道,把磁道按照固定大小(能存储 的数据长度相同)划分而成的空间就是扇区。
    在这里插入图片描述
  • 扇区是对磁盘进行物理读写的最小单位。Windows中使用的磁盘, 一般1个扇区是512字节。不过Windows在逻辑方面对磁盘进行读写的单位是扇区的整数倍(簇),这个很好理解,存入磁盘中的数据必须保证其完整性,如果数据小于512k,则一扇区就够了,但如果数据大于512k,这是再用一扇区的区域去存储数据,就会导致数据在磁盘内存上的“分离”而导致不完整性。因此,不管多么小的文件都要占用一簇,不管多么大的文件也都要占用一簇,这时候一簇是多少个扇区,就要更加数据大小来确定了。

猜你喜欢

转载自blog.csdn.net/qq_41834553/article/details/113797061