<b>Java操纵程序中动态分配CPU资源</b>[Java编程]
本文“<b>Java操纵程序中动态分配CPU资源</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
一个多任务系统需求在任务之间实现QoS(Quality of Service)管理时,假如CPU资源的分配基于Java线程的优先级,那么它在差别平台上运行时的效果是很难猜测的.
本文操纵调和式多任务模子,提出一个与平台无关、并且能在任务间动态分配CPU资源的筹划.
目前,由于计算机系统已经从人机交互渐渐向机机交互转化,计算机和计算机之间的业务关于时间的要求非常高.软件系统关于业务的支持已经不但表现为对差别业务的逻辑和数据(算法+数据构造)支持,并且还表现为对同时处理差别任务的时效性(任务呼应速度)支持.普通,任务呼应的速度可以通过算法优化及并行运算分担负载等手段来提高.但是,用户业务逻辑的复杂度决意了算法优化的施展空间,硬件规模决意了所可以承当负载的大小.我们操纵Java平台的特点,鉴戒调和式多任务思惟,使CPU资源可以在任务间动态分配,从而为时间要求强的任务分配更多的CPU运行资源.这也可以充分操纵现有硬件,为用户业务供应最大的保障.
用Java办理问题
本着软件系统构造和实际系统构造一致的思惟,开辟复杂业务服务的程序普通按照计算机任务和实际业务对应的思绪,终究形成一个大规模的多任务系统.由于其跨平台性,Java系统可以随着业务的扩大,平滑地进级到各种硬件平台上.由于Java自身的发展及其利用场所的不断扩大,用它实现多任务系统已经成为当前的利用方向.在J2EE(Java2 Enterprise Edition)推出今后,Sun公司已经将Java的重心放在了服务器端(Server Side)系统的构造上.由于客户/服务器模子固有的多对一的关系,服务器端程序也必定是一个多任务系统.
在Java多任务利用中,动态地将CPU资源在任务间分配有很重要的意义.比方一个Internet服务商的系统常常有多种任务同时运行,有HTTP、FTP、MAIL等协议的支持,也有商务、娱乐、生活、咨询等业务的服务.在白日,网站但愿系统的CPU资源尽大概保障网上用户的服务质量,提高电子商务等任务的呼应速度;晚上则但愿让自己的娱乐服务和资料下载尽大概满意下班后人们的需求.别的,在新兴的网管(比方TMN, Telecommunication Management Network)等利用范畴中,服务程序常常需求支持不计其数个并发呼应事件的被管理对象(MO,Managed Object).关于被管理对象履行的操作,差别用户在差别时刻常常有差别的时间要求.
筹划挑选
在考虑动态分配CPU资源的实施筹划时,常常有以下两点要求:
1. 须充分操纵现有硬件资源,在系统闲暇时,让低优先级任务也可以得到系统所能赐与的最快呼应.
2.当硬件资源超负荷运行时,固然系统中有大规模、大都量的任务不能处理,但它不该受影响,而可以顺利处理那些可以被处理的、最重要的高优先级任务.
多任务系统要用多线程实现的最简单办法就是将线程和任务一一对应,动态调整线程的优先级,操纵线程调度来完成CPU资源在差别任务间动态分配.这种思绪在从前利用本地化代码(Native Code),充分操纵特定硬件和操作系统本领的底子上是基本可行的.但在跨平台的Java环境中,这个思绪对唯一小规模任务数的简单系统才可行,缘由有以下两点:
1. Java的线程固然在编程角度(API)是与平台无关的,但它的运行效果却和差别操作系统平台密切相关.为了操纵更多的CPU资源,Java中的一个线程(Thread)就对应着差别操作系统下的一个真实线程.因为Java虚拟机没有实现线程的调度,所以这些Java的线程在差别操作系统调度下运行的差别性也就对比明显.比方在Windows系统中,不但线程的优先级少于Java API参数规定的十个优先级,并且微软明确反对程序员动态调整线程优先级.即便在操作系统中有充足的优先权,让线程优先级的参数和真实线程的优先级对应,差别操作系统的调度方法也会有很多差别.这终究会造成代码在差别平台上的行为变得不可猜测.这就很难满意复杂的、大规模并发任务的众多优先级需求,从而很难到达用户业务需求到达的效果.
2. 由于在Java系统中,线程被包装在一个Java语言的对象类—Thread中,所认为了完成Java语言对象和操作系统线程的对应,Java线程的系统开销还是对比大的(在NT 4.0中,平均每个线程大致占用30KB内存).因此假如让Thread对象个数和不计其数的任务数同比例增长,就明显是不公道的.
综上所述,按照并发多任务的大规模需求和Java平台固有的特点,想要操纵Java Thread对象的优先级调整CPU资源的分配是非常艰难的,所以应当尽大概避免让线程和任务直接对应,也尽大概避免利用操作系统线程优先级的调度机制.
办理筹划
按照以上解析,问题的症结在于:多任务系统中的任务在Java语言中的对应以及任务间的彼此调度.
从本质上看,一个任务就是一系列对象办法的调用序列,与Java的Thread对象大概别的类的对象没有必定接洽.在避免利用差别操作系统线程调度且同时Java虚拟机又没有线程调度本领的情形下,要想构造一个调和式多任务系统,让各个任务彼此配合就成了最直接的思绪.调和式多任务系统普通有以下特点:
1. 任务由消息驱动,消息的呼应代码完成任务逻辑的处理;
2. 消息行列完成消息的存储和管理,从而操纵消息处理的次序表现任务优先级的差别;
3. 任务中耗时的消息呼应逻辑可以主动放弃CPU资源,让别的任务履行(像Windows 3.1中的Yield函数、Visual Basic中的DoEvents语句).
大概出于偶合,Java语言具有构造调和式多任务系统自然的条件.Java对象的办法不但是一个函数调用,它还是一个java.lang.reflect.Method类的对象.而全部对象的办法都可以通过Method类的invoke办法调用.假如能使每个任务所对应的一系列办法全部以对象情势包装成消息,放到消息行列中,然后再按照自己的优先级算法将行列中的消息取出,履行其Method对象的invoke调用,那么一个基本的调和式多任务系统就形成了.此中,任务的优先级和线程的优先级没有绑定关系.该系统的主体调度函数可以设置成一个“死循环”,按照需求的优先级算法处理消息行列.关于有多重循环、外设等候等耗时操作的消息呼应函数,可以在呼应函数内部递归调用主体调度函数,这一次调用把本来的“死循环”改成在消息行列长度削减到一定程度(大概为空)撤退出.退出后,函数返回,履行方才没有完成的消息呼应逻辑,这样就非常自然地实现了调和式系统中任务主动放弃CPU资源的要求.
假如仅仅做到这一步,完成一个像Windows 3.1中的多任务系统,实际只用了一个线程,没有操纵Java多线程的特点.应当注意到,固然Java系统中线程调度与平台相关,但是相同优先级的线程之间分时运行的特点基本上是不受特定平台影响的.各个相同优先级的线程同享CPU资源,而线程又被映射成了Java语言中的Thread对象.这些对象便可以被认为是CPU资源的代表.Thread与线程履行代码主体的接口—Runnable之间是多对一的关系.一个Runnable可以被多个Thread履行.只要将Runnable的履行代码设置成上述的消息调度函数,并和消息行列对应上,那么便可以通过掌握为它服务的Thread个数来决意消息行列履行的快慢,并且在运行时可以动态地新增(new)和退出Thread对象.这样就可以肆意调整差别消息行列在履行时所占用CPU资源的多少.至此,任何一个Java调用都可以在Thread个数差别的消息行列中挑选,并可以调整这些消息行列服务的Thread个数,从而实目前运行时调整任务所占用的CPU资源.
纵观整个筹划,由于仅仅基于Java语言固有的Method对象,差别任务间动态分配CPU资源并没有对任务的性质及其处理流程有任何限制,那么在消息行列中没有高优先级消息时,低优先级消息的处理函数自然会全部占用CPU资源.在差别消息行列处理速度肆意设置时,并没有将特定的消息限制在快的大概慢的消息行列上.假如系统的负荷超越(比方消息行列长度超越一定限制),只要将行列中低优先级消息换出大概回毫不能处理的消息进入,那么系统的运行便可以基本上不受负荷压力的影响,从而最大保障用户的关键业务需求.
当然,调和式多任务的思惟也有其范围性,主要就是它的调度粒度对比大.系统可以保证的粒度是一次消息处理历程.假如消息处理逻辑非常费时,那么编程人员就必须再处理函数内部,让系统主动让出CPU资源.这固然需求在处理消息呼应逻辑时增添一个考虑因素,但是,在Windows系统风行的本日,这是一个已经被广泛承受的思绪.由于筹划中并没有范围为消息行列服务的线程数目,所以一个长时间的消息呼应只会影响一个线程,而不会对整个系统产生致命的影响.除了调度粒度的问题以外,还有拜候消息行列操作在各个线程间互斥的问题.取出消息的历程是串行化的,因此关于这一瓶颈的办理筹划就是:假定取出一条消息的操作相关于处理消息的损耗可以忽视不计,那么关于多次调用且唯一两三行呼应逻辑的消息,编程人员通过函数调用便可以直接履行.
前面对比具体地阐述了多任务系统中任务的划分以及履行等内容.固然这些是一个系统的核心,但是在一个实用的系统中,还需求任务间的同步、互斥等机制.在上述框架内,互斥可以简单地用Java的Synchronized机制实现.由于任务可以主动让出履行权限,要实现等候(Wait任务中止)和告诉(Notify任务持续),从而实现任务同步也就对比简单了.
以上是“<b>Java操纵程序中动态分配CPU资源</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |