先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程
序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已
经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个覆盖块,覆盖块0最先运行,运行结
束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个虚拟存储器(virtual memory)的方法。
虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。
比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内
容保存在内存中,并在需要时,在内存与磁盘中交换程序代码,这样16MB的代码就可以运行在4MB的机器中了
1.2.1 相关概念
地址范围、虚拟地址映射成物理地址以及分页机制
- 地址范围: 指处理器能够产生的地址集合,如一个32bit的处理器,其能产生的地址集合是**0x0000
0000 ~ 0xffff ffff(4G),这个地址范围也称为虚拟地址空间**,其中对应的地址为虚拟地址。
- 虚拟地址与物理地址: 与虚拟地址空间和虚拟地址相对应的是物理地址空间和物理地址;物理地址
空间只是虚拟地址空间的一个子集。如一台内存为256MB的32bit主机,其虚拟地址空间是0 ~
0xffffffff(4GB),
- 物理地址空间范围是0 ~ 0x0fff ffff(256M)
1.3分页机制
- 如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引
脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(**Physical
Address,以下简称PA**),如下图3-1-1所示;
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA,,如下图3-1-2。
linux使用MMU的机器都采用分页机制。虚拟地址空间以页为单位进行划分,而相应的物理地址空间也被划分,其使用的单位称为页帧,页帧和页必须保持相同,因为内存与外部存储器之间的传输是以页为单位进行传输的。
例如,MMU可以通过一个映射项将VA的一页0xb70010000xb7001fff映射到PA的一页0x20000x2fff,如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地址是0x2008。
虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA。
1.4.1 CPU在执行指令与数据时,获得的是虚拟内存的地址。
但是CPU只能去物理内存寻址。此时,MMU就派上用场了。MMU负责,将虚拟地址,翻译成,真
正运行时的物理地址。
MMU是如何将虚拟地址翻译成物理地址的,这个后面讲。现在先要了解一下交换区的概念。
交换区: 实际上就是一块磁盘空间(硬盘空间)。虚拟内存与物理内存映射的时候,是将虚拟内
存的代码放到交换区中,以后在CPU想要执行相关的指令或者数据时,如果内存中没有,先去交换
区将需要的指令与数据映射到物理内存,然后CPU再执行
虚拟内存与交换取的这种概念,实现了大内存需求量的(多个)进程,能够(同时)运行在较小的
物理内存中。如下图所示:
上图中,说的是进程的局部代码在物理内存中运行。是因为程序具有局部性原则,所以在某一段很
小的时间段内,只有很少一部分代码会被CPU执行。
到这里,我们应该大致明白了虚拟内存的作用与简单机制。还剩下MMU如何翻译虚拟地址为物理地址的,这放到最后讲解。现在先总结一下虚拟内存机制:
虚拟内存需要重新映射到物理内存虚拟地址映射到物理地址中的实际地址
每次只有进程的少部分代码会在物理内存中运行
大部分代码依然位于磁盘中(存储器硬盘)
1.4.2、 页式内存管理
上一节笼统的介绍了虚拟内存的概念。接下来学习内存管理中的一种方式:页式内存管理。
页式内存管理中我们需要了解:
- 页的概念
- 页表的概念
- 缺页的概念与页命中的概念
- 分配页面
- 程序的局部性原则
1.4.2 页的概念
我们知道了交换区。我们知道交换区里面存放的是大部分的可执行代码与数据。而物理内存中,执行的是少部分的可执行代码与数据。
那么此时就需要从交换区获取程序的代码,将它拿到物理内存执行。**那么一次拿多少代码过来呢?这是
一个问题!**
为了CPU的高效执行以及方便的内存管理,每次需要拿一个页的代码。这个页,指的是一段连续的存储空间(常见的是4Kb),也叫作块。
假设页的大小为P。在虚拟内存中,叫做虚拟页(VP)。从虚拟内存拿了一个页的代码要放到物理内存,那么自然物理内存也得有一个刚好一般大小的页才能存放虚拟页的代码。物理内存中的页叫做物理页(PP)
在任何时刻,虚拟页都是以下三种状态中的一种:
- 未分配的:VM系统还未分配的页(或者未创建)。未分配的页还没有任何数据与代码与他们
- 相关联,因此也就不占用任何磁盘。
- 缓存的: 当前已缓存在物理内存中的已分配页
- 未缓存的:未缓存在物理内存中的已分配页
下图展示了一个8个虚拟页的小虚拟内存。其中:虚拟页0和3还没有被分配,因此在磁盘上还不存
如果你进阶的路上缺乏方向,可以加入我们的圈子和安卓开发者们一起学习交流!
-
Android进阶学习全套手册
-
Android对标阿里P7学习视频
-
BATJ大厂Android高频面试题
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-SOLdvWsU-1713469287703)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!