《现场总线技术应用200例》
您的论文得到两院院士关注
嵌入式系统应用
每个Green线程统的调度,这样才能作到真正的并行。都有对应的操作系统级线程为其执行任务,从Java用户级来看,就好像每个Green线程也成为了真正的操作系统级线程调度实体。要改造KVM使其支持Native线程,关键是实现Green线程与其对应的Native线程、Java虚拟机与Native线程之间的同步和
通信。Java虚拟机中的方法区、中的类信息、法信息是为所有堆方
机为每个Green线程创建一个GreenThread结构体,用于保存该Green线程运行时的信息,同时还为其创建一个Native线程结构体,用于保存对应操作系统级线程的信息。同样,虚拟机为运行过的Java字节码创建一个对应的Native代码结构体,用于保存对应的本地代码。这些信息也都由Monitor模块负责管理。3、模块收到Monitor模块的编译命令时从数JIT据区中读取字节码,经过代码分析、码转换生成本代地代码,之后把编译好的本地代码链接到原来字节码的后面,并把Java类的方法指针指向这段本地代码。为了进行测试与比较,设置了一个JIT开关,用于打开和关闭JIT功能。需要注意的是,本地代码只存在于内存中,Java程序退出以后本地代码就消失了。这样作的原因是在嵌入式环境中,空间容量较小,同时为了防止产生运行垃圾,所以没有将编译产生的本地代码保存到永久存储空间;
Java线程共享的,任何线程在访问某个对象之前必须
获得该对象的锁。然而,为每个共享对象都分配一个锁显然是不现实的,为了使虚拟机能够小巧而又高效,引入了ThinLocks加锁方法来实现Java线程同步。小巧而又灵活地实现线程ThinLocks是一种快速、同步的算法。其基本思想如下:在每个对象的实际数据之前加一个32位的整数,称为lock_
word,lock_word的首位表示锁类型,0为Thin锁,1为Fat锁。
4、Execution模块的功能:当用户没有打开JIT开关时,它负责字节码的解释和执行;当用户采用JIT运行方式时,执行模块负责通知Monitor模块将字节码
编译成本地代码,编译完成之后执行模块便可以执行该本地代码了。当MVM运行在支持多线程的平台上时,Execution模块会自动打开Native线程功能,当然用户也可以强行禁止Native线程的功能。Java应用在MVM模型中执行的过程如下:虚拟机最先启动并完成初始化
工作之后,调用Loader模块加载Java应用程序,并检查Java类、对象以及运行所需的数据的合法性,之后将这些信息传送给Monitor模块;之后控制权交给Execution模块,如果JIT选项开启,Execution模块会通知Monitor模块去调用JIT模块对Java字节码进行编译,之后运行编译好的本地代码。否则进行字节码的解释执行;如果Native线程选项是开启的,Execution模块在执行过程中会为多线程Java应用创建Native线程,以Native线程模式执行Java应用程序。否则以Green线程模式执行Java应用程序;Java应用完成之后,虚拟机等待所有的线程结束或强行终止线程,然后释放占用的内存并结束自己。
Thin锁的lock_word如下Fat锁lock_word如下bit31bit0|----------------------||TXXXXXXXIIIIIIIIIIIIIIIIRRRRRRRR||----------------------|
T为0,X保留不用,I是线程标识,R是循环加锁次数
bit31bit0|----------------------||TPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP||-------------------------------|
T为1,P是真正的Fat锁结构的指针向右移一位
技术创新
若lock_word整个的值为0,则表示当前没有加任何类型的锁。当只有一个线程对某对象加锁时,加锁类型为Thin锁,当多个不同线程要对同一个对象加锁时,则将Thin锁转变为Fat锁。同时,在每个线程节点前加上一个32位整数用于表示竞争位(competitionbit),一个互斥变量(mutex)和一个等待队列
(wait_struct*)。当一个线程等待一个对象时,创建一个wait_struct结构体,该结构体包含该等待线程的线程
号,指向该对象的指针和一个条件变量,并将这个新创建的wait_struct结构体加入到当前拥有这个对象的线程的等待队列中。当一个线程要对一个对