(57)【要約】  ワークフローのスレッドの間の同期を実行することを提供する。メモリ領域は、複数の作業項目をスケジューラキューに記憶する。作業項目は、ワークフローのアクティビティと関連し、各々の作業項目はスレッドと関連する。プロセッサは、作業項目の各々に同期ハンドルを割り当てる。同期ハンドルは、作業項目によりアクセスされる特定の共有資源を示す。トークン値が、割り当てられた同期ハンドル及びアクティビティの階層における作業項目に基づいて各々の作業項目に対して算出される。作業項目は、各々の作業項目と関連するトークン値に基づいて同期キューにソートされる。プロセッサは、同期キューのソートされた作業項目の各々を順番に実行して特定の共有資源へのアクセスをシリアライズし、作業項目と関連するスレッドの同期実行を実施する。
2009532756.tif 000002
【特許請求の範囲】
【請求項１】
ワークフローのスレッドの間の同期を実行するシステム（４００）であって、
複数の作業項目（４２２）をスケジューラキュー（４１０）に記憶するメモリ領域（４０４）であって、前記複数の作業項目（４２２）の１つ以上は、アクティビティ（４０６）において階層（５００）を有しかつワークフローの前記アクティビティ（４０６）と関連し、さらに前記複数の作業項目（４２２）の各々はスレッドと関連するメモリ領域と、
コンピュータ実行可能命令を実行するように設定されているプロセッサ（４０２）であって、前記コンピュータ実行可能命令は、
前記スケジューラキュー（４１０）の前記作業項目（４２２）の各々に同期ハンドル（７１８）を割り当て、前記同期ハンドル（７１８）は前記作業項目（４２２）によりアクセスされるべき特定の共有資源を示し、前記特定の共有資源は前記作業項目（４２２）のうちの１つ以上により共有されているステップと、
前記作業項目の（４２２）の各々に対して、前記割り当てられた同期ハンドル（７１８）と前記アクティビティ（４０６）の前記階層（５００）の前記作業項目の位置とに基づいてトークン値を算出するステップと、
前記作業項目（４２２）の各々に関連する前記算出されたトークン値に基づいて同期キュー（７１２）に前記作業項目をソートするステップと、
前記同期キュー（７１２）の前記ソートされた作業項目（４２２）の各々を実行して前期特定の共有資源へのアクセスをシリアライズして、前記作業項目（４２２）に関連する前記スレッドの同期実行を実施するステップとに対するものであるプロセッサとを備えることを特徴とするシステム（４００）。
【請求項２】
前記プロセッサ（４０２）は、前記作業項目（４２２）の各々に対する前記同期ハンドル（７１８）のプロパティを明示することによって、前記作業項目（４２２）の各々に対する前記割り当てられた同期ハンドル（７１８）を宣言的に定義するようにさらに設定されていることを特徴とする請求項１に記載のシステム（４００）。
【請求項３】
前記作業項目（４２２）の各々の前記割り当てられた同期ハンドル（７１８）は、前記作業項目（４２２）の各々と関連するスレッド範囲を定義することを特徴とする請求項１に記載のシステム（４００）。
【請求項４】
前記アクティビティ（４０６）の前記階層（５００）はツリー構造であって、前記プロセッサ（４０２）は、前記ツリー構造における前記位置に基づいて前記作業項目（４２２）をソートするコンピュータ実行可能命令を実行するように設定されていることを特徴とする請求項１に記載のシステム（４００）。
【請求項５】
前記プロセッサ（４０２）は、前記作業項目（４２２）及び関連するトークン値を記憶している同期キュー（７１２）をデータストア（４２０）にパッシベートするようにさらに設定されていることを特徴とする請求項１に記載のシステム（４００）。
【請求項６】
前記プロセッサ（４０２）は、前記ワークフローを処理することと関連する状態オートマトン（６００）に従って前記作業項目（４２２）を実行中の状態（６０４）に移行することにより前記作業項目（４２２）を実行するように設定されていることを特徴とする請求項１に記載のシステム（４００）。
【請求項７】
ワークフローにおいて、特定の共有資源にアクセスするアクティビティの同期実行の方法であって、
実行する複数の作業項目（４２２）をキューに入れ、前記複数の作業項目の１つ以上は、アクティビティ（４０６）において順番にワークフローの前記アクティビティ（４０６）に関連付けられ、前記作業項目の各々はスレッドであるステップと、
前記複数の作業項目（４２２）の各々に同期ハンドル（７１８）を割り当て、前記同期ハンドル（７１８）は前記複数の作業項目（４２２）によりアクセスされるべき前記特定の共有資源を示し、前記特定の共有資源は前記作業項目（４２２）のうちの１つ以上により共有されるステップと、
前記作業項目（４２２）の各々に対して、前記割り当てられた同期ハンドル（７１８）及び前記アクティビティ（４０６）の前記順番における前記作業項目の位置に基づいてトークン値を算出するステップと、
前記作業項目（４２２）の各々と関連する前記計算されたトークン値に基づいて同期キュー（７１２）の前記作業項目（４２２）をソートするステップと、
前記同期キュー（７１２）の前記ソートされた前記作業項目（４２２）の各々を順番に実行して、前記特定の共有資源へのアクセスをシリアライズして、前記作業項目（４２２）と関連する前記スレッドの同期実行を実施するステップとを備えることを特徴とする方法。
【請求項８】
前記作業項目（４２２）の各々に対する前記同期ハンドル（７１８）のプロパティを明示することにより、前記作業項目の各々に対する前記割り当てられた同期ハンドル（７１８）を宣言的に定義するステップをさらに備えることを特徴とする請求項７に記載の方法。
【請求項９】
前記同期ハンドル（７１８）を割り当てるステップは、文字列トークンを割り当てるステップを含むことを特徴とする請求項７に記載の方法。
【請求項１０】
前記同期ハンドル（７１８）を割り当てるステップは、前記作業項目（４２２）の各々と関連するスレッド範囲を定義するステップを含むことを特徴とする請求項７に記載の方法。
【請求項１１】
前記アクティビティ（４０６）の前記順番は、ツリー構造（５００）を横断する順番に対応し、前記ソートするステップは、前記ツリー構造の前記位置に基づいて前記作業項目（４２２）を配置するステップを含むことを特徴とする請求項７に記載の方法。
【請求項１２】
前記作業項目（４２２）及び前記関連するトークン値を用いて前記同期キュー（７１２）をデータストア（４２０）にパッシベートするステップをさらに備えることを特徴とする請求項７に記載の方法。
【請求項１３】
実行するステップは、前記ワークフローを処理するステップと関連する状態オートマトンに従って実行状態に移行することにより前記作業項目を実行するステップを含むことを特徴とする請求項７に記載の方法。
【請求項１４】
１つ以上のコンピュータ読取り可能媒体は、請求項１に記載の方法を実行するコンピュータ実行可能命令を有することを特徴とする請求項７に記載の方法。
【請求項１５】
アクティビティを同期実行するコンピュータ実行可能コンポーネントを有する１つ以上のコンピュータ読取り可能媒体（９００）であって、前記コンピュータ実行可能コンポーネントは、
複数の作業項目（４２２）をキュー（４１０）に記憶する記憶コンポーネント（９０２）であって、前記複数の作業項目（４２２）の１つ以上はワークフローのアクティビティ（４０６）と関連し、前記複数の作業項目（４２２）の１つ以上は前記アクティビティ（４０６）においてツリー構造（５００）を有し、前記作業項目（４２２）の各々はスレッドと関係付けられている記憶コンポーネントと、
前記キュー（４１０）の前記複数の作業項目（４２２）の各々に同期ハンドル（７１８）を割り当てる同期コンポーネント（９０４）であって、前記同期ハンドル（７１８）は、前記複数の作業項目（４２２）によりアクセスされるべき前記特定の共有資源を示し、前記特定の共有資源は、前記作業項目（４２２）のうちの１つ以上により共有される同期コンポーネントと、
前記割り当てられた同期ハンドル（７１８）及び前記アクティビティ（４０６）の前記ツリー構造（５００）における前記作業項目（４２２）の位置に基づいて、前記作業項目（４２２）の各々に対するトークン値を算出するトークンコンポーネント（９０６）と、
前記作業項目（４２２）の各々に関連する前記トークン値に基づいて同期キュー（７１２）に前記作業項目（４２２）をソートするソートコンポーネント（９０８）と、
前記同期キュー（７１２）の前記ソートされた作業項目（４２２）の各々を実行して前記特定の共有資源へのアクセスをシリアライズして、前記ワークフローと関連する前記スレッドの同期実行を実施する実行コンポーネント（９１０）とを備えることを特徴とするコンピュータ読取り可能媒体（９００）。
【請求項１６】
前記作業項目（４２２）の各々に対する前記同期ハンドルのプロパティを明示することにより、前記作業項目（４２２）の各々に対する前記割り当てられた同期ハンドル（７１８）を宣言的に定義する定義コンポーネント（９１４）をさらに備えることを特徴とする請求項１５に記載のコンピュータ読取り可能媒体（９００）。
【請求項１７】
前記同期コンポーネント（９０４）は、前記作業項目（４２２）の各々と関連するスレッド範囲を定義するステップを含むことを特徴とする請求項１５に記載のコンピュータ読取り可能媒体（９００）。
【請求項１８】
前記作業項目（４２２）及び関連する前記トークン値を用いて同期キュー（７１２）をデータストア（４２０）にパッシベートするパッシベーションコンポーネント（９１２）をさらに備えることを特徴とする請求項１５に記載のコンピュータ読取り可能媒体（９００）。
【請求項１９】
前記パッシベーションコンポーネント（９１２）は、前記作業項目（４２２）、前記関連するトークン及び実行状態を有する同期キュー（７１２）を前記データストア（４２０）に記憶することを特徴とする請求項１８に記載のコンピュータ読取り可能媒体（９００）。
【請求項２０】
前記実行コンポーネント（９１０）は、前記ワークフローを処理するステップと関連する状態オートマトン（６００）に従って前記実行状態（６０４）に移行することにより前記作業項目（４２２）を実行するステップを含むことを特徴とする請求項１５に記載のコンピュータ読取り可能媒体（９００）。
【発明の詳細な説明】
【背景技術】
【０００１】
プロセス指向プログラムまたはプロセス中心プログラムは進化し、自立エージェント同士の間で現実世界のインタラクションをモデリングしている複雑な命令の処理を可能にした。既存のシステムは、ビジネス上の問題をモデリングすることによりビジネス上の問題を高水準のワークフローにマッピングすることを試みる。しかしながら、現実世界のワークフローは、(a)実行及びモデリングの複雑さ、（b）設計時におけるフロー構造についての知識、(c)静的に定義された、またはアドホック／動的、（d）そのライフサイクルの様々なポイントにおけるフローのオーサリング及び編集の容易さ、（e）ビジネスロジックとコアワークフロープロセスとの弱い関連性または強い関連性、などの様々な次元で変化する。既存のモデルは、これらの要因全てに対応することができない。
【０００２】
さらに、大部分の既存のワークフローモデルは、言語ベースのアプローチ（例えば、ＢＰＥＬ４ＷＳ、ＸＬＡＮＧ／Ｓ、及びＷＳＦＬ）またはアプリケーションベースのアプローチのいずれかに基づいている。言語ベースのアプローチは、事前定義された論理構成の閉集合を有する高水準ワークフロー言語であり、これはユーザ／プログラマがワークフロープロセスをモデル化するのに役立つ。ワークフロー言語は、論理構成の閉集合に対する意味情報の全てを扱い、これによってユーザはワークフローモデルを構築することができる。しかしながら、言語は、開発者が拡張することができず、ワークフローモデルを構成するプリミティブな閉集合であることを意味する。言語は、ワークフローシステムベンダーによって出荷される言語コンパイラに関係している。ワークフローシステム製品のベンダーだけが、製品の将来のバージョンにおいて新規な一組の論理構成を有する言語を拡張することによりモデルを拡張することができる。そのため、言語と関連しているコンパイラをアップグレードすることが必要となる。さらに、言語は、通常、他のプログラムによって容易にかつ効果的に用いられ得る機能または動作を宣言的（declaratively）に明示（expose）または定義しない。
【０００３】
アプリケーションベースのアプローチは、アプリケーションの範囲内で領域特化型の問題を解決するワークフロー機能を有するアプリケーションである。これらのアプリケーションは、真に拡張可能ではないし、プログラム可能なモデルも有していない。
【０００４】
さらに、既存のアプローチでは、複雑さ、先見、動的ワークフロー、オーサリングの容易さ、及び、ビジネスロジックとコアワークフローとの関連の強さという問題が十分に扱われない。ワークフローの異なるクラスをモデル化する視覚的ワークフローデザイナ（visual workflow designers）を構築するのに利用できる、拡張可能で、カスタマイズ可能で、さらに再ホスト可能な（re-hostable）ワークフローデザイナのフレームワークはない。既存のシステムには、ユーザがグラフを用いてワークフロープロセスを設計しさらに開発者の選択したプログラミング言語のビジネスロジックに関連付けることができる、高速アプリケーション開発（ＲＡＤ）スタイルのワークフローの設計経験が欠けている。
【０００５】
また、ワークフロープロセスは、ワークフロープロセスモデルの複数のステップにわたる分野横断的に直交しかつ錯綜した問題を取り扱う。例えば、ワークフロープロセスの一部は長い実行中のトランザクションに関与するように設計されているが、同じプロセスの他の部分は、同時実行用にまたは共有資源にアクセスするように設計されている。設計上の欠点のために、既存のシステムは、ユーザがアクティビティの同期実行またはインターリーブ実行を設計することを可能にする実行スレッドのインターリービングを提供できない。さらに、同じワークフロープロセスのさらに他の部分は追跡を必要とするが、他の部分はビジネスまたはアプリケーションレベルの例外を処理する。特定の動作をワークフロープロセスの１つまたは複数の部分に適用することが必要である。
【０００６】
いくつかのワークフローモデリングのアプローチは、全ての例外及び人間の介在を含むビジネスプロセス全体の完全なフローベースの記述を必要とするので、実行不可能である。これらのアプローチには例外が生じたときに追加機能を提供するものもあるが、他のアプローチではビジネスプロセスをモデリングするフローベースのアプローチの代わりに制約ベースのアプローチだけ用いる。既存のシステムは、フローベースのアプローチまたは制約ベースのアプローチのいずれかを実装する。かかるシステムは、多くの一般のビジネス状況をモデリングするにはあまりに柔軟性がない。これらのシステムにはまた、例外または中止を非同期に処理する能力がない。
【発明の開示】
【課題を解決するための手段】
【０００７】
本発明の実施形態では、実行スレッド用の同期ハンドルを用いて共有資源にアクセスする作業項目を同期的に実行する。軽量スレッドの効果的な並行処理制御で、本発明の態様は、同期ハンドルを用いて共有資源を識別し、作業項目に対する実行スレッドが他の作業項目と関連している他のスレッドによるアクセスを妨げることなしに共有資源にアクセスすることを可能にする。
【０００８】
この概要は、詳細な説明においてさらに後述する単純化した形式の概念の選択を導入するために提供されている。この概要は、請求された要件の重要な特徴または本質的な特徴を特定することを意図していないし、請求された要件の範囲を決定する補助として用いられることも意図していない。
【０００９】
他の特徴については、一部は明白であり、一部は以下で指摘される。
【発明を実施するための最良の形態】
【００１０】
全図面にわたって、対応する参照文字は対応する部分を示す。
【００１１】
最初に図１を参照すると、ブロック図は、ワークフローなどの、プロセス中心のアクティビティ用プログラムを設計する既存のプログラミングパラダイムを示している。例えば、この図では、既存のプログラミングパラダイムの３つのレベルの仮想化モデルを示していて、管理された実行環境のレベルは最も高いレベルであり、処理装置は最も低いレベルである。このプログラム設計システムでは、管理された実行環境レベルにおいてさえ、プログラム、特にワークフロープロセスを処理するプロセス中心プログラムは、ワークフローのプロセス同士の間の複雑な相互作用に対応する能力及び効率性を欠いている。
【００１２】
特定の制約がソフトウェアまたはアプリケーションプログラムを設計することに関連しているということは当業者に公知である。この例では、オペレーティングシステムのソフトウェアプログラム１０４を記述するとき、プログラミングコードまたはプログラミングルーチンは、処理装置１０２のタイプまたは構成に依存する。処理装置１０２のタイプまたは構成は、コンピューティングアーキテクチャのタイプ（例えば、ＩＢＭ（登録商標）互換機、ＡＰＰＬＥ（登録商標）コンピュータ、もしくは他のシステム）または他の制約に特有である。さらに、オペレーティングシステム１０４が適切に機能するために、プログラミング言語は概して、スタック、ヒープ、スレッドベースまたは他のハードウェア特有の構造などのデータ構造を正確に識別して利用する必要がある。
【００１３】
複雑なワークフロープロセスを処理する際に、既存のアプリケーションは、管理された実行環境１０６という概念（例えば、プログラムが機能または共通のオブジェクト指向クラスを共有することができるランタイム環境など）を用いる。そこで、１つのプログラミング言語で書かれたプログラムは、異なるプログラミング言語で書かれた他のプログラムの機能を呼び出してもよい。かかる実行環境では、異なるプログラミング言語によるこれらのプログラムは、中間言語にコンパイルされて、管理された実行環境１０６がパラメータ、引数、または異なるプログラムに対するスキーマもしくは機能を明示し、それによってプログラムは互いに相互作用することができる。
【００１４】
この実行環境１０６はプログラム同士の間で共通の通信環境を生成するが、実行環境１０６は、プロセス中心プログラムの複雑さ及び性能を処理するのに適していない様々な厳しい要求を含む。例えば、実行環境１０６では、プログラムが固有ファイル形式に一致することを必要とする。実行環境１０６ではまた、プログラムの機能または動作が実行環境１０６により定義される一定の機能または機能のクラスを用いることを必要とする。
【００１５】
本発明の実施形態は、図２の拡張可能な基礎またはフレームワーク２０２の上に構築され、既存のプログラミングモデルの欠点を克服する。いかなるプログラミング言語で書かれたプログラムもいかなるファイル形式から成るプログラムも許容することにより、本発明の態様では、プログラム開発者が、機能性及び仕様で妥協することなく固有の機能を有するプログラムを設計することが可能になる。ワークフローフレームワークにおいて実行されるべきベースクラスとして、ワークフロータスクまたはワークフロープロセスなどのアクティビティを定義することにより、開発者は、既存の実行環境における、固定され、ハードコードされ、柔軟性がない機能クラスまたはアクティビティクラス、及び、一定の機能クラスまたはアクティビティクラスに従うことなく、領域特化型の（例えば、ヘルスケア産業、金融業界等のプログラムなどの固有の実行環境）オペレーションコード（以下、「ｏｐコード」と称する）を容易にかつ効果的に構築することができる。さらに、本発明の態様を具体化しているワークフロー基礎は、いずれかの既存のフレームワーク（例えば、管理された実行環境、オペレーティングシステム環境、またはハードウェア処理装置レベルのいずれか）の上に積層される連続ベースのランタイムである。
【００１６】
本発明の態様は、ワークフローのアクティビティがワークフロー設計の表現から構築され得る限りいかなる方法または表現でのワークフロー設計（例えば、フローチャート、図、番号をつけられた説明等）をも可能にすることにより、特定のファイル形式でアクティビティを定義するという制約から解放する。
【００１７】
図３は、本発明の実施形態によるワークフロー３００の単純化した図を示す。例えば、ワークフロー３００は、購入注文を処理するワークフローであってもよい。この購入注文ワークフロー３００は、購入注文を受信し、顧客に確認を送信し、マネージャが購入注文を承認するといった、プロセスまたはアクティビティを含んでいてもよい。さらに、これらのアクティビティは順序付けられて、他のアクティビティと同時に実行され得るものもあれば、他のアクティビティの完了時にだけ実行され得るものがあってもよい。
【００１８】
ワークフロー３００は、開始ポイント３０２から開始し得る。例えば、購入注文ワークフロー用の開始ポイント３０２は、顧客から注文を受信していてもよい。ワークフロー３００はまた、条件文３０４（例えば「ＩＦ文」または「ＷＨＩＬＥ文」など）を含むことができ、条件文３０４はさらなる条件文３０６及び３０８に再分割され得る。ワークフロー３００にはまた、並列構造３１０を含むことができ、並列構造３１０には１つ以上のアクティビティ３１２をさらに含む。例えば、並列構造３１０では、インベントリーを点検することと入手可能な荷主を点検して更新することなどのアクティビティを同時に処理してもよい、ということを示すことができる。示した実施形態では、例えば「Ｅメールを送信する」及び「承認を得る」などのアクティビティが同時に処理され得る。「アクティビティをここにドロップする」というボックス３１６では、ユーザがワークフロー３００にさらなるアクティビティを加えるかまたは補うことができることを示す。ワークフロー３００を完了するために、プロセスまたはアクティビティは、完了ステップ即ちポイント３１４で終了する。
【００１９】
一実施形態では、アクティビティは、ツリー構造（図５を参照せよ）５００において階層的に配置され得る。例えば、アクティビティメソッドは、２つの子ノード即ちリーフノード５０４及び５０６を有するルートノード５０２にある。子ノード５０４及び５０６（例えば、それぞれ、作業項目＿１及び作業項目＿２）においてアクティビティメソッドは、階層構造に従って実行され得る。さらに、子ノード５０４及び５０６も、実行すべきそれぞれの作業項目を有する他の子ノードを含むことができる。
【００２０】
別の実施形態では、アクティビティは以下のタイプのうちの１つ以上を含む。即ち、単純アクティビティ、コンテナアクティビティ、及びルートアクティビティである。本実施形態では、モデルには１つのルートアクティビティがあり、さらにルートアクティビティの中に単純アクティビティまたはコンテナアクティビティが存在しないかまたはいくつかある。コンテナアクティビティは、単純アクティビティまたはコンテナアクティビティを含むことができる。ワークフロープロセス全体は、アクティビティとして用いられて高次ワークフロープロセスを構築することができる。さらに、アクティビティは割り込み可能でもよいし割り込み不可でもよい。割り込み不可の複合アクティビティは、割り込み可能なアクティビティを含まない。割り込み不可のアクティビティは、アクティビティにブロックさせるサービスを欠いている。さらに、アクティビティはプリミティブのアクティビティであってもよいし複合アクティビティに分けられてもよい。プリミティブのアクティビティまたは基本的アクティビティは、サブストラクチャ（例えば、子アクティビティ）を有しておらず、よってツリー構造のリーフノードである。複合アクティビティは、サブストラクチャ（例えば、それは１つ以上の子アクティビティの親である）を含む。
【００２１】
さらに、アクティビティ及びアクティビティに含まれる作業項目を実行する際に、ワークフローフレームワークは、作業項目の各々についての範囲または境界である実行コンテキストまたは実行環境を定義する。この範囲または境界は、例えば作業項目、関連するプロパティ、ハンドラ、制約及び自立エージェント間の相互作用によってアクセスされるべき共有データまたは共有資源などの、（例えば、データ、メタデータ等の形式の）情報を含みかつ明示する。これらの範囲は、階層的に構造化され得る。また、各々のアクティビティは、根底にある管理されたフレームワークをサポートする任意のプログラミング言語でユーザコードを用いて設定され得る。例えば、ユーザコードは、固有の領域または実行環境で書かれたビジネス論理もしくはビジネスルールまたはアプリケーション論理もしくはアプリケーションルールを表すことができる。各々のアクティビティは、ユーザコードでの実行への遮断前フック（pre-interception hooks）及び遮断後フック（post-interception hooks）をサポートすることができる。各々のアクティビティは、関連付けられたランタイム実行意味論及び動作（例えば状態管理、トランザクション、イベント処理、及び例外処理）を有する。アクティビティは、他のアクティビティと状態または資源を共有することができる。
【００２２】
図４は、本発明の一実施形態によるワークフローアクティビティ処理システム４００を示す図である。システム４００はプロセッサ４０２を含み、プロセッサ４０２は処理装置または処理装置群であってもよい。システム４００はまた、プロセッサ４０２がアクセス可能なデータを記憶するメモリ領域４０４を含む。実施形態において、システム４００は、１つ以上のプロセッサまたは処理装置（例えばプロセッサ４０２）とシステムメモリ（例えばメモリ領域４０４）とを有していて、さらに、システムメモリを含む様々なシステムコンポーネントをプロセッサ４０２に結合していて当業者に公知である他のコンポーネントを少なくとも有しているコンピュータであってもよい。
【００２３】
１つの例では、メモリ領域４０４は、例えばコンピュータ読取り可能命令、データ構造、プログラムモジュール、または他のデータなどの情報を記憶するためのいずれかの方法または技術で実施される、揮発性、不揮発性、着脱自在、固定型の媒体のいずれかのコンピュータ読取り可能媒体を含んでいてもよい。例えば、コンピュータ記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）または他の光ディスク記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置またはその他の磁気記憶装置、または所望の情報を記憶するために用いることができかつシステム４００がアクセスすることができる他の媒体を含む。メモリ４０４はまた、搬送波または他の搬送メカニズムのような変調されたデータ信号におけるコンピュータ読取り可能命令、データ構造、プログラムモジュールまたは他のデータを含む通信媒体を含み、さらに任意の情報提供媒体を含むことができる。当業者は、変調データ信号に精通していて、変調されたデータ信号は、信号内の情報をコード化するような方法で設定または変更される特徴のうちの１つ以上を有している。有線ネットワークまたは直接配線接続などの有線媒体、音響、ＲＦ、赤外線及びその他の無線媒体などの無線媒体は、通信媒体のいくつかの例である。上記うちのいずれの組合せも、コンピュータ読取り可能媒体の範囲に含まれる。
【００２４】
この例では、メモリ領域４０４は、ワークフロー（例えば、ワークフロー３００）内で処理する複数のアクティビティ４０６を記憶する。複数のアクティビティ４０６の各々は、１つ以上の作業項目を含み、作業項目はツリー構造（図５を参照せよ）などの階層構造を有していてもよい。複数のアクティビティ４０６を処理する際に、プロセッサ４０２は、スケジューラ４０８にアクセスするかまたはこれを実行する。スケジューラ４０８は系統化された一組のアクティビティを準備する。
【００２５】
例えば、プロセッサ４０８は、スケジューラ４０８などのコンポーネントまたは一組のコンピュータ実行可能命令を介して複数のアクティビティ４０６の作業項目にアクセスして、作業項目４２２をキュー４１０にエンキューする。プロセッサ４０２がアクセス可能なディスパッチャ４１２は、実行する作業項目４２２をディスパッチする。例えば、作業項目４２２-１は、「ユーザの入力を要求する」という機能を実行するためのアクティビティメソッド４２４、ルーチンまたは一群のコードを含んでいてもよい。１つ以上の他のアクティビティメソッド、ルーチンまたはコードは、本発明の範囲から逸脱することなく作業項目４２２の各々に含まれ得る。
【００２６】
一旦作業項目４２２がディスパッチャ４１２によりディスパッチされると、プロセッサ４０２は、符号４１４で作業項目４２２におけるメソッド４２４の各々を実行する。作業項目４２２-１の例では、プロセッサ４０２は、ユーザがユーザインタフェース（ＵＩ）を介して要求された情報またはデータを入力することができる。別の実施形態では、プロセッサ４０２は、入力をユーザに要求するために外部データソースに接続またはアクセスすることができる。アクティビティメソッド４２４の完了で、プロセッサ４０２は、符号４１６で作業項目４２２の実行を完了する。１つの実施形態では、プロセッサ４０２は、符号４１８で作業項目の実行状態をデータストア４２０にパッシベート（passivate）する。
【００２７】
別の実施形態では、プロセッサ４０２は、図６に示したオートマトンなどの、状態オートマトンに従って作業項目４２２を実行する。図６は、本発明の実施形態によるアクティビティに関連する作業項目の処理状態を説明している、例示的な状態オートマトン６００を示す図である。１つの例では、状態オートマトン６００は、（図４に示すように）初期化された状態、実行中の状態及び完了状態を含み得る。別の実施形態では、状態オートマトン６００は、初期化された状態６０２、実行中の状態６０４、中止状態６０６、障害状態６０８、補償状態６１０及び完了状態６１２を含む。
【００２８】
例えば、状態オートマトン６００は、ワークフローアクティビティの作業項目（例えば、作業項目４２２）の実行についてのプロセスフローを記述する。図４に示したように、作業項目４２２-１は、キュー４１０にエンキューされると、先ず初期化される。次に作業項目４２２-１は、実行中の状態（例えば、図６の実行中の状態６０４）において実行される前に、ディスパッチャ４１２へ待機解除される（dequeued）。作業項目４２２-１の実行中にパラメータまたは条件に応じて、作業項目４２２-１は、中止状態６０６または障害状態６０８へ進んでもよい。１つの実施形態では、作業項目４２２-１は、中止状態６０６から障害状態６０８へ進むことができる。代替的実施形態では、障害または例外が発生すると、補償状態６１０は、実行されるべき一組の動作または機能を記述する。例えば、機能パラメータが見つからないなどといった例外が作業項目（例えば作業項目４２２-１）の実行中に発生したと仮定する。システム４００は、作業項目４２２-１を障害状態６０８へ移行する。そうする際に、システム４００はまた、作業項目４２２-１を完了状態６１２へ移行する前に、補償状態６１０においてガーベジコレクション（例えば、キャッシュもしくはメモリからの動作、リセットパラメータ値等の以前に実行された部分を除去すること）動作を実行する。
【００２９】
１つの実施形態では、本発明の態様を具体化しているワークフローフレームワークに従って設計されたプログラムを、下位レベル（例えば、共通言語ランタイム（ＣＬＲ）またはＯＳレベルなどの管理された実行環境）から任意の数のスレッドがビジットすることができる。別の実施形態では、スケジューラ（例えば、スケジューラ４０８）は、アクティビティの所定の実施または実行のための専用のＣＬＲスレッドを用いることができる。
【００３０】
さらに、アクティビティに対応しているアクティビティ用の実行ハンドラは、本発明の態様を具体化するワークフローフレームワーク(ＷＦ)下で、スレッドと見なされ得る。このように、ＷＦスレッドは、待ちポイントにおいてまたは明白な異常があるスケジューリング状態で、親の複合アクティビティにより非同期でインタリーブする。
【００３１】
ここで図７Ａを参照すると、ブロック図は、本発明の実施形態によるワークフローのアクティビティの作業項目の同期実行を示している。１つの実施形態では、作業項目の同期実行は、ワークフローと関連するスレッドのインタリーブ実行を可能にする。１つの実施形態では、ワークフローは、付録Ａに示したようなアクティビティのインスタンスの範囲内で共有状態への同期アクセスに対するSynchronizationScopeActivityを定義する。例えば、ワークフローの２つのアクティビティがデータストアのディレクトリにアクセスして２つの異なる動作を実行することを所望すると仮定する。この例では、アクティビティ1は、読取りファイルの情報を更新する前にディレクトリのファイルにアクセスすることを所望することができる。同時に、アクティビティ2はアクティビティ1によりアクセスされた同一の一組のファイルを修正することを所望することができる。このように、アクティビティ1及びアクティビティ2による共有資源へのアクセスを、同期させかつ管理する必要がある。付録Ａは、宣言的方法でスレッド全体の共有状態の同期またはインターリービングの例示的な実施を示している一組の動作SynchronizationScopeを示す。
【００３２】
既存のシステムは、通常、オペレーティングシステム(ＯＳ)によって提供されるアクセスロックまたは他の方法を利用してかかる同期を実行する。かかるＯＳのロックは、所望の目的を実現する基本機能を提供するが、ハードコードされ、柔軟性がなく、さらに拡張可能なワークフロー基礎またはフレームワークに不適当である。さらに、ＯＳレベルのスレッドは、ＯＳのロック（例えば、記録または識別されたメモリアドレス、前のメモリアドレス、スタック割当て等）と関連する文脈切り替え（context switch）を共通に含む。さらに、ＯＳのロックは、パッシベーションプロセスを克服しない。なんとなれば、ＯＳのロックと関連するポインタ、スタックなどの全ては、パッシベーションの前に、ロックにおいて前に割り当てられた値を元に戻さないからである。さらに、ワークフローはライフタイムの間異なるマシンで実行するが、ＯＳのロックは、ＯＳのロックが生成されたマシンに対してだけ有効である。
【００３３】
本発明の実施形態は、アクティビティ内の作業項目に同期ハンドル７１８を割り当てて、実行スレッドが、コンフリクトまたはデッドロックすることなく共有資源に同期アクセスするのを確実にする。本発明の態様は、開発者が物理的実行環境または管理された実行環境のスレッドの上に、仮想で重量のないスレッドを設計することを可能にする。別の実施形態では、実行スレッドは、いかなる物理的リファレンスまたはハードウェアリファレンスに附属していないかまたは関連していないことで軽量である。このように、実行スレッドは、パッシベーションサイクルを克服するかまたはデータストアに記憶された後に存続し得る。
【００３４】
例えば、プログラムがコールバック機能を含んでいて、コールバック機能の実行中に、プログラムがデータストアにパッシベートされる必要があると判断されると仮定する。既存のモデル及びプログラミング言語は、プログラムの実行状態に関係する全てのパラメータがオブジェクトとして保存されることを必要とする。プログラムの状態は、後のポイントでオブジェクトから回復され得る。しかしながら、オブジェクトは通常、プログラムが実行されるハードウェアコンテキストまたは設定とのハードコードされた関連付けを有するスレッドを含む。本発明の実施形態は、この種の依存性を克服する。
【００３５】
図７Ａを再び参照すると、この図は、複数のスレッドが共有資源にアクセスを試みる場合のスレッドの同期実行を示している。最初に、アクティビティの作業項目の集合７０２が処理される予定になっている。１つの実施形態では、アクティビティの作業項目は、図５に示されているアクティビティ５０２のように、アクティビティにおいてツリー構造を有しても良い。スケジューラ７０４は、作業項目の集合７０２にアクセスし、処理すべきスケジューラキュー７０６に作業項目をエンキューする。１つの実施形態では、同期ハンドル７１８は、スケジューラキュー９０６のアクティビティの各々に割り当てられる。それは、特定の共有資源がアクティビティによってアクセスされることになっているということを示している。例えば、作業項目７０８−２及び作業項目７０８−Ｎは、共有資源（例えば、記憶領域）にアクセスする。このように、作業項目７０８−２及び７０８−Ｎの両方は、同期ハンドル７１８を含む。一方で、他の作業項目との共有資源にアクセスしない作業項目７０８-３は、同期ハンドル７１８を含まず、特定の共有資源は作業項目の１つ以上により共有される。
【００３６】
１つの実施形態では、同期ハンドル７１８は、文字列トークンであり、指定された相互排除オブジェクト（「ミューテックス」）に類似している。１つの実施形態では、同期フィルタ７２０は、割り当てられた同期ハンドル７１８を有する作業項目に適用される。
【００３７】
一旦、同期ハンドル７１８が割り当てられると、割り当てられた同期ハンドル７１８に基づいて、トークン値が作業項目の各々に対して算出される。作業項目がアクティビティの階層構造（例えば、ツリー構造）の一部である実施形態では、トークン値は、割り当てられた同期ハンドル７１８及びアクティビティの階層における作業項目の位置に基づいて算出される。１つの実施形態では、（図９に示したような）トークンコンポーネントまたはロックマネージャが、同期ハンドル７１８及びアクティビティツリーの作業項目の各々に対する共有資源を監視するかまたは管理する。
【００３８】
次に、算出されたトークン値を有する作業項目は、作業項目の各々と関連する算出されたトークン値に基づいて、同期キュー７１２にソートされる。１つの実施形態では、機能AcquireLockを、ソートするのにかつ共有資源へのアクセスが許されるかどうかを判断するのに用いてもよい。例えば、図７Ａに示したように、算出されたトークン値のため、AcquireLock機能は、同期キュー７１２において作業項目７０８−Ｎに先行する位置に作業項目７０８-２をソートする。
【００３９】
１つの実施形態では、AcquireLock機能は、同じアクティビティに属している全ての同期ハンドル７１８を最初に集めることにより同期キュー７１２の作業項目のソートを実行する。このようにして、デッドロックは生じない。図７Ｂは、本発明の一実施形態によるAcquireLock機能による同期キュー７１２のソーティングを示す図である。例えば、単純化したアクティビティツリー７３２は、ルート／親ノード７２２及び２つの子ノード７２４及び７２６を含み、各々は、作業項目1及び作業項目2をそれぞれ含んでいる。
【００４０】
上記のように、アクティビティツリーの作業項目のいくつかは、同期ハンドルを含むことができない。このように、アクティビティツリーの子／リーフノードのいずれの作業項目も同期ハンドルを有していない場合、AcquireLock機能は、アクティビティツリーの階層構造においてそれ以上進まない。１つの実施形態では、ソーティングの間、AcquireLock機能はまた、同期キュー７１２のいかなるデッドロックも避けるために重複した作業項目を除去する。
【００４１】
アクティビティツリーのノードの移動を続けると、次にAcquireLock機能は、ルートノード７２２などの、アクティビティツリーのルートノードまたは親ノードを識別することを試みる。ルートノードまたは親ノードに遭遇した後に、AcquireLock機能は、ルートノードまたは親ノード７２２に対して集められたハンドルのリストまたは辞書がその子全体に対する全ての同期ハンドル７１８を含むか否かを判断する。
【００４２】
図７Ｂでは、集められたハンドルリスト７２８は、例えば「Ｈ」（同期ハンドルを示す）及び「ＧＬ」（GrantedLocksを示す）などの情報を含む。図示したように、子ノード７２４に割り当てられた同期ハンドル７１８は集められて、ルートノード７２２は子ノード７２４の作業項目1の同期ハンドル７１８（即ち、特定の共有資源にアクセスする許可）の保有者である、ということをリスト７２８は示している。
【００４３】
一方で、リスト７２８はまた、ルートノード７２２が子ノード７２６に対する同期ハンドル７１８を有するが、ルートノード７２２は同期ハンドル７１８の保有者ではない（即ち、ルートノード７２２は、共有資源にアクセスをしない）ということを示す。このようにして、子ノード７２６の作業項目2は待ちリスト７３０に加えられ、AcquireLock機能は、プロセスの別の反復を実行して、ルートノード７２２が子ノード７２６の同期ハンドル７１８を得ることを確実にする。
【００４４】
一旦、AcquireLock機能が上記の説明に従って同期キュー７１２をソートすると、ディスパッチャ７１０は、同期キュー７１２の作業項目（例えば、７０８-２）をディスパッチし、作業項目のアクティビティメソッドまたは機能が処理される実行状態において実行する。このように、作業項目は同期キューから順番に実行され、特定の共有資源に順番にアクセスして、作業項目と関連するスレッドの同期実行を実施する。
【００４５】
ここで図８を参照すると、本発明の実施形態による特定の共有資源にアクセスするアクティビティの同時実行方法を示すフローチャートである。１つの例では、図８に示した方法は、図９に示したコンピュータ読取り可能媒体９００に含まれるコンピュータ実行可能コンポーネントにより実行され得る。例えば、記憶コンポーネント９０２は、符号８０２において複数の作業項目をキュー（例えば、スケジューラキュー）に記憶するかまたは実行する複数の作業項目をキューに入れる。複数の作業項目の１つ以上は、ワークフローのアクティビティと関連し、複数の作業項目の１つ以上は、アクティビティにおいて、ツリー構造または他の階層構造を有する。作業項目の各々はスレッドと関連する。
【００４６】
符号８０４で、同期コンポーネント９０４は、キューの複数の作業項目の各々に同期ハンドルを割り当てる。同期ハンドルは、複数の作業項目によりアクセスされる特定の共有資源を示す。符号８０６で、トークンコンポーネント９０６は、割り当てられた同期ハンドル及びアクティビティのツリー構造の作業項目の位置に基づいて作業項目の各々に対するトークン値を算出する。ソートコンポーネント９０８は、符号８０８で、作業項目の各々と関連するトークン値に基づいて、同期キューの作業項目をソートする。符号８１０で、実行コンポーネント９１０は、同期キューのソートされた作業項目の各々を実行して特定の共有資源へのアクセスをシリアライズ（serialize）して、ワークフローと関連するスレッドの同期実行を実施する。
【００４７】
１つの実施形態では、コンピュータ読取り可能媒体９００には、作業項目の各々に対する同期ハンドルのプロパティを明示して、作業項目の各々に対する割り当てられた同期ハンドルを宣言的に定義する定義コンポーネント９１２をさらに含む。また別の代替的実施形態では、コンピュータ読取り可能媒体９００は、パッシベーションコンポーネント９１４を含み、作業項目及び関連するトークン値を用いて同期キューをデータストアにパッシベートする。
【００４８】
図４のシステム４００などの、例示的なコンピュータシステム環境と関連して説明されたが、本発明の実施形態は、多数の他の一般的な目的または特別な目的のコンピュータシステム環境または構成で動作する。コンピュータシステム環境は、本発明のいかなる態様の使用または機能の範囲に関していかなる限定を提案することも意図していない。さらに、コンピュータシステム環境は、例示的な動作環境において示したコンポーネントのいずれか１つまたは組み合わせに関係するいかなる依存性または要求を有していると解釈されるべきではない。本発明の態様での使用に適した周知のコンピュータシステム、環境及び／または構成の例は、パーソナルコンピュータ、サーバコンピュータ、携帯用デバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能な消費者エレクトロニクス、携帯電話、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境、などを含むが、これらに限定されるものではない。
【００４９】
本発明の実施形態は、１つ以上のコンピュータまたは他のデバイスによって実行される、プログラムモジュールなどの、コンピュータ実行可能命令の一般的なコンテキストで記述されることができる。通常、特定のタスクを実行するかまたは特定の抽象データ型を実行するプログラムモジュールは、ルーチン、プログラム、オブジェクト、コンポーネント及びデータ構造を含むが、これらに限定されるものではない。本発明の態様はまた、通信ネットワークを介してリンクされる遠隔処理装置によってタスクが実行される分散コンピューティング環境において、実施され得る。分散コンピューティング環境では、プログラムモジュールは、メモリ記憶装置を含むローカルのコンピュータ記憶媒体及びリモートのコンピュータ記憶媒体に位置してもよい。
【００５０】
動作中、システム４００は、本発明の態様を実行するために、図７などの図に示したコンピュータ実行可能命令のようなコンピュータ実行可能命令を実行する。
【００５１】
本明細書において図示されて説明された本発明の実施形態の動作の実行または実施の命令は、特に明記しない限り、本質的な特徴ではない。即ち、特に明記しない限り、動作はいかなる順番で実行されてもよく、本発明の実施形態は、本明細書において開示された動作に比べて追加の動作または少ない動作を含んでいてもよい。例えば、別の動作の前に、同時に、または後に、特定の動作を実施するかまたは実行することは、本発明の態様の範囲内であると考えられる。
【００５２】
本発明の実施形態は、コンピュータ実行可能命令で実行されてもよい。コンピュータ実行可能命令は、１つ以上のコンピュータ実行可能コンポーネントまたはコンピュータ実行可能モジュールとされてもよい。本発明の態様は、かかるコンポーネントまたはモジュールの任意の数及び構成で実行されてもよい。例えば、本発明の態様は、本明細書において図示されて説明された特定のコンピュータ実行可能命令または特定のコンポーネントまたは特定のモジュールに限定されない。本発明の他の実施形態は、本明細書において図示されて説明されているより多くのまたは少ない機能性を有する異なるコンピュータ実行可能命令またはコンピュータ実行可能コンポーネントを含んでいてもよい。
【００５３】
本発明または本発明の実施形態の態様の要素を導入する際に、英文における冠詞「a」、「an」、「the」及び「said」、即ち、和文の「１つの」、「その」、「前記」は、要素が１つ以上あることを意味することを意図している。用語「備える」、「含む」、「有する」は、包含していることを意図していて、リストに記載した要素以外の追加の要素があってもよいということを意味する。
【００５４】
本発明の態様が詳細に説明されたが、変更態様及び変化形は添付の請求の範囲において画定された本発明の態様の範囲内において可能であることは明らかである。様々な変更が、本発明の態様の範囲内において、上記の構造、製品及び方法でなされてもよいように、図示する様に、上記の説明に含まれ、添付の図面に示された全ての事柄は、説明のためであって、制限することを意味しないと解釈されるべきである。
【００５５】
付録Ａ（宣言的方法でスレッド全体の共有状態の同期またはインターリービングの例示的な実施を示す、一組の動作SynchronizationScopeを示す。）
【００５６】
2009532756.tif 000003
【００５７】
2009532756.tif 000004
【００５８】
付録Ｂ（アクティビティ階層によるスレッド実行の同期についての例示的な一組のステップを示す。）
【００５９】
また別の例では、以下に、本発明の一実施形態による非同期スレッド実行を実行する例示的なシーケンスを示す。
１) 同期フィルタは、[SupportsSynchronization]属性を有する全てのアクティビティに適用される。
２) RootActivity及び同期範囲の全ては、｛handle,（GrantedLock）｝についての辞書を保持する。各々のGrantedLock構造は、アクティビティ及びWaitListを保持する。GrantedLockはシリアライズすることが可能で、よって辞書であり、両方がパッシベーションを克服することができる。
３) 各々の同期範囲は、その子同期範囲に対するロックマネージャである。ルートアクティビティは、デフォルトのロックマネージャである。ロックマネージャは、子ロック同期範囲に対するロックを許諾して、ロックを得ることができない子同期範囲の待ちリストを保持する責任を負う。
４) 実行（例えば、アクティビティの階層に基づく）についてのＷＦスレッドの階層及びロックマネージャ／同期範囲についての同様の階層が存在する。
５) その実行方法のSynchronizationFilterは、コールバックで通っているAcquireLocksを呼び出す。
６) AcquireLockが真に戻る場合、アクティビティ実行は進む。そうでなければ、アクティビティ実行はExecuting状態のままである。
７) AcquireLockの範囲内で：
a. アクティビティは、それ自体及び*all*のその子に対する同期ハンドルを集める。いずれかの子が同期ハンドルを有していない場合、さらに階層内でさらに進むのをやめる。次にそれは、重複を除去して、全てのハンドルをソートする。このことは、いかなるデッドロックも避けるためである。
b. ハンドルがない場合、AcquireLockは真に戻る。同期範囲の実行は、それが何にも同期していないので（ノーオペレーション命令）、進むことができる。
c. AcquireLockは、同期範囲である親を探してまたはルートを見つけるまで親階層を進み続ける。各々のステップで同期範囲の親に出会うと、集めたハンドルの各々に対して、親のgrantedlocks辞書がハンドルを有するか否かを調べる。有していない場合には、ロックが与えられた所定のハンドルに対するアクティビティとしてそれ自体を追加する。すでにハンドルを有していて、保有者でない場合、それ自体を待ちリストに加える。それが待ちリストのうちの１つに少なくとも加えられたいずれのポイントでも、AcquireLockは偽に戻る。いずれかの同期範囲親がハンドルの空でないリストを有する場合、親はすでに全てのロックを得たのでブレークして真に戻る。親の同期フィルタは常に子供の前に実行されることを思い出しなさい。
８) 同期フィルタは、アクティビティを完了状態に予約する。一旦完了状態に進むと、フィルタはReleaseLockを呼び出す。
９) ReleaseLockの範囲内で：
a. 各々のステップについて、各々のハンドルに対して親チェーンを進み、所定のハンドルで待っているアクティビティを集める。
b. 全ての待ちアクティビティに対して、再度ロックを得ることを試みる。ロックを得ることができるものに対して、フィルタのコールバックを呼び出す。
【図面の簡単な説明】
【００６０】
【図１】既存のプログラミングパラダイムを示すブロック図である。
【図２】本発明の一実施形態によるワークフローデザインフレームワークの仮想化を示す例示的なブロック図である。
【図３】本発明の一実施形態による例示的なワークフローを示す例示的な図である。
【図４】本発明の一実施形態によるワークフローアクティビティを処理するシステムを示す図である。
【図５】本発明の一実施形態によるワークフローアクティビティの階層構造を示す図である。
【図６】本発明の一実施形態によるアクティビティと関連する作業項目の処理状態を記述する例示的な状態オートマトンを示す図である。
【図７Ａ】本発明の一実施形態によるワークフローのアクティビティの作業項目の同期実行を示すブロック図である。
【図７Ｂ】本発明の一実施形態による同期キューのソーティングを示す図である。
【図８】本発明の一実施形態による特定の共有資源にアクセスするアクティビティを同期実行する方法を示すフローチャートである。
【図９】本発明の態様を記憶し得る例示的なコンピュータ読取り可能媒体を示すブロック図である。
【図１】
2009532756.tif 000005
【図２】
2009532756.tif 000006
【図３】
2009532756.tif 000007
【図４】
2009532756.tif 000008
【図５】
2009532756.tif 000009
【図６】
2009532756.tif 000010
【図７Ａ】
2009532756.tif 000011
【図７Ｂ】
2009532756.tif 000012
【図８】
2009532756.tif 000013
【図９】
2009532756.tif 000014
【国際調査報告】
2009532756.tif 000015
2009532756.tif 000016