认识磁盘disk
计算机的五大基础部件是存储器、控制器、运算器、输入和输出设备。
其中存储器分为内存和磁盘。
磁盘和内存都具有存储功能,他们都是存储设备。区别在于,内存是通过电流来实现存储;磁盘则是通过磁记录技术来实现存储。内存是一种高速,造价昂贵的存储设备;而磁盘则是速度比较慢、造价低廉的存储设备;电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。内存是属于内部存储设备,硬盘是属于外部存储设备。一般在我们的计算机中,磁盘和内存是相互配合共同作业的。
一般内存指的就是主存(负责存储CPU中运行的程序和数据);早期的磁盘指的是软磁盘(soft disk,简称软盘)

如今常用的磁盘是硬磁盘(hard disk,简称硬盘),

磁盘中存储的程序必须加载到内存中才能运行,在磁盘中保存的程序是无法直接运行的,这是因为负责解析和运行程序内容的CPU事需要通过程序计数器来指定内存地址从而读出程序指令的。

1,磁盘构件
1, 磁盘缓存
磁盘往往和内存是互利共生的关系,相互写作,彼此持有良好的合作关系。每次内存都需要从磁盘上读取数据,必然会读到相同的内容,所以一定会有一个角色负责存储我们经常需要读到的内容。我们大家做软件的时候经常会用到缓存技术,那么硬件层面也不例外,磁盘也有缓存,磁盘的缓存叫做磁盘缓存。
磁盘缓存指的是把磁盘中读出的数据存储到内存的方式,这样一来,当接下来需要读取相同的内容时,就不会再通过实际的磁盘,而是通过磁盘缓存来读取。某一种技术或者框架的出现势必要解决某种问题的,那么磁盘缓存就大大改善了磁盘访问的速度。

把低速设备的数据保存在高速设备中,需要时可以直接将其从高速设备中读出,这种缓存方式在web中应用比较广泛,web浏览器是通过网络来获取远程web服务器的数据并将其显示出来。因此,在读取较大的图片的时候,会耗费不少时间,这时web浏览器可以把获取的数据保存在磁盘中,然后根据需要显示数据,再次读取的时候就不用重新加载了。
2,虚拟内存
虚拟内存是内存和磁盘交互的第二个媒介。虚拟内存是指把磁盘的一部分作为假想内存来使用。这与磁盘缓存是假想的磁盘(实2上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个完整的地址空间),但是实际上,它通常被分割成多个物理碎片,还有部分存储在外部磁盘管理器上,必要时进行数据交换。
计算机中的程序都要通过内存来运行,如果程序占用内存很大,就会将内存空间耗尽。为了解决这个问题,windows操作系统运用了虚拟内存技术,通过拿出一部分硬盘来当做内存使用,来保证程序耗尽时内存仍然有存储的空间。虚拟内存在硬盘上的存在形式就是PAGEFILE.SYS这个页面文件。
通过借助虚拟内存,在内存不足时仍然可以运行程序。例如,在只剩5MB内存空间的情况下仍然可以运行10MB的程序。由于CPU只能执行加载到内存中的程序,因此,虚拟内存的空间就需要和内存中的空间进行置换(swap),然后运行程序。
1,虚拟内存与内存的交换方式
虚拟内存的方法分页式和分段式两种。
windows采用的是分页式。该方式是指在不考虑程序构造饿情况下,把运行的程序按照一定大小的页进行分割,并以页为单位进行置换。在分页式中,我们把磁盘的内容读到内存中称为page in,把内存的内容写入磁盘称为page out。windows计算机的页大小为4KB,也就是说,需要把应用程序按照4KB的页来进行切分,以页page为单位放到磁盘中,然后进行置换。

为了实现内存功能,windows在磁盘上提供了虚拟内存使用的文件(page file,页文件)。该文件由windows生成和管理,文件的大小和虚拟内存大小相同,通常大小是内存的1~2倍。
3,节约内存
windows是以图形界面为基础的操作系统。它的前身是MS-DOC,最初的版本可以在128kb的内存上运行程序,但是现在想要windows运行流畅至少需要512MB的内存,但通常往往是不够的。
虚拟内存确实能够在内存不足的时候提供补充,但是使用虚拟内存的page in 和 page out 通常伴随着低速的磁盘访问,这是一种得不偿失的表现,所以虚拟内存无法从根本上解决内存不足的情况。
为了从根本上解决内存不足的情况,要么是增加内存的容量,加内存条;要么是优化应用程序,使其尽可能变小。
1,通过DLL文件实现函数共有
DLL(Dynamic Link Library)文件,是一种动态链接库文件,顾名思义,是在程序运行时可以动态加载Library(函数和数据的集合)的文件。此外,多个应用可以共有一个DLL文件。而通过共有一个DLL文件则可以达到节约内存的效果。
windows操作系统其实就是无数个DLL文件的集合体。有些应用在安装时,DLL文件也会被追加。应用程序通过这些DLL文件来运行,既可以节约内存,也可以在不升级exe文件的情况下,通过升级DLL文件就可以完成更新。
2,通过调用_stdcall来减少程序文件的大小
通过调用_stdcall来减少程序文件的发昂达,是用C语言编写应用时可以利用的高级技巧。
_stdcall是standard call(标准调用)的缩写。windows提供的DLL文件内的函数,基本都是通过_stdcall调用方式来实现的,这主要是为了节约内存。另一方面,用C语言编写的程序默认都不是_stdcall,C语言特有的调用方式称为C调用,C语言默认不使用_stdcall的原因是因为C语言所对应的函数传入参数是可变的,只有函数调用方才能知道到底有多少个参数,在这种情况下,栈清理作业便无法进行。不过,在C语言中,如果函数的参数和数量固定的话,置顶_stdcall是没有任何问题的。
C语言和java最主要的区别之一在于C语言需要人为控制释放内存空间。
C语言中,在调用函数后,需要人为执行栈清理指令。把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去的操作叫做栈清理处理。
例如:
//函数调用方
void main(){
int a;
a = MyFunc(123,456);
}
//被调用方
int MyFunc(int a,int b){
...
}
汇编之后:
push 1C8h //将参数456(=1C8h)存入栈中
push 7Bh //将参数123(=7Bh)存入栈中
call @LTD+15(MyFunc)(00401014) //调用MyFunc函数
add esp,8 //运行栈清理
代码中,从main主函数调用到MyFunc()方法,按照默认的设定,栈清理处理会附加在main主函数这一方。在同一个程序中,有可能会多次调用,导致MyFunc()会多次清理,这就会造成内存的浪费。
C语言通过栈来传递函数的参数,使用push是往栈中存入数据的指令,pop是从栈中取出数据的指令。32位CPU中,一次push指令可以存储4个字节(32位)的数据。上述代码由于运行了两次push操作,所以存储了8字节的数据。通过call指令来调用函数,调用完成后,栈中存储的数据就不再需要了。于是就通过add esp,8这个指令,使存储着栈数据的esp寄存器前进8位(设定为指向高8位字节的地址),来进行数据清理。由于栈是在各种情况下都可以利用的内存领域,因此使用完毕后有必要将其回复到原始状态。上述操作就是执行栈的清理工作。另外,在C语言中,函数的返回值,是通过寄存器而非栈来返回的。
栈执行清理工作,在调用方法处执行清理工作和在反复调用方法处执行清理工作不同,使用_stdcall,标准调用的方式称为反复调用方法,在这种情况下执行栈清理开销比较小。

2,磁盘的物理结构
磁盘的物理结构指的是磁盘存储数据的形式。
磁盘是通过其物理表面换分称为多个空间来使用的。可划分为两种方式,可变长方式和扇区方式。
可变长方式:是将物理结构划分成可变的空间
扇区方式:是将磁盘结构划分为固定长度放任空间。
一般windows所使用的硬盘和软盘都是使用扇区这种方式。扇区中,把磁盘分成若干个同心圆的空间就是磁道,把磁道按照固定大小的存储空间划分而成的就是扇区。

扇区是对磁盘进行物理读写的最小单位。windows中使用的磁盘,一般是一个扇区512个字节。不过,windows在逻辑方面对磁盘进行读写的单位是扇区整数倍数簇。根据磁盘容量不同功能,1簇可以是512字节(1簇=1扇区)、1KB(1簇=2扇区)、2KB、4KB、8KB、16KB、32KB(1簇=64扇区)。簇和扇区的大小是相等的。
不管是硬盘还是软盘,不同的文件是不能存储在同一簇中的,否则就会导致只有一方的文件不能删除。所以,不管多小的文件,都会占用1簇的空间。这样一来,所有的文件都会占用1簇的整倍数的空间。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
