《程序是怎样跑起来的》读书笔记(第五章)——内存和磁盘的亲密关系

本文详细介绍了存储程序方式、磁盘缓存、虚拟内存以及Windows中DLL动态链接库的使用,揭示了如何通过内存管理和编程技巧提升系统性能。磁盘缓存通过内存加速数据访问,虚拟内存则允许在内存不足时运行大型程序。动态链接库(DLL)实现了函数的共享,减少了内存消耗,而_stdcall调用约定则有助于减小程序文件大小。
摘要由CSDN通过智能技术生成

一、课前热身

1.  存储程序方式指的是什么?
2.  通过使用内存来提高磁盘访问速度的机制称为什么?
3.  把磁盘的一部分作为假想内存来使用的机制称为什么?
4.  Windows 中,在程序运行时,存储着可以动态加载调用的
函数和数据的文件称为什么?
5.  在 EXE 程序文件中,静态加载函数的方式称为什么?
6.  在 Windows 计算机中,一般磁盘的 1 个扇区是多少字节?

二、 不读入内存就无法运行

  • 考虑内存和磁盘的关系之前,我们首先来看一个前提性的问题。程序保存在存储设备中,通过有序地被读出来实现运行,这一点大家都很清楚。这一机制称为存储程序方式(程序内置方式);
  • 计算机中主要的存储部件是内存和磁盘磁盘中存储的程序,必须要加载到内存后才能运行。在磁盘中保存的原始程序是无法直接运行的。这是因为,负责解析和运行程序内容的 CPU,需要通过内部程序计数器来指定内存地址,然后才能读出程序。
    在这里插入图片描述

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

  • 磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式。这样一来,当接下来需要读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中把内容读出。从而大大提高数据的访问速度;
  • 原理:把低速设备的数据保存在高速设备中,需要时可以直接将其从高
    速设备中读出,
    在这里插入图片描述

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

  • 虚拟内存是指把磁盘的一部分作为假想的内存来使用。虚拟内存是假想的内存(实际上是磁盘);
  • 虚拟内存的作用:通过借助虚拟内存,在内存不足时也可以运行程序。例如,在只剩下 5MB 内存空间的情况下也能运行 10MB 大小的程序。
  • 虚拟内存虽说是把磁盘作为内存的一部分来使用,但实际上正在运行的程序,在运行时必须加载进内存,也就是说,虚拟内存实际上就是将内存中目前尚未运行的程序与虚拟内存中将要运行的程序进行交换。
  • 虚拟内存的方法有分页式和分段式 两种。Windows 采用的是分页式。分页式是指,在不考虑程序构造的情况下,把运行的程序按照一定大小的页(page)进行分割,并以页为单位在内存和磁盘间进行置换。在分页式中,我们把磁盘的内容读出到内存称为 Page In,把内存的内容写入磁盘称为Page Out。一般情况下,Windows 计算机的页的大小是 4KB。也就是说,把大程序用 4KB 的页来进行切分,并以页为单位放入磁盘(虚拟内存)或内存中;
  • 为了实现虚拟内存功能,Windows 在磁盘上提供了虚拟内存用的文件(page file,页文件)。该文件由 Windows 自动做成和管理。文件的大小也就是虚拟内存的大小,通常是实际内存的相同程度至两倍程度。
    在这里插入图片描述

五、节约内存的编程方法

  • 以 图 形 用 户 界 面(GUI,Graphical User Interface)为 基 础 的Windows,可以说是一个巨大的操作系统。Windows 的前身是 MS-DOS操 作 系 统, 最 初 版 本 可 以 在 128KB 左 右 的 内 存 上 运 行, 而 想 要Windows 流 畅 运 行 的 话, 至 少 需 要 512MB 的 内 存。 而 且, 由 于Windows 具有多任务功能,在巨大的 Windows 操作系统中可以同时运行多个应用,因此,即使是 512MB 的内存,有时也无法保证流畅运行。Windows 操作系统经常为内存不足所困。
  • 许多人可能会认为,通过借助磁盘虚拟内存就可以解决内存不足的问题。而虚拟内存也确实能避免因内存不足导致的应用无法启动。不过,由于使用虚拟内存时发生的 Page In 和 Page Out 往往伴随着低速的磁盘访问,因此在这个过程中应用的运行会变得迟钝起来。
  • 为了从根本上解决内存不足的问题,需要增加内存的容量,或者尽量把运行的应用文件变小。

5.1、解决方式一:通过 DLL 文件实现函数共有

  • DLL:(Dynamic Link Library)顾名思义,是在程序运行时可以动态加载 Library(函数和数据的集合)的文件。此外,还有一个需要大家注意的地方,那就是多个应用可以共有同一个 DLL 文件。而通过共有同一个 DLL 文件则可以达到节约内存的效果。
  • 假设我们编写了一个具有某些处理功能的函数 MyFunc()。应用 A 和应用 B 都会使用这个函数。在各个应用的运行文件中内置函数 MyFunc()(这个称为 Static Link,静态链接)后同时运行这两个应用,内存中就存在了具有同一函数的两个程序。但这会导致内存的利用效率降低。所以,有两个同样的函数,还是有点浪费。
    在这里插入图片描述
  • 那么,如果函数 MyFunc() 是独立的 DLL 文件而不是应用的执行文件,那结果会怎样呢?由于同一个 DLL 文件的内容在运行时可以被多个应用共有,因此内存中存在的函数 MyFunc() 的程序。就只有 1 个。这样一来,内存的利用效率也就提高了。
    在这里插入图片描述

5.2、解决方式二:通过调用 _stdcall 来减小程序文件的大小

  • 通过调用 _stdcall来减小程序文件的方法,是用 C 语言编写应用时可以利用的高级技巧。不过,这一思路应该也可以应用在其他编程语言中
  • C 语言中,在调用函数后,需要执行栈清理处理指令。栈清理处理是指,把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去。该命令不是程序记述的,而是在程序编译时由编译器自动附加到程序中的。编译器默认将该处理附加在函数调用方。
  • 栈清理处理,比起在函数调用方进行,在反复被调用的函数一方进行时,程序整体要小一些。这时所使用的就是 _stdcall。在函数前加上_stdcall,就可以把栈清理处理变为在被调用函数一方进行。把代码 int MyFunc(int a, int b) 部分转成 int _stdcall MyFunc(int a, int b)进行再编译后, 同样的处理就会在函数MyFunc() 一方执行。
    在这里插入图片描述

六、磁盘的物理结构

  • 磁盘是通过把其物理表面划分成多个空间来使用的。划分的方式有扇区方式和可变长方式两种,前者是指将磁盘划分为固定长度的空间,后者则是指把磁盘划分为长度可变的空间。
  • 一般的 Windows 计算机所使用的硬盘和软盘,采用的都是扇区方式。扇区方式中,把磁盘表面分成若干个同心圆的空间就是磁道,把磁道按照固定大小(能存储的数据长度相同)划分而成的空间就是扇区。
    在这里插入图片描述
  • 扇区是对磁盘进行物理读写的最小单位。Windows 中使用的磁盘,一般 1 个扇区是 512 字节。不过,Windows 在逻辑方面(软件方面)对磁盘进行读写的单位是扇区整数倍 簇。根据磁盘容量的不同,1 簇可以是 512 字节(1 簇 = 1 扇区)、1KB(1 簇 = 2 扇区)、2KB、4KB、8KB、16KB、32KB(1 簇 = 64 扇区)。磁盘的容量越大,簇的容量也越大。不过,在软盘中,1 簇 = 512 字节 = 1 扇区,簇和扇区的大小是相等的。不管是硬盘还是软盘,不同的文件是不能存储在同一个簇中的,否则就会导致只有一方的文件不能被删除。因此,不管是多么小的文件,都会占用 1 簇的空间。这样一来,所有的文件都会占用 1 簇的整数倍的磁盘空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值