技术开发 频道

Symbian 中的多任务介绍

  【IT168 技术】多任务定义 多任务是用在操作系统中的一项技术,以便在几个独立任务间共享一个处理器[ODICT,多任 务]。  在协同式多任务中,正在运行的任务将决定什么时候放弃对 CPU 的使用,而在抢先式多任务中,当前任务运行了一段被称为“时间片”的固定时间段后,被一个名为“调度器”的系统进程挂起。在这两种情况下,调度器负责选择下一个要运行的任务,并(重)启它。

  [ODICT,多任务]。 多线程意味着:以一种意在最小化线程切换所需时间的方式在多个任务(或“线程”)间共 享一个单一的

  CPU。这是通过在不同的线程间共享尽可能多的程序执行环境实现的,从而当 切换线程时,只需要极少的状态储存和恢复。[ODICT,多任务]。

  Symbian OS 中的多任务

  Symbian OS 实现了抢先式多线程,因此它能同时运行多个应用和多个服务器。一些活动对 象用于在某个单一线程中实现非抢先式多任务[SOS,第 43

  页]。

  使用公共定义(见 2.1 节),Symbian OS 的多任务描述可用以下方式来描述:

  ƒ Symbian OS 实现抢先式多任务

  ƒ 抢先式多任务为线程切换进行了优化,因此就有了这一名称:“抢先式多线 程”。

  ƒ 协同式多任务用于线程执行场景。一些活动对象和活动调度器为编制协同式任务 提供了方便的框架。

  Preemptive multithreading between threads

  System scheduler

  Thread 1

  AO

  Thread 2

  Thread 3

  AO

  AO AO

  AO AO

  AO AO

  AS AS

  线程间的调度由 Symbian OS 自动完成。程序员只是创建一个线程,并将其设置为能运行所 需的任务。系统调度器向每个线程自动分配 CPU时间。线程间的切换如此频繁,以至一个 线程的执行看上去是连续的。某个线程可以有一个活动调度器,它调度各活动对象间的执行时间(为该线程分配的时间片)。可以把活动对象视为线程的子任务。然而,活动调度器在调度过程中使用了一个非抢先方法:正在执行中的活动对象不会被中断(如同线程执行一样)。当活动对象完成其任务并把控制权交还给活动调度器时,它自己会做出决定。然后,活动调度器就可以在执行过程 中选择另一个活动对象。

  在很多情况下,线程中都安装有一个活动调度器。在这种情况下,程序员可以立即使用活动对象。例如,用户界面(UI)应用(.app)有主线程,主线程有一个活动调度器。然而,当写服务器(.exe)或创建自己的线程时,必须在这些活动对象能被使用之前先安装这个活动调度器。

  活动对象的典型用法是:在某个应用中处理一些事件。例如,应用框架使用一些活动对象来处理按键和屏幕更新。处理该事件的活动对象往往会发起一个对已被该程序员所重置的方法(例如 CCoeAppUi::HandleKeyEventL())的回调。当这类方法被重置后,需要理解的是:该方法是由某个活动对象所调用的,这意味着,在该方法返回之前没有其他活动对象可 以运行。

  客户端/服务器结构和异步方法

  Symbian OS 具有一个先进的微内核结构,它使用客户端/服务器结构模式。为 Symbian OS

  编写的那些应用通常是通过服务器使用各种资源的客户端。该服务器往往提供一个 R-类,这 是一个针对各种服务器服务的代理。

  各种 R- classe 具有两种方法:

  ƒ 异步方法。某个客户端线程调用该方法,它构造一则消息并将其发送到服务器线 程。当发送消息之后,该客户端线程将从该方法中返回。

  服务器端有自己可接受各种消息的线程。它读取所传递的数据并处理请求。当服 务器处理完请求后,它会对该客户端线程发出提示:该请求已完成,并传递一个作为结果的完成代码。

  客户端线程必须处理这种提示和结构代码,但可以在某个适当的时间进行。

  ƒ 同步方法。消息传输和服务器处理过程类似于异步方法,但是调用 R-类方法的 客户端线程在消息发送之后并不返回。相反,它挂起该线程的执行,并等待来自

  服务器的有关该请求已完成的提示。

  当服务器向客户端发送响应时,Symbian OS 会去唤醒被挂起的客户端线程。然后客户端线程会去处理那个完成代码,此时如果完成代码显示服务器端有错,就 会去处理这些错误,并返回。

  当调用某个同步方法时,客户端线程会被阻塞,直到服务器线程向其提示:该请求已经完 成。在许多情况下,客户端程序必须更新其 UI并处理用户输入事件。如果同步方式要用很长 时间完成,用户体验将由于这些事件得不到处理而受到损害。当程序使用一些异步方法时,客户端线程能处理这些事件并更新 UI,而服务器则会完成该请求。当服务器处理完请求后,客户端将得到有关请求已完成的提示。该客户端以处理其他事件的相同方式处理该提示。在这种情况下用户体验将非常良好,因为程序会响应用户的行 为,从而使一切看上去比较顺利。使用一些同步方法要比使用异步方法更为容易。当使用某个异步方法时,调用程序必须记住

  对每一个异步方法的调用,并追踪其是否完成。当同步方式返回时,其结果可马上得到处 理,因此就没有必要追踪那些请求的完成情况。然而,Symbian OS 提供了框架,该框架使各种异步服务的使用更为便捷:活动对象和活动调度器。使用异步接口,而不是同步接口的原因之一就是效率和良好的用户体验。

  区别异步方法还是同步方法是很容易的——异步方法必须具有 TrequestStatus 作为其参 数之一。这就是处理请求后,服务器储存完成代码所处的值。

  各种同步方法并没有这种参数,因为它们在从该方法返回前等待其完成,并对结果进行处 理。各种异步方式的优秀范例是:RFile 中的一些读写方法:

  1: void Rfile::Read(TInt aPos, TDes8& aDes,

  2: TRequestStatus& aStatus) const;

  3: void Rfile::Write(const TDesC8& aDes,

  4: TRequestStatus& aStatus);

  RFile 还提供来自某些相同方法的实现。它们的声明都相似,但是它们不把

  TRequestStatus 作为一个参数:

  5: TInt Rfile::Read(TDes8& aDes) const;

  6: TInt Rfile::Write(const TDesC8& aDes);

0
相关文章