磁盘与内存的亲密关系 -磁盘缓存和虚拟内存
内存和磁盘的亲密关系
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.说明
本文为《程序是怎样跑起来的》读书笔记,如有错误,请兄弟们指正,大家一起进步!
磁盘与内存的亲密关系 -磁盘缓存和虚拟内存相关推荐
- win10 计算机磁盘加内存,win10 cpu 磁盘 100% 运行及内存使用量变大 优化汇总
如同历代Windows一样,通过在线方式升级Windows 10之后会在C盘留下旧版本的备份文件,这些"垃圾"会占用大量的硬盘空间,令C盘告急.虽然windows10虽然优化了wi ...
- 磁盘概述、磁盘缓存、虚拟内存及虚拟内存与内存的交换方式
目录 一.认识磁盘 程序不读入内存就无法运行 二.磁盘缓存 三.虚拟内存 四.虚拟内存与内存的交换方式 一.认识磁盘 磁盘和内存都具有存储功能,它们都是存储设备.区别在于,内存是通过 电流 来实现存储 ...
- JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...
- JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...
- 你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?
作者:陌北有棵树,Java人,架构师社区合伙人! 关于MySQL对于后端程序员的重要性不言而喻,而InnoDB也已经是MySQL默认的存储引擎.作为我们每天打交道的存储引擎,我们对它可能需要对它有更多 ...
- 从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路
线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...
- 【转】2.2【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析
前一篇讲完了查询流程,我们是不是再讲讲更新流程.插入流程和删除流程?在数据库里面,我们说的update操作其实包括了更新.插入和删除.如果大家有看过MyBatis的源码,应该知道Executor里面也 ...
- Linux工作笔记036---Centos下查看cpu、磁盘、内存使用情况以及如何清理内存
JAVA技术交流QQ群:170933152 Centos下查看cpu.磁盘.内存使用情况以及如何清理内存 核查服务器基本情况 查看内存使用情况 free -m 查看cpu使用情况 top #查看进程运 ...
- Linux限制磁盘与内存配额【超详细】
大家好,我是早九晚十二,目前是做运维相关的工作.写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 文章目录 Linux限制磁盘用量的方式 什么是磁盘配额 磁盘配额的条件 安装quota工具 ...
最新文章
- 一文详解目标跟踪中的相关滤波
- 一文带你认识:Liunx的历史
- cad细等线体不显示_CAD打印文字不显示?很多人不知道这个知识点!
- sizeof 数组_简单的一维数组竟然有这么多坑?
- 写一个简单控制台启动的mcv服务
- 正则表达式简单语法及常用正则表达式
- java中数据类型转换、ASCII编码
- 【C语言】初学者写基础代码的基本步骤
- C语言程序设计 - 积分兑换
- excel表格打印每页都有表头_EXCEL打印小技巧:如何打印出每张纸上都有表头标题的表格?...
- 调用win api将指定名称的打印机设置为默认打印机
- 仿今日头条视频播放JieCaoVideoPlayer
- docker cp传递整个目录
- 二维码插件qrcode生成二维码信息
- 产品如何选择 RF射频,RF433,RF315
- 怎么做接口自动化的?
- 宜信唐宁忠告北大毕业生 日进斗金不如守住初心
- 第十六届中国互联网大会:AI落地才能够发挥价值
- mysql错误代码145_MYSQL 错误#145解决方法
- linux nas 多硬盘,较低负担的四硬盘 NAS 选择,Synology DS416j 登场
热门文章
- JavaScript的三种弹出提示框(alert、confirm、prompt)
- 处理器,操作系统,程序的位数,指针的长度
- 更新数据库脚本的格式
- Intel80386寄存器
- 带触屏的语音助手是客厅的新宠?亚马逊新一代 Echo 也许能告诉你答案
- 用caffe对自己的图片进行分类,包含详细代码
- boost中cannot bind rvalue reference of type to lvalue of type问题
- 弘辽科技:对洛丽塔服饰几乎一无所知的圈外人,为什么想开lo店?
- [Unity] 优化您的移动游戏性能2020(上)
- 各大搜索引擎新网站登录入口