Android 深入系统完全讲解(一)

news2024/9/24 7:26:06

因为很多朋友还是会咨询 Android 相关的内容,于是便花费了一些时间,把我总结的方法,一些系统代码的跟踪流程,做一个完整的梳理, 算是给自己职业生涯画个完美的句号。

虽然说后续写代码会相对少一些,但是还是会输出一些教程,将我的其他领域的学习过程,策略分享出来。

这是第三个专题,我们聊下操作系统,前两个专题是,安卓系统知识点学习策略,以及音视频学习方法(代码部分参考网络,串联知识体系),希望大家喜欢。

–写于 2021 年 11 月 1 号夜
作者:陆晓明

程序员高手必备技能

很多人有疑问,说为什么工作多年,还是没有长进?除了会一些 API,多记住了一些解决方
法,但是面对新的问题,还是一筹莫展?

原因在哪里,跟高手的区别在哪里?在我的培训课程里面,我喜欢讲的是原理,并且用例子
来剖析,从而让大家明白,知道它的来龙去脉。

那么,高手真正的本领是什么?

总结来讲分为几部分:

1 框架思维
2 迁移能力
3 学习能力

框架思维在我的训练营里,给大家会反复来讲。这里主要就是,你在面对新的问题,新的需
求的时候,是否先按照框架思考。

举个例子:蓝牙传输过程中经常会断开。

原因是什么,怎么解决?

第一步就是框架思维,一般牵扯到硬件的设备,主要就分为三部分,应用层,框架层,驱动
层。

那么这个就是一个框架,基于这个框架,我们随后就会去迁移。也就是迁移能力。迁移能力
是什么?

就是比如我是做通信模块的,我没有做过蓝牙模块,但是我是否可以通过我通信这块的经验,
去定位到蓝牙的相关代码呢?

这块就是迁移,把自己已知的技能,去跟未知的模块匹配,跟踪验证,调整,从而解决问题。
这个过程就是学习能力。

在我们请教高手的时候,有没发现一点,他们有一个能力,就是一个模型,可以通过询问,
从而初步推论出来,帮助你分析定位。

我们工作当中,实际要掌握的是这些本领。而在这个里面,学习哪块能够训练出来呢?最为
关键的就是操作系统了。

于是,在我的训练营中,操作系统这一环节,我讲的也比较多,也是不涉及代码,但是讲清
楚设计原理,逻辑,然后代码是我们遇见问题后,一起来看。

举例来说, 格式化是什么?

U 盘为什么要格式化才能用呢?

U 盘是一个存储设备,我们要管理这个存储设备,那么就需要一个映射关系,记录下来。这
个格式化过程,就是在硬盘的最前面,占用一段存储,里面用一组结构,将 U 盘的整个区
域管理起来。
在这里插入图片描述

说白了就是前面一部分区域,要记录几点,目录信息,文件信息,位置,起始位置,这些表
征完了,文件里面会对应一个起始 block ,然后 block 里面会有一个指向,如果文件很大,
就会指向下一个 block,从而把文件整个存储下来。

当我们刚开始使用 U 盘的时候,存储很快,因为 block 是连续的,当不断地删,改,最终后
面再存储的时候,block 就不是连续的了。所以系统会需要检索,查找下一个空闲 block。

于是,我们会查看碎片空间,进行磁盘整理的动作,目的就是把碎片化减小,方便后续存储,
这块最重要的就是硬盘,因为寻址是机械寻址,如果相邻那么就非常快。

举例来说,我们知道有个内存管理,管理系统内存的,比如我们的学生课程管理,是不是也
是一样,有个结构体。

所以整个总结起来就是,要对某个东西进行管理,就需要一个管理逻辑设计,这个逻辑设计
过程,就是约定的结构,这个结构里面能够表征后面的管理内容,完成管理的动作。

这个就是我们在编程里面常听到的,数据结构,而数据结构是表示一个信息,具体怎么判断,
存储,验证,这个就是设计的算法了。

程序= 数据结构+算法。
数据结构 =头+数据。

算法就是对这个头进行解析,获取数据的过程。

当我们理解到一切都是 数据结构+算法的时候,遇到一个协议,遇到一个设备,都会有个完
整的思路。

第一步,找数据结构,如何设计的。
第二步,找设计的算法,也就是调用的 API。
在应用的场景下,我们拿到 SDK,第一步看什么?
看 Demo,看 sample,熟悉基本用法,找的是 API。

应用场景下,默认将系统的算法当成黑盒,我们关注的是所谓的对外接口,这个是我们使用
的时候,需要调用的。

举例来讲,蓝牙模块。拿到 SDK,我们不去管它内部实现,只需要找到它的连接方式,测试
方式,以及使用手册。

这里就是典型的开发逻辑:对不关注的东西,进行黑盒思维。关注它的对外接口,流程即
可。

最小计算机系统

我们在聊这个之前,说一个比较朴素的概念。输入–控制–输出。对于这个的理解非常重要,
因为这个是所有计算机行为,乃至我们本身的行为都是遵循的。

这个概念用一句话来说就是 :我们把什么用什么做成什么。
设计都是想要的一个结果,依据这个做出的反映。

举例来讲,看电视。输入是什么?电视画面,控制是谁?我们的大脑,输出是,高兴,愤怒。
那么计算机系统,要完成最小化,就需要这几个部分,输入,控制,输出。
那么,计算机最小系统,就是由:

键盘
CPU
显示器

三部分组成。

键盘是输入源,CPU 是处理器,控制端,输出是显示器。

这是最简单的,也是最好理解的,在我们学习操作系统之前,先想明白这点,这块知识可以
通过看看单片机的知识,快速的掌握。

CPU 是个运算器,跟运算器直接相连的是叫做寄存器。
在这里插入图片描述
寄存器是运算器,控制器的直接对接入口,也就是外部的数据来了,都是交由寄存器,进入
运算器里面操作。

运算器直接连接的是寄存器,而里面的 PC 寄存器,则指向的是当前运算器运算的这条指令。
这块的知识,可以参考计算机组成原理来掌握。
在这里插入图片描述
依据我们之前说的,输入,控制,输出。而输入的数据,该如何被 CPU 拿到呢?这里就是
有了所谓的地址总线。

有地址总线,数据总线,控制总线。完成了,从什么地方,拿什么数据,干什么。

理解了这块,我们继续来说,对硬件进行管理,把它运行起来的这些代码,我们称之为驱动。

在这里插入图片描述
整个就是,硬件通过连接到外设上去,系统通过外设连接,对硬件进行寄存器操作,实现一
套对外设的操作方法,这部分就是驱动。

驱动程序一般不会直接让软件调用,因为驱动程序写的比较简单,缺少一些必要的判断逻辑,
所以在这个之外还需要一层包装,就是 API 访问接口。

软件通过调用这个 API,来完成对硬件的操作。

而当我们系统越来越复杂,硬件越来越多,驱动就需要更好的管理,并且软件之间也是需要
协作。

再说软件之前,我们说两个概念,第一个是,硬盘。第二个是内存。

我们写代码,编译成程序之后,是存放在硬盘的。硬盘是存储,掉电后还存在。我们常用的
就是 U 盘,把学习资料复制进去,需要的时候插入电脑,带个耳机就可以欣赏了。

而内存是什么?是掉电就没了。这个内存存在的原因是,硬盘存储介质的速度,远远低于
CPU 执行速度,而内存就是他两的桥梁,速度在这两之间。

所以,就需要将程序加载进入内存,然后执行。

于是我们的系统,现在就是,键盘和其他外设,比如硬盘,鼠标,CPU,内存,软件。

那么现在硬件一多,就需要一套机制,来讲驱动程序统一管理,方便写,以及对上面的软件,
能够做到统一调用。

这套机制里面,需要实现对外设的加载设计,对外设的打断做一个监测,对上层软件进行管
理。

我们把这套机制,叫做操作系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P1044 [NOIP2003 普及组] 栈

P1044 [NOIP2003 普及组] 栈 方法一&#xff1a;递推dp 思路&#xff1a; 求n的总数&#xff0c;我们可以分解成n在第i&#xff08;1<i<n)位置输出讨论。 我们用a[i][j]表示数i在第j位置输出的情况总数&#xff0c;ans[i][j]表示数i在第1--j位置输出总数和 1&#x…

ROS地图栅格信息

一.地图栅格消息nav_msgs/OccupancyGrid // 栅格地图消息 std_msgs/Header header nav_msgs/MapMetaData info time map_load_time float32 resolution // 分辨率 geometry_msgs/Pose origin // 原点坐标 geometry_msgs/Quaternion orientati…

元数据管理Datahub基于Docker进行部署

目录1. 服务器要求2. 安装Docker3. 安装jq4. 安装python35. 安装docker-compose v1(deprecated&#xff0c;为了兼容性)5.1 安装virtualenv5.2 安装docker-compose6. 安装datahub(在docker-compose-v1-py虚拟环境下)7. 访问Web页面&#xff0c;然后导入测试元数据8. 删除datahu…

数字孪生的概念是什么【深度】

数字孪生技术最早提出是用于航空航天领域&#xff0c;美国 NASA 指出“一个数字孪生&#xff0c;是一种集成化了的多种物理量、多种空间尺度的运载工具或系统的仿真&#xff0c;该仿真使用了当前最为有效的物理模型、传感器数据的更新、飞行的历史等等&#xff0c;来镜像出其对…

C语言C++中与接收、输出字符相关的问题

C语言中&#xff0c;在使用scanf("%c",&data);读取一个字符时&#xff0c;有时会遇到scanf吞回车符的情况。 这里搜到几种常用的解决方法&#xff1a; 1.在scanf()中使用’\n’屏蔽回车符号。 scanf("\n%c",&c);2.在scanf()格式串最前面添加空格&…

【Linux】缓冲区的理解

文章目录什么是缓冲区&#xff1f;为什么要有缓冲区&#xff1f;缓冲区刷新策略请看下面代码&#xff1a;接着上篇【Linux】文件操作|文件描述符|重定向 什么是缓冲区&#xff1f; 我们口中说的缓冲区&#xff0c;一般指的是用户级语言层面给我们提供的缓冲区。本质就是一段…

nRF24L01芯片(模块)介绍

nRF24L01芯片&#xff08;模块&#xff09;简介nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设…

使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss

前言 什么是 RSS? RSS 是一种描述和同步网站内容的格式&#xff0c;是使用最广泛的 XML 应用。RSS 搭建了信息迅速传播的一个技术平台&#xff0c;使得每个人都成为潜在的信息提供者。发布一个 RSS 文件后&#xff0c;这个 RSS Feed 中包含的信息就能直接被其他站点调用&…

【MySQL】SQL查询语句在MySQL中的执行过程

文章目录1.MYSQL基础架构2.连接器3.查询缓存4.解析SQL5.执行SQL5.1 预处理器5.2 优化器5.3 执行器6.总结1.MYSQL基础架构 连接器&#xff1a;建立连接、管理链接、校验用户身份查询缓存&#xff1a; 查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。&#xf…

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 &#x1f345; 作者主页 超级帅帅吴 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录基于JavaSpringBootvueelement疫情物资捐赠分配…

不能你说对不起,别人就一定要说没关系——与九迁沟通他的冲动和错误

今天的事情是最近三天九迁与他奶奶之间发生的事情。先说前面在谈事件&#xff0c;这个事情的发生&#xff0c;首先说明我母亲的身体还可以&#xff0c;没有被感染&#xff0c;因为还能和孩子生气&#xff0c;说明熊胆粉确实是在起作用&#xff0c;关于熊胆粉的文章请看&#xf…

FGH40N60SMD 600V 80A 349W 逆变器高频IGBT单管

FGH40N60SMD 600V 80A 349W 逆变器高频IGBT单管 &#xff0c;为光伏逆变器、UPS、焊机、通讯、ESS 和 PFC 等低导通和开关损耗至关重要的应用提供最佳性能。IGBT单管系列&#xff1a;FGH40N60SMDFGH60N60SMDFGH75T65SHD-F155 NGTB40N120FL2WG特性&#xff1a;1.最大结温 T[siz…

C++:二叉树题进阶(三种非递归遍历、二叉搜索树OJ题)

lc 606 根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有不影响字符串与原始…

C++4:C++中的动态内存管理

目录 C内存管理方式 new/delete操作内置类型&#xff1a; new/delete操作自定义类型&#xff1a; new和delete的底层实现&#xff1a; operator new与operator delete函数 定位new 内存泄漏 动态内存管理&#xff0c;早些我们接触C语言的时候就已经在很熟练的游玩在堆上开…

QGIS加载谷歌地图(google map)方法

目录第一步第二步将Google提供的网络地图&#xff0c;包括地图和卫星影像等&#xff0c;作为图层加载到QGIS中&#xff0c;有时可辅助地学分析。QGIS已经提供了OpenStreetMap&#xff0c;在 “XYZ Tiles” 里面加载即可。 谷歌街道地图&#xff1a;http://mt2.google.com/vt/ly…

缓冲区的深刻理解

代码&&现象 先来看一份代码 #include <stdio.h> #include <string.h> #include <unistd.h> int main() {//C Libraryprintf("hello printf\n");fprintf(stdout, "hello fprintf\n");const char *s1 "hello fwrite\n&quo…

微信公众号开发以及测试公众号菜单配置

微信公众号开发测试号申请测试号配置公众号菜单配置1、获取access_token2、新增自定义菜单微信扫描关注公众号微信公众平台测试号申请 1、测试号申请 开发的时候需要一个个人的公众号调试&#xff0c;所以使用微信测试号进行。 1、微信测试号申请地址: https://mp.weixin.qq.c…

用于野外精确人体姿态估计的自适应多视图融合

用于野外精确人体姿态估计的自适应多视图融合 Abstract AdaFuse&#xff1a;一种自适应的多视图融合方法&#xff0c;利用可见视图中的特征增强被遮挡视图中的特征核心&#xff1a;确定两个视图之间的点-点对应关系 通过研究热图表示的稀疏性 我们还学习了一个自适应的融合…

ArcGIS基础实验操作100例--实验48按分区划分矢量图层

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验48 按分区划分矢量图层 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

属于 PingCAP 用户和开发者的 2022 年度记忆

2022 年&#xff0c;我们一起穿越了许多荆棘时刻&#xff0c;面对着前所未有的不确定性。在这些挑战面前&#xff0c;我们发现技术和开发者扮演了重要角色。 技术为我们提供了穿越周期的桥梁&#xff0c;开发者帮助我们更好地应对挑战&#xff0c;解决问题并赋予这个世界更多创…