《程序是怎样跑起来的》(中)

2019-05-02  本文已影响0人  c747190cc2f5

学习笔记

第4章 熟练使用有棱有角的内存

本章提问



本章重点

对内存要有物理上和逻辑上的认识。


4.1 内存的物理机制很简单

内存实际上是一种名为内存IC的电子元件,包括DRAM,SRAM、ROM多种形式。


内存引脚配置示例

内存可以存储多少数据?
数据引脚有D0~D7共8个,一次可以输入输出8位(1字节)的数据,地址信号有10个,即可表示1024个不同地址,所有内存可以存储1024字节,即1KB的数据。
实际计算机中,会有更多的地址信号引脚,可以存储更多的数据。
内存的读写,改变控制位WR、RD,指定地址即可。


内存读写

4.2 内存的逻辑模型是楼房

数据类型不同,占用内存大小不同。


1KB内存的模型
数据类型不同,占用内存不同

4.3 简单的指针

指针也需要指定数据类型,数据类型表示从指针指向的内存中一次性读取的字节数。



假设d、e、f都是一百,则使用三个指针从地址为100的内存中读取的字节数不同:


指针的数据类型表示一次可以读写的长度

4.4~4.7



问题答案

答案

第5章 内存和磁盘的关系

本章问题

问题

5.1 不读入内存就无法运行

程序要加载到内存之后才能运行

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

磁盘缓存指的是把从磁盘中读取的数据存储到内存的一种方式,可以加快数据的访问速度。
但是随着现在磁盘能力的提升,磁盘缓存的作用已经没有那么明显了。


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

为了实现虚拟内存,必须把实际内存同虚拟内存进行部分置换,并同时运行程序。


5.4 节约内存的编程方法

两种方法。

第一种方法:通过DLL(Dynamic Link Library,动态链接库)文件实现函数共有
比如有两个应用程序都包含了一个同样的函数: 静态链接

两个应用可以通过DLL文件共有这个函数,从而节约了内存:


动态链接
第二种方法,通过调用_stdcall来减少程序文件大小
关于stdcall

C语言中,调用完函数需要进行栈清理,比如从main()中调用MyFunc(),按照默认设定,栈清理会附加在main()一方,如果反复调用就会反复清理,造成内存浪费。如果用_stdcall把int MyFunc(int a)变为int   _stdcall MyFunc(int a),栈清理就会在MyFunc一方执行,清理一次即可。



5.5 磁盘的物理结构

一般有扇区方式、可变长方式两种,前者长度固定,后者反之。Windows采用扇区方式。
一般一个扇区是512字节,簇是扇区的整倍数,即n扇区。
不同文件不能存储在同一个簇中,不管多小的文件,最少占用一个簇的空间。
如果簇的容量设定过小,那么文件读写就会变慢,如果过大,就会浪费存储空间。所以,簇的大小,是由处理速度和存储容量的平衡来决定的。


问题答案

答案

第6章 亲自尝试压缩数据

本章问题:

问题

6.1 文件以字节为单位保存

文件是字节数据的集合体

6.2 RLE算法的机制

即字节×重复次数

RLE
关于RLE

6.3 RLE算法的缺点

此书作者曾对不同文件做过RLE实验,结果如下:


可以看出,文本文件的压缩率不降反增,那是因为文本文件中出现重复字符的几率比较小,加入的重复次数反而占据了更多了存储空间。我们可以想办法进行改进,比如不统计单个字符的重复字数,而统计单词的重复次数等等。

6.4 通过摩尔斯编码来看哈夫曼算法的基础

哈夫曼编码的关键就是“常用的字符用较少的比特表示,不常用的字符可以用较多的比特表示”,但要注意不管满不满8个比特,最后都要以8个比特存储在内存中(如下图),这会使程序变得复杂,但是压缩率也会高不少。


摩尔斯电码就不说了。

6.5 用二叉树实现哈夫曼编码

摩尔斯电码的编码体系是固定的,而哈夫曼为不同的压缩对象构建不同的编码体系。

用哈夫曼压缩的文件构造
以AAAAAABBCDDEEEEEF为例:
编码方案
构造哈夫曼树
哈夫曼不用在字符之间添加分隔符号,因为字符都是叶子节点,不会重复也不会互相包含(数据结构中有学过)。

6.6 哈夫曼算法能够大幅提高压缩比率

哈夫曼效果

6.7 可逆压缩与非可逆压缩

根据是否能还原为压缩前的状态,分为可逆压缩和非可逆压缩。


程序的exe文件和文本文件的每一个字符都不可丢失,所以要采用可逆压缩;对于图片来说,如果模糊一些也可以接受,则可以采用非可逆压缩。

问题答案

答案

第7章 程序是在何种环境中运行的

本章问题:

问题

7.1 运行环境=操作系统+硬件

7.2 Windows克服了除CPU以外的硬件差异

7.3 不同操作系统的API不同

7.4 FreeBSD Port帮你轻松使用源代码

7.5 利用虚拟机获得其它操作系统环境

这个不多讲了


7.6 提供相同运行环境的Java虚拟机

Java在不同虚拟机上运行

7.7 BIOS和引导

问题答案:

答案

《程序是怎样跑起来的》(下)

上一篇 下一篇

猜你喜欢

热点阅读