磁盘和内存
共同点:磁盘和内存都具有存储功能
区别:
存储方式:
内存,通过电流来实现存储
磁盘,通过磁记录技术来实现存储
造价和读取速度:
内存:高速而且昂贵
磁盘:低速而且低廉
断电:
内存:数据会丢失,内部存储设备
磁盘:可以长久保留,外部存储设备
一般我们说的内存,就是指主存,存储cpu处理的程序和数据。
程序不读入内存就无法运行
存储程序方式:我们程序是保存存储设备中,通过使用cpu读入实现的程序指令
计算机最重要的存储设备:磁盘和内存
磁盘:磁盘中程序必须加载到内存中才能运行,主要是因为负责解析和运行程序的cpu的程序计数器来指定内存地址从而读出程序指令。
磁盘构建
缓存
做软件的过程中会遇到很多的缓存技术,磁盘也有其缓存技术,磁盘缓存。
磁盘缓存:将程序和数据从磁盘读取到内存的方式,接下来再读取这部分数据,就不用重新从磁盘中去拿,直接从缓存中去读取。所以这时候就需要这种缓存技术来完善磁盘的读取速度。
从低速设备读取到高速设备,比较常见的应用就是web҅浏览器通过远程服务器来获取数据并且显示出来,其中一些比较大的图片会缓存在本地的磁盘中,根据显示图片的时候直接进行读取。
虚拟内存
虚拟内存:本质是是磁盘的一部分,假想磁盘
磁盘缓存:本质上是内存的一部分,假想内存
虚拟内存是磁盘和内存交互的第二个媒介,是一种计算机的内存管理技术,它使得应用程序认为它拥有一段连续可用的内存(完整的地址空间),实际上通常被分割成多个物理碎片,还有一部分是存储在外部存储器上,必要时进行数据交换。
这种数据交换体现在,比如内存不足了,只剩10mb的空间确可以运行50mb的程序。因为cpu只能执行加载到内存中的程序,所以虚拟内存空间就需要和内存空间进行置换,相当于内存满了,和磁盘中的一部分数据进行置换。
虚拟内存和内存的交换方式
交换方式:分页式和分段式
Window一般采用的是分页式,该方式就是不分析程序的结构,将程序按一定大小的页进行分割,然后以页为单位进行置换。在分页式中,我们把磁盘内容读到内存中叫“Page In”,同样把内存中数据写入到磁盘就叫"Page Out"。windows计算机的页的大小是4KB,所以切割的时候是4KB为单位进行切割的。
那么问题来了为啥是4KB,而不是别的8,16KB?
4KB 的内存页其实是一个历史遗留问题,在上个世纪 80 年代确定的 4KB 一直保留到了今天
两个影响存页大小的因素:
1.过小的页面过小会带来较大的页表项增加寻址时 TLB(Translation lookaside buffer)的查找速度和额外开销;
2.过大的页面过大会浪费内存空间,造成内存碎片,降低内存的利用率。
如果你设置为8KB,当一个程序申请1KB的内存的时候,还是会分配一个8KB的内存页,会导致大量的资源浪费。
Linux中除了内存的利用率之外,较大的内存页也会增加内存拷贝时的额外开销,因为 Linux 上的写时拷贝机制,在多个进程共享同一块内存时,当其中的一个进程修改了共享的虚拟内存会触发内存页的拷贝,这时操作系统的内存页越小,写时拷贝带来的额外开销也就越小。