background image

Java 应用程序中动态分配 CPU 资源

 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 环境中,这个思路对仅有小规模任务数的简单系统才可行,原因
有以下两点: