通俗易懂理解内存和磁盘的作用和关系

内存是什么

计算机是进行数据处理的设备,而程序表示的就是处理顺序和数据结构。由于处理对象数据是存储在内存和磁盘上的,因此程序必须能自由地使用内存和磁盘。

内存实际上是一种名为内存IC 的电子元件。虽然内存IC 包括DRAM、SRAM、ROMA 等多种形式,但从外部来看,其基本机制都是一样的。 内存IC 中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC 的引脚),通过为其指定地址(address),来进行数据的读写。

ROM(Read Only Memory)是一种只能用来读取的内存。
RAM(Random Access Memory)是可被读取和写入的内存,分为需要经常刷新(refresh)以保存数据的DRAM(Dynamic RAM),以及不需要刷新电路即能保存数据的SRAM(Static RAM)。

在计算机领域,大写字母K表示的并不是1000,而是2 的10次幂的结果1024。1000 通常用小写k 来表示。

虽然内存的实体是内存IC,不过从程序员的角度来看,也可以把它假想成每层都存储着数据的楼房,并不需要过多地关注内存IC 的电源和控制信号等。内存为1KB 时,表示的是如图所示的有1024层的楼房(这里地址的值是从上往下逐渐变大,不过也有与此相反的情况)。
在这里插入图片描述

不过,程序员眼里的内存模型中,还包含着物理内存中不存在的概念,那就是数据类型。

编程语言中的数据类型表示存储的是何种类型的数据。从内存来看,就是占用的内存大小(占有的楼层数)的意思。

即使是物理上以1 个字节为单位来逐一读写数据的内存,在程序中,通过指定其类型(变量的数据类型等),也能实现以特定字节数为单位来进行读写。

内存和磁盘

一般把输入装置、输出装置、存储器、运算器和控制器这5 种部件设备称为计算机的5 大部件。

程序保存在存储设备中,通过有序地被读出来实现运行,这一点大家都很清楚。这一机制称为 存储程序方式(程序内置方式)

计算机中主要的存储部件是内存和磁盘。

磁盘中存储的程序,必须要加载到内存后才能运行。在磁盘中保存的原始程序是无法直接运行的。

这是因为,负责解析和运行程序内容的CPU,需要通过内部程序计数器来指定内存地址,然后才能读出程序。即使CPU 可以直接读出并运行磁盘中保存的程序,由于磁盘读取速度慢,程序的运行速度还是会降低。总之,存储在磁盘中的程序需要读入到内存后才能运行。
在这里插入图片描述
磁盘分为硬盘和软盘,它们都是外部存储器。外部存储器的特点就是不受断电的影响。那硬盘和软盘又有什么区别呢?

硬盘一般都装在机箱里面,容量较大,能够存储的文件比较多。

而软盘并不是装在电脑里面的,而是可移动的,一般用来存储文件和不同电脑之间进行拷贝文件,就功能上来说它和现在的U盘是一样的,只是外形、存储原理不一样,它的容量要比硬盘小的多,比如最常用的3.5英寸的软盘容量只有1.44MB,这么小的存储空间对于目前的我们来说基本上什么也干不了,而且它的存储速度要比硬盘慢很多。所以只有早期的电脑才会用软盘,目前已经被淘汰。

磁盘缓存加快了磁盘访问速度

作为体现内存和磁盘亲密关系的第一个示例,首先让我们来看一下磁盘缓存(disk cache) 。磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中把内容读出。使用磁盘缓存可以大大改善磁盘数据的访问速度。磁盘缓存的缓存(cache)是高速缓存、仓库的意思。
在这里插入图片描述
Windows 作为操作系统提供了磁盘缓存机制。不过,对普通用户来说,磁盘缓存发挥显著效果的时代只延续到Windows 95/98。

现在,随着硬盘访问速度的大幅改善,磁盘缓存的效果也没有之前那么明显了。把低速设备的数据保存在高速设备中,需要时可以直接将其从高速设备中读出,这种缓存的方式在其他情况下也会用到。

其中的一个实例就是在Web 浏览器中的使用。由于Web 浏览器是通过网络来获取远程Web 服务器的数据并将其显示出来的。因此,在显示较大的图片等文件时,会花费不少时间。于是,Web 浏览器就可以把获取的数据暂时保存在磁盘中,然后在需要时再显示磁盘中的数据。也就是说,把低速的网络数据保存到相对高速的磁盘中。

虚拟内存把磁盘作为部分内存来使用

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

通过借助虚拟内存,在内存不足时也可以运行程序。例如,在只剩下5MB 内存空间的情况下也能运行10MB 大小的程序。不过,就如本章开头所讲述的那样,CPU 只能执行加载到内存中的程序。虚拟内存虽说是把磁盘作为内存的一部分来使用,但实际上正在运行的程序部分,在这个时间点上是必须存在在内存中的。也就是说,为了实现虚拟内存,就必须把实际内存(也可称为物理内存)的内容,和磁盘上的虚拟内存的内容进行部分置换(swap),并同时运行程序。

Windows 作为操作系统提供了虚拟内存机制。在当前的Windows 中,虚拟内存依然发挥着很大的作用。虚拟内存的方法有分页式和分段式两种。

Windows 采用的是分页式。
该方式是指,在不考虑程序构造的情况下,把运行的程序按照一定大小的页(page)进行分割,并以页为单位在内存和磁盘间进行置换。在分页式中,我们把磁盘的内容读出到内存称为Page In,把内存的内容写入磁盘称为Page Out。一般情况下,Windows 计算机的页的大小是4KB。也就是说,把大程序用4KB 的页来进行切分,并以页为单位放入磁盘(虚拟内存)或内存中。

为了实现虚拟内存功能,Windows 在磁盘上提供了虚拟内存用的文件(page file,页文件)。该文件由Windows 自动做成和管理。文件的大小也就是虚拟内存的大小,通常是实际内存的相同程度至两倍程度。通过Windows 的控制面板,可以查看或变更当前虚拟内存的设定。

分段式虚拟内存是指,把要运行的程序分割成以处理集合及数据集合等为单位的段落,然后再以分割后的段落为单位在内存和磁盘之间进行数据置换。
在这里插入图片描述

节约内存的编程方法

像Windows 这样,窗口的菜单及图表等都可以进行可视化操作的方式称为图形用户界面。Windows 的前身MS-DOS 操作系统,是由键盘输入命令来进行操作的CLI(命令行界面)。

以图形用户界面(GUI,Graphical User Interface)为基础的Windows,可以说是一个巨大的操作系统。Windows 的前身是MS-DOS操作系统, 最初版本可以在128KB 左右的内存上运行, 而想要Windows 流畅运行的话, 至少需要512MB 的内存。而且, 由于Windows 具有多任务功能,在巨大的Windows 操作系统中可以同时运行多个应用,因此,即使是512MB 的内存,有时也无法保证流畅运行。Windows 操作系统经常为内存不足所困。

许多人可能会认为,通过借助磁盘虚拟内存就可以解决内存不足
的问题。而虚拟内存也确实能避免因内存不足导致的应用无法启动。

不过,由于使用虚拟内存时发生的Page In 和Page Out 往往伴随着低速的磁盘访问,因此在这个过程中应用的运行会变得迟钝起来。想必大家也都有过在操作应用的过程中硬盘访问灯一直亮着(这时正在进行Page In 和Page Out),导致应用一时无法操作的不愉快经历吧。也就是说,虚拟内存无法彻底解决内存不足的问题。

为了从根本上解决内存不足的问题,需要增加内存的容量,或者尽量把运行的应用文件变小。

接下来会向大家介绍两个把应用文件变小的编程方法。虽然增加内存容量更为便捷,但是花费也高,所以大家还是需要先看一下口袋里面的银子再来做决定。

通过DLL 文件实现函数共有

DLL(Dynamic Link Library)文件,顾名思义,是在程序运行时可
以动态加载Library(函数和数据的集合)的文件。此外,还有一个需要大家注意的地方,那就是多个应用可以共有同一个DLL 文件。而通过共有同一个DLL 文件则可以达到节约内存的效果。

Windows 的操作系统本身也是多个DLL 文件的集合体。有时在安
装新应用时,DLL 文件也会被追加。应用则会通过利用这些DLL 文件的功能来运行。像这样,之所以要利用多个DLL 文件,其中一个原因就是可以节约内存。而且DLL 文件还有一个优点就是,在不变更EXE文件的情况下,只通过升级DLL 文件就可以更新。

Windows 中,可以执行的应用文件的扩展名是.exe,这样的文件就称为EXE 文件。exe 是executable(可执行)的略写。另一方面,DLL 文件的扩展名为.dll。

通过调用_stdcall 来减小程序文件的大小

通过调用_stdcall来减小程序文件的方法,是用C 语言编写应用时可以利用的高级技巧

_stdcall 是standard call(标准调用)的略称。Windwos 提供的DLL 文件内的函数,基本上都是_stdcall 调用方式。这主要是为了节约内存。

另一方面,用C 语言编写的程序内的函数,默认设置都不是_stdcall。C 语言特有的调用方式称为C 调用。C 语言之所以默认不使用_stdcall,是因为C 语言所对应的函数的传入参数是可变的(可以设定任意参数),只有函数调用方才能知道到底有多少个参数,而这种情况下,栈的清理作业便无法进行。不过,在C 语言中,如果函数的参数数量固定的话,指定_stdcall 是没有任何问题的。

C 语言中,在调用函数后,需要执行栈清理处理指令。 栈清理处理是指,把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去。该命令不是程序记述的,而是在程序编译时由编译器自动附加到程序中的。编译器默认将该处理附加在函数调用方。

在这里插入图片描述

磁盘的物理结构

磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和 可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是指把磁盘划分为长度可变的空间。一般的Windows 计算机所使用的硬盘和软盘,采用的都是扇区方式。

扇区方式中,把磁盘表面分成若干个同心圆的空间就是磁道,把磁道按照固定大小(能存储的数据长度相同)划分而成的空间就是扇区。
在这里插入图片描述
扇区是对磁盘进行物理读写的最小单位。Windows 中使用的磁盘,一般1 个扇区是512 字节。不过,Windows 在逻辑方面(软件方面)对磁盘进行读写的单位是扇区整数倍簇。根据磁盘容量的不同,1 簇可以是512 字节(1 簇 = 1 扇区)、1KB(1 簇 = 2 扇区)、2KB、4KB、8KB、16KB、32KB(1 簇 = 64 扇区)。磁盘的容量越大,簇的容量也越大。

不过,在软盘中,1 簇 = 512 字节 = 1 扇区,簇和扇区的大小是相等的。不管是硬盘还是软盘,不同的文件是不能存储在同一个簇中的,否则就会导致只有一方的文件不能被删除。因此,不管是多么小的文件,都会占用1 簇的空间。这样一来,所有的文件都会占用1 簇的整数倍的磁盘空间。

以簇为单位进行读写时,1 簇中没有填满的区域会保持不被使用的状态。虽然这看起来是有点浪费,不过该机制就是如此规定的,所以我们也没有什么好办法。另外,如果减少簇的容量,磁盘访问次数就会增加,就会导致读写文件的时间变长。由于在磁盘表面上,表示扇区区分的领域是必要的,因此,如果簇的容量过小,磁盘的整体容量也会减少。扇区和簇的大小,是由处理速度和存储容量的平衡来决定的。

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值