当我试图了解Android WiFi模块有关热点开启的问题时, 我又看到了熟悉的解说——WifiServiceImpl, setWifiApEnable(), WifiStateMachine等, 然而这些流水账式的解说并不能再有助于我构建属于自己的WiFi架构大厦, 因为这些流水账式的解说并不能再帮助我理解更加有深度的问题, 现将这些我认为更有深度的问题列举如下:
进一步解释如下:
我们对程序的编写, 编译, 执行的经典理解为:高级语言经过编译生成可以在特定平台(操作系统和硬件, 比如经典的MS-Intel)执行的机器码文件, 机器码文件被实体计算机(CPU 内存 I/O)按照特定规则执行.
然而Java的运行不能像上面那么理解, 应该这么理解:Java语言经过编译生成可以在Java虚拟机(JVM)上执行的字节码文件, 字节码文件被JVM按照特定规则执行
那么问题来了, JVM是什么东西呢?
答: JVM是一个程序, 这个程序执行字节码文件的过程很像一台计算机执行机器码文件.
既然是程序, 就应该有操作系统可以加载并执行此程序, 对, 无论是Linux还是Windows, 只要我们设置好环境变量, 在命令行输入java <classname>, 此程序就被执行人
而且此程序被执行时和其他程序一样也会被操作系统放到一个新建的进程中, 有它自己的进程号, 有它自己的父进程, 有它自己的资源
现在又有一个问题, 当我们的实际计算机中同时运行两个Java程序时, 这两个Java程序是在两个JVM进程中分别执行呢还是被放在了在一个JVM中的两个进程中分别执行呢?
答: 正确答案是前者.
这其实很好理解, 任何实际计算机某个时刻被执行的只能是单个进程, 所谓的同时存在的多个进程只不过是操作系统实现的一种假象
既然JVM是模拟实际计算机的程序而没有实现一个支持多进程的"JVOS", 那么每个JVM当然只能执行一个Java程序了.
1, 当打开WiFi热点的流程中涉及到如此多的Java 类时, 我们该如何理解整个调用过程?
说明:
面向过程的调用很好理解, 我们可以把一个个过程看成内存中的代码段, 一个复杂的调用流程也不过是在不同的代码段跳来跳去.
但是类是数据和过程的集合, 涉及到类的成员函数的调用和面向过程的调用还是一样的吗?
尤其是在我还不太明白定义一个类和实例化一个类的对象在编译和运行时的机制时, 这个问题尤其困扰我.
Java语言中类的定义与使用的机制又是怎样的呢? 这个问题我依旧没有明确且令我信服的答案.
2, Java程序的进程的机制是什么? 这种解释型语言的进程和我们在理解的经典的C语言进程应该也是不同的.3, 在一台运行着的Android设备中, 涉及WiFi的进程有哪些是常驻内存的, 从手机一开机就存在? 有哪些是在我们使用WiFi时被启动的? 这些进程之间又是如何通信和互相操纵的?
Java程序运行的原理:
首先采用Java编译器将Java源程序编译成与平台无关的字节码文件(.class文件)
然后由Java虚拟机(JVM)对字节码文件解释执行进一步解释如下:
我们对程序的编写, 编译, 执行的经典理解为:高级语言经过编译生成可以在特定平台(操作系统和硬件, 比如经典的MS-Intel)执行的机器码文件, 机器码文件被实体计算机(CPU 内存 I/O)按照特定规则执行.
然而Java的运行不能像上面那么理解, 应该这么理解:Java语言经过编译生成可以在Java虚拟机(JVM)上执行的字节码文件, 字节码文件被JVM按照特定规则执行
那么问题来了, JVM是什么东西呢?
答: JVM是一个程序, 这个程序执行字节码文件的过程很像一台计算机执行机器码文件.
既然是程序, 就应该有操作系统可以加载并执行此程序, 对, 无论是Linux还是Windows, 只要我们设置好环境变量, 在命令行输入java <classname>, 此程序就被执行人
而且此程序被执行时和其他程序一样也会被操作系统放到一个新建的进程中, 有它自己的进程号, 有它自己的父进程, 有它自己的资源
现在又有一个问题, 当我们的实际计算机中同时运行两个Java程序时, 这两个Java程序是在两个JVM进程中分别执行呢还是被放在了在一个JVM中的两个进程中分别执行呢?
答: 正确答案是前者.
这其实很好理解, 任何实际计算机某个时刻被执行的只能是单个进程, 所谓的同时存在的多个进程只不过是操作系统实现的一种假象
既然JVM是模拟实际计算机的程序而没有实现一个支持多进程的"JVOS", 那么每个JVM当然只能执行一个Java程序了.