http://www.minigps.net/map3.html
dalvik 基于寄存器?
从函数调用的角度看
恕我见识浅薄,我接触到的几种实际系统的函数调用都是用栈的方式来实现的。
有以下几点
1 CPU指令集本身提供了压栈,出栈指令。
2 编译器在编译的时候组织这些栈操作指令,结合跳转指令来实现函数的调用。
3 每个线程都有自己独立的栈,甚至不同的模式下也有不同的栈。
dalvik 本身就是模拟一个实际的系统,也有函数调用,
因此每个java线程也有一个java Frame的空间,
dalvik中的所谓的java线程 就是一个普通的os线程扮演着一个java interpreter的角色。
作为一个普通的os线程,本身拥有os给予的栈。
作为一个java interpreter,拥有一个独立的java 栈。在其中进行解释执行的dalvik 字节码 操作的是java 栈。
注意 此栈非彼栈。
有趣的是dalvik 字节码指令集中没有提供栈操作指令,反而提供了更高级别的指令 invoke,return等。
从dex code的层次来,的确清爽了很多,代码也就更节省。
真正的栈操作都集成到invoke,return 等指令中。
从函数调用的角度来看,dalvik 与真实系统类似,还是都是基于栈的。
另外整个dalvik指令的操作数只有"寄存器"和立即数,所以说其的指令集基于寄存器,这个描述没有问题。
一旦脱离了这个语境,就不合适了。
至于dalvik寄存器是映射到物理寄存器还是内存那就是另外一回事了。
我们学数据结构的时候会学到多种排序算法,基本上都是基于比较的排序,下面的这个排序算法并不是基于比较,确切的说它是基于cpu调度算法实现的,这个算法的作者称之为--睡眠排序。
它的基本思想是,对一组数据进行排序,不能存在负数值,这个数是多大,那么就在线程里睡眠它的10倍再加10,不是睡眠和它的数值一样大的原因是,当数值太小时,误差太大,睡眠的时间不比输出的时间少,那么就会存在不正确的输出结果。
下面给出JAVA版本的代码,其中包含注释:
public class SleepSort { public static void main(String[] args) { int[] ints = {1,4,7,3,8,9,0,2,6,5,3,6,9}; //有多少个元素定义多少个线程 SortThread[] sortThreads = new SortThread[ints.length]; //对给一个线程对象初始化 for (int i = 0; i < sortThreads.length; i++) { sortThreads[i] = new SortThread(ints[i]); } //运行每一个线程 for (int i = 0; i < sortThreads.length; i++) { sortThreads[i].start(); } } } class SortThread extends Thread{ int ms = 0; public SortThread(int ms){ this.ms = ms; } public void run(){ try { sleep(ms*10+10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(ms); } }