磁盘在计算机中并不可少的,决定计算机运行速度快慢的瓶颈在磁盘上。
硬盘的发展 软盘-> 叠片式->SSD芯片式硬盘(500MB,民用,2000MB,商用)。
磁盘和内存息息相关。
磁盘:
存储数据的地方
- 寄存器 :速度最快,数量最少,最贵 在cpu内部
- 内存 : 一般快,一般多,一般贵 通过内存地址来进行访问的,内存地址不代表内存
- 磁盘 : 速度最慢,数量最多,最便宜
电脑在执行程序时,有两种方式取数据
第一种方式: CPU直接从磁盘中取数据,取回寄存器中再进行运算后,再将数据存储到磁盘中
第二种方式: 通过内存, 将硬盘当中的内容加载到内存中, CPU直接访问内存。
访问内存来进行运算,当CPU中的寄存器存储不下数据,跟内存交互速度更快。
存储程序式计算机
将程序(App)存储在一个固定的地方,当运行的时候,只需要执行一次加载。
加快磁盘的运作
磁盘的介质决定了运行速度
以前使用外部介质(纸条)来存储数据(图灵机)
内存从硬盘当中读取数据要花费时间,我们设计了磁盘缓存来减少这部分时间。
磁盘缓存:
以前在(win95/win98/现在的浏览器)第一次读取的时候 ,在使用磁盘数据时,同时把数据加载在内存中 ,第二次使用的时候直接从内存中读取。( 数据库和服务端大量的使用缓存技术 )
虚拟内存:
把内存当磁盘用,速度解决了,但是内存不够用了 。于是有了虚拟内存。
将磁盘当中的一块当作内存来使用。比如 要使用1GB的空间 ,内存只有128M的时候,通过虚拟内存的方式将程序运行起来,但是CPU只能执行物理内存当中的程序,就会出现两个东西 物理内存和虚拟内存。当前可用的内存有5MB,运行的程序有10MB,从磁盘上划分出5MB做加载用,当需要使用到这块内存的时候,再与物理内存进行交换。
windows下通过分页式和分段式来进行数据的存储,例如当cpu需要执行某一段代码时,比如在物理内存放了代码的1,2,3行,虚拟内存中放了4,5,6行,执行完1,2,3行后,和 4,5,6行进行一个交换。
分段式:
需要运行的程序以处理集合(以里面的逻辑分段),物理内存里存储当前需要运行的段落,其余的放在虚拟内存里面。使用时进行交换。
分页式:
把程序做成一页一页的大小,以页为单位在物理内存和虚拟内存中交互。
硬盘上的灯一直在闪,或者卡 ,loading 就是程序在进行内存之间的交互。
winXP 中的4GB内存空间是通过虚拟内存空间来做到的
增加内存提高电脑的运行速度是因为内存之间做页面交互的次数少了。
节约内存的编程方式
1.函数共用 :动态加载 DLL 动态链接库
假设电脑中运行着两个程序,A,B,A和B都有一个相同的方法: 显示。我们通过动态链接库来存储这个方法。在windows操作系统里,有很多DLL,需要用时直接调用,一块内存可以被无限使用,来达到节省内存的目的。
2.被调用方清理栈 :
程序最终会编程二进制机器码,对应的是汇编。我们需要在程序里进行计算,存储一些临时使用的值。在内存里面有一块专门的区域来专门存储这些临时的值。这块地址就是栈。(栈不能无限大)使用完成后,栈需要回收。 一般清理栈是在一个函数调用完成之后进行清空,函数的调用分为两种调用方式: _stdcall (windows)和其他方式。
- _stdcall 被调用方底部生成addesp8 更加节省内存 调用完再清理
- 其他方式:在调用代码的下面 用addesp8进行栈的清理 每调用一次清理一次
3.数据压缩:
例如 AAAAAABBCCCDDDD 如果用 A6B2C3D4 来代表会节省空间 这就是RLE压缩算法 能很好的压缩图像,exe.(exe有很多0000的空白区),无法有效压缩文本( 有时候会造成空间扩大 )
对于文本压缩: 哈弗曼算法
比如一遍很长的文章,先计算各字符出现频率的 使用编码的方式。对于出现频道最高的用最短的编码方式表示,第二高的用第二短的..... 还原时通过编码信息还原。
硬盘:
扇区 : 磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区(簇,512byte)为基本单位。
在整体进行读写的时候以簇的方式来运行 ,1 簇等于1个扇区 。512byte,意味着存储一个了一个2byte的文件,会变成512byte.一簇里面不能有相同的文件。