搞基础系列-Linux系统-内存篇

2,507 阅读6分钟

前言

作为一个Android开发者,可能大部分时间都放在了上层的代码编写和学习上,对于一些基础的东西像操作系统、网络、数据结构与算法还有设计模式可能了解不多,搞基础系列准备以个人的经验为出发,整理一些个人认为比较重要的,对工作有帮助的一些基础知识点,虽不能面面俱到,但力求包含重点常见知识,这不仅是一个分享,也是个人学习的记录和总结。

Linux学习路线

(这个路线图只是从自己的经验和实际出发得出的,个人觉得在平时可以用到和需要了解的知识,不求面面俱到,只要重点记忆突破。)

什么是操作系统

先看一下电脑是由什么组成的,按照冯诺依曼结构运算器,控制器,内存储器,以及输入输出设备,这些对应着CPU、内存和硬盘以及鼠标键盘显示器,这些是实打实的硬件,当你想要调用这些硬件为你服务,你需要熟悉这些硬件接口,几百页的接口文档那可不是闹着玩的,那么你就需要一种叫做 驱动 的软件来和硬件交互,操作系统实际上就集成了很多驱动,可以看出,操作系统的一大作用就是屏蔽底层硬件的差异,统一管理硬件。第二点,用户实际使用的是应用程序,应用程序实际上是和操作系统直接打交道的,所以操作系统的第二个目的就是为应用程序提供易读、可靠和高效的API,这样上层应用就不用直接面对硬件,节省开发时间。 所以总结下来操作系统就是用来统一管理硬件资源的,为上层应用提供高效、易读API接口的软件集合。 操作系统有很多像window,macos、android、ios等等,为什么我要选择Linux学习,因为Android是基于Linux内核的,Android开发又是我吃饭的家伙,还有什么比洽饭更重要呢?

内存

1什么是内存:

内存就好比一个个箱子,箱子上有着编号,就是上图中的地址,里面装着我们需要的数据,而cpu的管脚通过总线与内存相连,当cpu需要数据进行计算时,就通过总线将内存中的数据加载进来,计算完成后再通过总线将结果写入到内存,同时内存也是和硬盘连接,可以将一些数据写入硬盘,因为内存的数据再断电后就会消失,想永久保存就需要写入到硬盘。

2CPU的地址总线、数据总线和内存的关系

前面说了,cpu通过总线与内存相连,总线又分为地址总线、数据总线和控制总线三种。 数据总线: 可以将数据传给内存,也可以将内存数据传给cpu,如果数据总线长度为8位,那么每个时钟周期传递的数据就是1B 地址总线: 前面说了,内存可以当做一个个箱子,箱子里的是数据,每个箱子上都有编号,cpu通过找到箱子的编号,打开箱子,取走里面的数据,或者写入数据,地址总线就是用来确定和找到箱子编号的,比如咱们常说的32位cpu,它的可寻址范围就是2^32也就是4G,那么他的地址总线范围就是0x00000000-0xFFFFFFFF,这就是内存箱子的编号。这里的4G其实也对应了我们的最大内存大小,一般情况下每个箱子存储的数据大小为1B。 控制总线: 用来和设备间相互传递控制信号的。

3虚拟内存

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

(1)虚拟内存地址

上图中物理内存中的地址我们定义为物理地址,但是在Linux中应用程序不能直接访问物理内存地址,只能通过虚拟内存地址进行内存访问,每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。从功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。因此,两个进程空间可以有相同的虚拟内存地址,如0x10001000。虚拟内存地址和物理内存地址又有一定的对应关系,如下图所示。对进程某个虚拟内存地址的操作,会被CPU翻译成对某个具体内存地址的操作。

这么做有两个好处:1是内存的分配管理统一交由操作系统处理和校验2是为进程间共享内存提供方便

(4)内存分页

前面说到,虚拟内存地址和物理地址是有映射关系的,这种映射关系是需要有个表来维护的,如果每个物理地址对应一个虚拟内存地址,那么拿4G内存举例,维护这个表需要8G内存,这家伙比内存还大,分页就是用来解决这个问题的。

分页就是一更大的粒度来存储映射关系,分页机制的操作对象是固定大小的内存块,称为页,一般情况下大小为4K。与页的概念相对应,页框是对物理内存的最小操作单位,页框大小和页的大小是一样的,也是4K。这样我们需要维护的就是虚拟页和物理页框的对应关系了,一个页为4K,那么4G内存需要的用来维护对应关系的内存大小为1M。无论页还是页框,一页之内的内存地址都是连续的,所以页和页框的最后位数是相同的,以4K页为例,每一页有4096个字节。由于4096是2的12次方,所以地址最后12位的对应关系天然成立。我们把地址的这一部分称为偏移量(offset)。偏移量实际上表达了该字节在页内的位置。地址的前一部分则是页编号。操作系统只需要记录页编号的对应关系。

由图可知: 虚拟地址=页编码+偏移量 物理地址=页框页编码+偏移量

参考

《鸟哥的Linux私房菜》

《现代操作系统》

《深入理解Android内核设计思想》

www.cnblogs.com/vamei

关注我的公众号