内存和磁盘的亲密关系

1.前提

内存与磁盘都是存储部件,内存利用电流来存储、磁盘利用磁效应来存储。内存高速高价,磁盘低速廉价。

存储在磁盘中的程序必须先加载到内存中才能运行。这是因为cpu需要程序计数器指定内存地址,然后才能读出程序来运行。即使可以从磁盘中读取,程序的运行速度还是会降低。

2.磁盘缓存

磁盘缓存指把磁盘中的数据读出并存储在内存中,这样下次再要读取相同的数据时,只需到磁盘缓存中读取,提升了磁盘数据的访问速度。

windows操作系统中就提供了磁盘缓存机制,但随着硬盘访问速度的提高,磁盘缓存效果也没之前明显。

但把低速设备的数据保存在高速设备中,需要时直接从高速设备读取,这种缓存机制在其他情况下也会用到;比如cache高速缓冲存储器、标准I/O的缓冲区等。

3.虚拟内存

虚拟内存指把磁盘的一部分当做假想的内存来使用。借助虚拟内存,在内存不足时也可以运行程序;

cpu只能运行加载到内存中的程序,所以为了实现虚拟内存,就必须将实际内存的内容和磁盘上虚拟内存的内容进行置换。就相当于流水线,一边运行一边从磁盘向内存加载程序。

windows操作系统中就提供了虚拟内存机制。虚拟内存方法有分页式和分段式,而windows使用的是分页式。指不考虑程序构造,将程序按一定大小的页(page)进行分割,并以页为单位与磁盘置换; windows计算机一般的页大小是4KB。

  • page in : 磁盘到内存
  • page out : 内存到磁盘

windows在磁盘上提供了虚拟内存用的文件( page file),文件大小就是虚拟内存大小,一般为实际内存的一倍到两倍。

4.节约内存的编程方法

虚拟内存虽然可以一定程度解决内存不足的情況,但 page in和 page out也会让运行程序变慢;要想从根本上解决内存不足问題,要不增加内存容量,要不尽量将运行文件变小;

1)通过DLL文件实现函数共有

多个应用共有一个DLL文件,这样就可以节约内存。 windows其实也是多个DLL文件的集合体。

2)调用_ stdcall来减小程序文件大小

c语言中,在调用函数后,会执行栈清理处理指令,将不需要的数据从函数传参时用到的栈区中清理出去。

该命令是编译器自动加到程序中的,默认加到函数调用方。比如在main函数中调用其它函数,就会加到main函数方。但是,如果main函数中调了同一个函数多次,就会处理多次,造成内存浪费。

在函数前加_ stdcall,可以把栈处理变成在被调函数一方进行。

5.磁盘的物理结构

磁盘将物理表面划分成多个空间来使用,有扇区方式和可变长方式,一般windows计算机的硬盘和软盘都是扇区方式。

扇区是对磁盘进行物理读写的最小单位,windows中1个扇区是512字节。不过在软件方面对磁盘读写的单位是簇,簇是扇区的整数倍。不同文件不能存在同一簇中,所以一个文件就算再小也占一个簇,没被填满的区域会保持不被使用的状态。

6.说明

本文为《程序是怎样跑起来的》读书笔记,如有错误,请兄弟们指正,大家一起进步!

磁盘与内存的亲密关系 -磁盘缓存和虚拟内存相关推荐

  1. win10 计算机磁盘加内存,win10 cpu 磁盘 100% 运行及内存使用量变大 优化汇总

    如同历代Windows一样,通过在线方式升级Windows 10之后会在C盘留下旧版本的备份文件,这些"垃圾"会占用大量的硬盘空间,令C盘告急.虽然windows10虽然优化了wi ...

  2. 磁盘概述、磁盘缓存、虚拟内存及虚拟内存与内存的交换方式

    目录 一.认识磁盘 程序不读入内存就无法运行 二.磁盘缓存 三.虚拟内存 四.虚拟内存与内存的交换方式 一.认识磁盘 磁盘和内存都具有存储功能,它们都是存储设备.区别在于,内存是通过 电流 来实现存储 ...

  3. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...

  4. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...

  5. 你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?

    作者:陌北有棵树,Java人,架构师社区合伙人! 关于MySQL对于后端程序员的重要性不言而喻,而InnoDB也已经是MySQL默认的存储引擎.作为我们每天打交道的存储引擎,我们对它可能需要对它有更多 ...

  6. 从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...

  7. 【转】2.2【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析

    前一篇讲完了查询流程,我们是不是再讲讲更新流程.插入流程和删除流程?在数据库里面,我们说的update操作其实包括了更新.插入和删除.如果大家有看过MyBatis的源码,应该知道Executor里面也 ...

  8. Linux工作笔记036---Centos下查看cpu、磁盘、内存使用情况以及如何清理内存

    JAVA技术交流QQ群:170933152 Centos下查看cpu.磁盘.内存使用情况以及如何清理内存 核查服务器基本情况 查看内存使用情况 free -m 查看cpu使用情况 top #查看进程运 ...

  9. Linux限制磁盘与内存配额【超详细】

    大家好,我是早九晚十二,目前是做运维相关的工作.写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 文章目录 Linux限制磁盘用量的方式 什么是磁盘配额 磁盘配额的条件 安装quota工具 ...

最新文章

  1. 一文详解目标跟踪中的相关滤波
  2. 一文带你认识:Liunx的历史
  3. cad细等线体不显示_CAD打印文字不显示?很多人不知道这个知识点!
  4. sizeof 数组_简单的一维数组竟然有这么多坑?
  5. 写一个简单控制台启动的mcv服务
  6. 正则表达式简单语法及常用正则表达式
  7. java中数据类型转换、ASCII编码
  8. 【C语言】初学者写基础代码的基本步骤
  9. C语言程序设计 - 积分兑换
  10. excel表格打印每页都有表头_EXCEL打印小技巧:如何打印出每张纸上都有表头标题的表格?...
  11. 调用win api将指定名称的打印机设置为默认打印机
  12. 仿今日头条视频播放JieCaoVideoPlayer
  13. docker cp传递整个目录
  14. 二维码插件qrcode生成二维码信息
  15. 产品如何选择 RF射频,RF433,RF315
  16. 怎么做接口自动化的?
  17. 宜信唐宁忠告北大毕业生 日进斗金不如守住初心
  18. 第十六届中国互联网大会:AI落地才能够发挥价值
  19. mysql错误代码145_MYSQL 错误#145解决方法
  20. linux nas 多硬盘,较低负担的四硬盘 NAS 选择,Synology DS416j 登场

热门文章

  1. JavaScript的三种弹出提示框(alert、confirm、prompt)
  2. 处理器,操作系统,程序的位数,指针的长度
  3. 更新数据库脚本的格式
  4. Intel80386寄存器
  5. 带触屏的语音助手是客厅的新宠?亚马逊新一代 Echo 也许能告诉你答案
  6. 用caffe对自己的图片进行分类,包含详细代码
  7. boost中cannot bind rvalue reference of type to lvalue of type问题
  8. 弘辽科技:对洛丽塔服饰几乎一无所知的圈外人,为什么想开lo店?
  9. [Unity] 优化您的移动游戏性能2020(上)
  10. 各大搜索引擎新网站登录入口