AMS主要功能:
AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。还负责启动或杀死应用程序的进程。
WMS主要功能:
为所有窗口分配Surface。
管理Surface的显示顺序、尺寸、位置。
管理窗口动画。
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息。
PWS主要功能:
PMS 用来管理跟踪所有应用APK,包括安装,卸载,解析,控制权限等。
SystemServer也是一个进程,包括AMS、PMS、WMS等等。
zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。
App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的。
①点击启动一个App,Launcher进程采用Binder IPC向ActivityManagerService发起startActivity请求;
②ActivityManagerService接收到请求后,向zygote进程发送创建进程的请求;
③Zygote进程fork出新的子进程,即App进程;
④App进程通过Binder IPC向sytem_server进程发起绑定Application请求;
⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
备注:
Launcher,PMS,Zygote,App进程是三个独立的进程,相互通信就需要使用进程间通信机制。与Zygote通信是使用的socket通信,Launcher,PMS,App进程间使用的是Binder机制。
计算机总是和我们的硬件打交道,再了解计算机的启动过程之前,先来了解计算机关于启动不可或缺的硬件设备 - 「主板」 。
主板,也称为 母板 、 双亲板 ,它是计算机最基本也是最重要的部件之一。每台计算机上都有一块主板,主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有 BIOS芯片 、 I/O控制芯片 、 键盘、面板控制开关接口 、 指示灯查接件 、 扩充插槽 、 主板及插卡的直流电源供电接插件 等元件。
BIOS (Basic Input Output System) ,是主板上的一个应用程序,主要负责 开机(硬件)自检 、 启动顺序 。在 BIOS 内有底层I/O软件,包括 读取键盘输入 、 输出信息到屏幕终端 、 磁盘I/O 等, BIOS 程序运行中产生的数据被保存在 非易失性的闪存 中,当 BIOS 中出现错误指令时,可以有 *** 作系统进行更新。
开机自检 :计算机 启动(booted) 时,BIOS作为按下计算机上运行的第一个程序,它会首先检查计算机上的RAM数量,键盘和其他基础设备是否已安装并可以正常工作,若检测到有非正常工作的 RAM 或其他元件时,则会在启动过程中报错。
接着,BIOS会开始 扫描PCIe和PCI总线 并找到对应接在主线上的设备,/* 一些热插拔的设备也会在这个过程中被记录下来。*/ 如果出现于上一次启动中不同的设备,则新的设备将会重新配置。
然后, BIOS 通过尝试存储在 CMOS (Complementary Metal Oxide Semiconductor, 互补金属氧化物半导体) 存储器中的设备清单并尝试启动设备。 CMOS 是位于电脑主板上的一块可读写的 RAM芯片 ,在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据。
启动顺序 :硬件自检完成后,BIOS会把控制权交给下一阶段的启动程序。这时,BIOS需要知道下一阶段会运行什么程序,以便将控制权限交给对应的程序。BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备,这种排序称为 启动顺序(Boot Sequence) 。
一般来说,硬件自检完成后,BIOS会判断当前是否能够从外部 CD_ROM 和 USB 驱动程序启动,如果没有外部设备,系统将从 硬盘启动 ,此时, boots 设备的第一个扇区被载入内存中并执行。该扇区包含一个可以确定引导扇区末尾的分区表中的哪个分区处于活动状态,然后从该分区读入第二个启动加载程序,该加载器从活动分区中读取 *** 作系统并启动。
接着, *** 作系统会询问BIOS获取配置信息。对每个设备来说,会检查是否有驱动程序,当发现设备驱动程序后, *** 作系统会将驱动程序加载到内核中,然后初始化表,创建所需的后台进程,并启动登录程序或GUI。
BIOS按照 启动顺序 ,把控制权交给排在第一位的储存设备。即根据用户指定的引导顺序从 软盘 、 硬盘 、 外部存储(USB, CD_ROM) 等设备中读取启动设备的 主引导记录(Master Boot Record, MBR) ,并放入指定位置的内存中。这是,计算机读取该设备的第一个扇区 / 一个标准扇区为512 bytes / ,如果该扇区的最后两个字节是 0x55 和 0xAA ,则表明可以从该设备启动;如果不是,表明该设备无法用于启动系统,此时控制权会交给 启动顺序 中的下一个设备。
主引导记录 :主要用于告诉计算机到硬盘的哪个位置去找 *** 作系统。
这一阶段计算机会根据读取到的 主引导记录 启动 *** 作系统,目前最常使用的启动方式为通过运行 启动管理器(Boot Loader) 由用户自行决定选择哪一个 *** 作系统启动。
Linux环境中,最流行的启动管理器是 GRUB (GRand Unified Bootloader ) ,主要功能是在启动时从BIOS接管掌控、加载自身、加载内核到内存、再把执行权交给内核。
控制权转交给 *** 作系统后, *** 作系统的内核首先被载入内存。
在Linux *** 作系统中,首先通过加载 /boot 目录下的 kernel 文件。内核文件加载成功后,接着运行 *** 作系统上的第一个程序 /sbin/init ,该程序运行后会产生Linux *** 作系统中的第一个 init 进程,该进程 pid 为1。最后, init 进程加载系统的各个模块,驱动程序,直到执行 /bin/login 程序,出现终端或GUI界面。
springboot启动流程如下:
启动流程主要分为三个部分,第一部分进行、SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块。
及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。
启动过程主要做了以下几件事情:
配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。
在SpringBoot中启动tomcat的工作在刷新上下这一步。
而tomcat的启动主要是实例化两个组件:Connector、Container,一个tomcat实例就是一个Server,一个Server包含多个Service,也就是多个应用程序,每个Service包含多个Connector和一个Container,而一个Container下又包含多个子容器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)