《程序是怎样跑起来的》第五章
本章主要讲的是内存和磁盘的密切联系。从存储程序指令和数据的角度来看,可以说内存和磁盘的功效是一样的,在计算机的五大部件中,内存和磁盘都属于存储器,但是利用电流实现存储的内存和利用磁实现存储的磁盘还是有所不同的,在存储容量相同的前提查内存速度快,但价格贵,磁盘速度慢,但价格便宜。存储程序方式就是程序要先存储在存储器中,然后才被依次读取执行。计算机中的存储器包括内存和磁盘存储在磁盘中的程序,需要先加载的内存才能运行,不能在磁盘上直接运行,这是因为CPU在对程序内容进行解释和运行时是通过其内部的程序计数器指定内存地址来读取程序的,即便CPU能够直接读取并运行,磁盘上的程序由于磁盘读取速度慢,所以程序运行速度也会很慢,存储在磁盘中的程序需要先加载到内存后才能运行。此番缓存是一块内存空间,用于临时存放,从磁盘读取出来的数据,下次需要读取相同的数据时,就不需要实际访问磁盘,而是从磁盘缓存中读取数据就可以了。因此,磁盘缓存可以提高磁盘访问数据的速度。
将低速设备中的数据保存在高速设备中,当需要相同数据时,直接从高速设备中读取,这样的设计就叫做缓存。虚拟内存就是将磁盘的一部分模拟成内存来使用的机制,磁盘缓存是将内存看成虚拟的磁盘,与之相对,虚拟内存就是将磁盘看成虚拟内存。虚拟内存的实现方式分为分页式和分段式WINDOWS采用的是分页式,在这种方式中要运行的程序,无论结构如何,都会被划分为一定大小的页面,并以页面为单位,在内存和磁盘之间进行置换。在分页式中将磁盘中的内存读入内存称为页面,换入将内存中的内容写入磁盘,称为页面换出。一般来说,PC中页面的大小为4 KB,大的程序会被分割为多个大小。为4 KB的页面,并以页面为单位存放在磁盘或内存中。
如果要彻底解决内存不足这个问题,只能增加内存的容量或者是缩减应用程序的大小。我们可以通过DLL文件共享函数DLL文件,顾名思义,就是在程序运行时进行动态链接的库。但除此之外,我们还需要关注,那就是多个应用程序可以共享同一个DLL文件,这样就可以达到节约内存的效果。第二种方法就是通过_stdcall调用缩减程序大小,通过_stdcall调用缩小程序大小是C语言程序开发的一种高级技巧,但是同样的思路应该也适用于其他编程语言。接下来我们来了解一下磁盘的物理构造,磁盘的表面在物理上被划分为若干个区域,划分区域的方法分为按固定长度划分的扇区方式以及按可变长度划分的可变方式,一般PC所使用的硬盘是采用扇区方式来计较划分的,在扇区方式中硬盘表面被划分为若干个同心圆的磁道,每条磁道再被划分为若干固定长度的扇区。扇区是磁盘在物理上可读写的最小单位,WINDOWS中的磁盘一个扇区的长度一般为512节,但是windows在逻辑上读写磁盘的,水是醋,它的长度是扇区的整数倍,其实际长度根据硬盘容量确定,有512字节1 KB 2 KB 4 KB 8 KB 16 KB 32 KB等多种情况,磁盘容量越大,簇的长度也就越大。同一个簇中,不能存放不同的文件,否则无法只删除簇中的部分文件。因此,无论多小的文件都要占用一个促的空间,所有文件实际占用的磁盘空间是促的整数倍。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗