深入理解内存(1):原理简介

发现编程的很多问题最后整来整去,最后又是归结到内存上面来了.所以决定好好来研究下内存.

我们知道冯.诺伊曼体系结构中是把计算机划分为输入设备,输出设备,存储器,控制器,运算器.

输入设备主要是键盘,鼠标,输出设备主要是显示器,打印机

控制器与运算器我们一般全称为CPU.

存储器主要指硬盘与内存.

为啥windows上的应用软件都差不多一样

我们开发软件时不会直接面对硬件(只有开发操作系统或驱动程序才直接面对硬件),操作系统封装了硬件的细节信息,应用软件只是使用操作系统提供的API去间接的操作硬件.以windows为例,我们发现运行在上面的软件不管是啥编程语言开发的,用起来貌似都差不多.界面上基本上都是那个些控件,比如些菜单栏,工具栏,下拉列表,单选,多选按钮之类的.几乎都一个样.原因很简单,实际上不管啥编程语言,你自己写的函数或者调用一些类库,如果要使用那些硬件资源,最后都归结于去调用windows的API.

所以操作系统是在硬件的基础上抽象一层,只提供给你一些API,然后各种编程语言又在API的基础上再封装一层,提供给你一些语言特性和类库,库函数给你用.

数据处理和数据显示

看下windows的API(实际上可以简单的看成一些C语言库函数),我们发现绝大部分API函数都仅是实现处理数据和显示数据这两功能.

API中有很多针对鼠标和键盘的函数,我们可以把这看成是输入数据(信息).消息机制相关的函数就是处理数据. 进程和线程也可以看成在内存中处理数据

然后API中窗口,子窗口控件,菜单,GDI,文字和字体,位图那一堆堆的函数可以看成是显示数据.把数据通过一些好看点的图形界面显示出来.

以前很多人都认为程序 = 数据结构 + 算法,在那会没太注重用户体验,没太注重GUI时是很恰当.现在应该说程序= 数据处理(数据结构和算法) + 数据显示.

磁盘和内存原理

我们在程序中的数据处理主要是操作磁盘和内存,硬盘是磁盘里面最常用的一种.以前有所谓的软盘,也是磁盘的一种,原理和硬盘是一样的.都是利用磁性物质的特性来保存信息.磁盘的原理就是利用电磁转换,学物理时我们知道电可以使物质带上磁性,而金属在磁场运动时切割磁感线时会产生电流.磁盘上有很多微粒的磁粉.当写通过磁头写数据时,磁头中的电流会导致磁粉极化,改变方向.读数据时,导体磁头经过磁粒的区域时会产生电流. 反正大概意思就是这样.

而内存的原理就完全不同,内存是晶体管制作的(CPU也是晶体管做的),而晶体管的特性就是我们平时常说的用开关的开和关来表示1,0.通过一些门电路的组合可用来表示数字和实现复杂的逻辑功能.而内存主要是用来临时保存数据.CPU就是处理一些逻辑关系.

晶体管由于必须得通电,然后用电流的有无状态来表示信息,所以只有通电的时候可以保存数据,电一断内存里的晶体管状态就处未知状态就啥用处也没了.而磁盘断电后磁性物质还会一直保持原样.

我们知道访问磁盘时就通过磁头去指到固定的地方然后读取数据.不过内存就不一样,不需要啥磁头去读取数据,它是有数据总线连接,我们是通过总线去读取内存的数据.

实际上我们平时在程序中说要分配一块内存(比如new 或malloc),或者操作内存(读写数据),实际上没有真正的直接去操作内存,而只是告诉操作系统我要做这些操作,然后操作系统再给你去直接操作内存.同样我们操作硬盘时,实际上也是操作系统去读写硬盘.

在windows中有所谓的虚拟内存技术,实际上就是由于我们不会直接操作内存才会有这种可能.我们当需要多少内存时,比如4G,而实际内存才2G,但操作系统却说可以有4G内存分配给你.它是把一部分硬盘也当作内存给你分配(至于把多少硬盘空间当作内存用这是可以手动配置大小的). 由于CPU读取数据时只会在内存中进行(不是必须非得这样,因为如果直接读取硬盘速度会很慢),所以当你使用了虚拟内存后数据会在内存和硬盘之间来回的交换.

等会再详细讲下虚拟内存...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值