説明

並列処理によりデータ処理を行う印刷装置および制御方法

【課題】PC等から取得した描画コマンドを中間言語に変換する処理を並列処理にて実行し、処理の高速化を図る。
【解決手段】ページ記述言語で記述された描画コマンドおよび印刷データを取得し、中間言語コードに変換する中間言語コード生成部120と、この中間言語コード生成部120により生成された中間言語コードを処理してラスタ・データを生成する中間言語処理部130と、この中間言語処理部130により生成されたラスタ・データに基づいて印刷処理を行う印刷機構200とを備える。この中間言語コード生成部120は、描画コマンドを、画像を指定する描画オペレータと画像を描画するための設定を指定するグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って中間言語コードを生成する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、描画コマンドおよび印刷データから中間言語コードを生成し、中間言語コードからラスタ・データを生成して印刷出力を行う印刷装置および制御方法に関する。
【背景技術】
【0002】
印刷装置(プリンタ)や印刷機能を備えた複合機(Multifunction peripheral)は、ハードウェア性能の向上等によって、印刷を行うエンジンにおいても、印刷データ等のデータ処理においても、相当の高速化が図られている。しかし、事務用途などでは、大量部数の印刷ジョブが実行される機会も多く、さらなる高速化が望まれている。
【0003】
データ処理を高速化するための手段としては、CPUの高速化、マルチプロセッサやマルチコア・プロセッサを用いて実現される並列処理による高速化などが考えられる。並列処理においては、並列に実行する処理の選択、処理単位の設定および割り当てが、処理速度の向上のために、非常に重要である。
【0004】
印刷装置の描画処理は、通常、次の2ステップで実行される。
(1)PC等から取得した描画コマンドを中間言語に変換するステップ
(2)中間言語を最終的な描画データ(ラスタ・データ)に変換するステップ
特許文献1に記載の技術は、フレームバッファへの描画の順序を保証しながら、高速処理を実現し、最終的な出力データを得るものである。上記(2)のステップに関する並列処理の技術である。
【0005】
特許文献2に記載の技術は、画像データの位置や画素値に依存する画像処理か否かに基づいて並列処理可能か否かを判断し、判断結果に応じてハードウェアを再構成して、並列処理にて画像処理を実行するものである。上記(1)、(2)のステップに関わらず、PDL(ページ記述言語)で記述されたデータから描画データを作成する処理全体を対象とする技術である。
【0006】
特許文献3に記載の技術は、複数の送信元から送信された印刷データを個別に並列処理し、個別の中間言語データに変換して、1ページ単位で、中間言語データが得られたものから順に画像を印刷するものである。上記(1)のステップに関して、ジョブ単位で並列処理を行う技術である。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開平8−154171号公報
【特許文献2】特開平10−337932号公報
【特許文献3】特開平10−100512号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
上記の印刷装置の描画処理における2つのステップのうち、(1)のステップの処理は、描画コマンドの順序における前後のコマンドの依存度が高いため、並列処理にて実現することが容易ではない。上記特許文献1の技術は、(2)のステップの処理を対象として並列処理を行っており、(1)のステップの処理の並列化は考慮されていない。上記特許文献2の技術は、PDLで記述されたデータから描画データを作成する処理全体を対象としており、(1)のステップに対応する部分も含まれているが、実現のために特別のハードウェアを必要としており、コストの増大を招来する。上記特許文献3の技術は、(1)のステップを対象としているが、複数のジョブの実行要求がなされた場合に、これらを並列に実行するものであり、適用できる状況が極めて限定されている。
【0009】
本発明は、上記(1)のステップの処理である、PC等から取得した描画コマンドを中間言語に変換する処理を対象として、1つ以上のジョブにおけるコマンドを並列処理にて実行することにより、処理の高速化を図ることを目的とする。
【課題を解決するための手段】
【0010】
上記の目的を達成するため、本発明は、次のような装置として構成される。この装置は、ページ記述言語で記述された描画コマンドおよび印刷データを取得し、中間言語コードに変換する中間言語生成部と、この中間言語生成部により生成された中間言語コードを処理してラスタ・データを生成する中間言語処理部と、この中間言語処理部により生成されたラスタ・データに基づいて印刷処理を行う印刷機構とを備える。この中間言語生成部は、描画コマンドを、描画オペレータとグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って中間言語コードを生成する。
【0011】
より詳細には、中間言語生成部は、連続する2つのブロックに関して、後のブロックにおけるグラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、後のブロックにおける先頭の描画オペレータが座標を引数に持つオペレータでない場合に、この2つのブロックを分割せずに逐次処理し、その他の場合には、この2つのブロックを分割して並列処理する。
また、中間言語生成部は、1つのブロックのオペレータを処理する場合に、このブロックに先行するブロックにおけるグラフィック・ステート・オペレータを処理した後に、このブロックのオペレータを処理する。
【0012】
また、好ましくは、中間言語生成部は、並列処理される複数のブロックのうち、特定のブロックの処理に要する時間が他の連続する複数のブロックの処理に要する時間よりも長いと推定される場合、当該他の連続する複数のブロックを分割せずに逐次処理する。
さらに好ましくは、中間言語生成部は、複数のブロックを並列処理するために必要と推定されるメモリ使用量が物理メモリの空き容量を基準とする閾値よりも大きい場合に、並列処理を行うブロック数を減らす。
さらに詳細には、中間言語生成部は、並列処理により生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を生成する。そして中間言語処理部は、対応情報に基づき、元の描画コマンドの順番で中間言語コードを処理する。
【0013】
また、本発明は、印刷装置の制御装置としても実現される。この装置は、ページ記述言語で記述された描画コマンドおよび印刷データを取得し、中間言語コードに変換する中間言語生成部と、この中間言語生成部により生成された中間言語コードを、印刷処理に用いるラスタ・データに変換する中間言語処理部とを備える。この中間言語生成部は、描画コマンドを、描画オペレータとグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って中間言語コードを生成する。
【0014】
また、本発明は、印刷装置の制御方法としても実現される。この方法は、ページ記述言語で記述された描画コマンドおよび印刷データを取得するステップと、取得した描画コマンドおよび印刷データを中間言語コードに変換するステップと、生成された中間言語コードを処理してラスタ・データを生成するステップと、生成されたラスタ・データに基づいて印刷機構を制御し、印刷処理を行うステップとを含む。中間言語コードに変換するステップは、描画コマンドを、描画オペレータとグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割するステップと、分割されたブロックごとに並列処理を行って中間言語コードを生成するステップと、を含む。
【0015】
さらに本発明は、コンピュータを制御して上記の制御装置の機能を実現するプログラム、あるいは、コンピュータに上記の制御方法の各ステップに対応する処理を実行させるプログラムとしても実現される。
【発明の効果】
【0016】
以上のように構成された本発明によれば、PC等から取得した描画コマンドを中間言語に変換する処理を対象として、1つ以上のジョブにおけるコマンドを並列処理にて実行することが可能となり、処理の高速化を図ることができる。
【図面の簡単な説明】
【0017】
【図1】本実施形態の印刷装置の構成例を示す図である。
【図2】描画コマンドの構成例を示す図である。
【図3】本実施形態の制御部の機能構成を示す図である。
【図4】本実施形態における描画コマンドにおけるブロックの構成例を示す図である。
【図5】メモリ使用量を考慮したブロックの割り当ての手順の概略を示すフローチャートである。
【図6】図4に示した描画コマンドにおけるオペレータごとの必要メモリ・サイズと、ブロックごとの予想メモリ使用量とを示す図である。
【図7】本実施形態のポインタ・テーブルの構成例を示す図である。
【図8−1】本実施形態の制御部の動作の全体的な流れを示すフローチャートである。
【図8−2】本実施形態の制御部の動作の全体的な流れを示すフローチャートである。
【図9】図8−1のステップ802、804、808、812に示す、1ブロック読み込み処理の手順を示すフローチャートである。
【図10】図9のステップ901に示す、描画オペレータ受信処理の手順を示すフローチャートである。
【図11】図9のステップ903に示す、GSオペレータ受信処理の手順を示すフローチャートである。
【図12】図9のステップ905に示す、分割位置チェック処理の手順を示すフローチャートである。
【図13】図8−1のステップ803、805、809、813に示す、メモリ使用量予想処理の手順を示すフローチャートである。
【図14】本実施形態の使用メモリ予想テーブルの構成例を示す図である。
【図15】図8−2のステップ831に示す、中間言語描画処理の手順を示すフローチャートである。
【発明を実施するための形態】
【0018】
以下、添付図面を参照して、本発明の実施形態について詳細に説明する。
<システム構成>
図1は、本実施形態の印刷装置の構成例を示す図である。
図1に示すように、本実施形態の印刷装置は、装置の動作制御を行う制御部100と、トナーやインク等の画像形成材を用いて印刷媒体である用紙等に画像を形成する印刷機構200と、パーソナル・コンピュータ等の外部装置とデータ交換を行うためのI/Oインターフェイス300とを備える。
【0019】
制御部100は、CPU、CPUが実行するプログラムを格納したROM、作業用メモリであるRAM等で実現される。本実施形態の制御部100は、CPUを複数設けたマルチプロセッサとする。この制御部100は、予めインストールされたプログラムおよび各種設定に基づき、印刷機構200の動作制御、I/Oインターフェイス300を介して行われるデータ交換等、各種処理の制御を行う。また、制御部100は、I/Oインターフェイス300を介して受信した描画コマンドおよび印刷データに基づき印刷画像を生成する画像処理を行う。
【0020】
印刷機構200は、制御部100により生成された文書画像を、トナーやインク等の画像形成材を用いて、用紙等の印刷媒体上に形成(印刷)する。本実施形態では、印刷方式については限定しない。すなわち、電子写真方式や、インクジェット方式、サーマル方式等、種々の方式の印刷手段により本実施形態の印刷機構200を構成し得る。
【0021】
I/Oインターフェイス300は、ネットワーク等を介して、パーソナル・コンピュータ等の外部装置と接続する。そして、接続された外部装置から、PCL−XL等のPDL(Page Description Language, ページ記述言語)で記述された描画コマンドおよび印刷データを受信し、制御部100へ送る。
【0022】
<描画コマンドの構成>
ここで、描画コマンドの構成について説明する。本実施形態で扱われる描画コマンドは、PCL−XL等の既存のPDLで記述されており、本実施形態のための特殊な構成は有していない。
図2は、描画コマンドの構成例を示す図である。図2(a)は、1つのジョブを構成する描画コマンド全体の構成の概略を示し、図2(b)は、1ページ分の描画コマンドの構成を示している。
【0023】
図2(a)に示すように、描画コマンドは、ストリーム・ヘッダ(Stream Header)とストリーム・ボディ(Stream Body)とで構成される。ストリーム・ボディは、セッション(Session)ごとに区分されており、各セッションはページ(Page)ごとに区分されている。
【0024】
図2(b)に示すように、各ページの描画コマンドは、スタート・ページ(Start Page)、描画オペレータ、グラフィック・ステート(GS)オペレータ、エンド・ページ(End Page)というコマンドで構成されている。スタート・ページは、ページの初期設定を行うためのコマンドである。描画オペレータおよびGSオペレータは、描画を行うためのコマンドである。エンド・ページ(End Page)は、ページの終端を示すコマンドである。以下、描画コマンドを構成する個々のコマンドを、コマンド群全体を示す「描画コマンド」と区別するため、「オペレータ」と呼ぶ。なお、「オペレータ」はPCL−XLで用いられる用語であるが、本実施形態の適用対象は、PCL−XLのみに限定されない。ここでは単に、コマンド群全体と個々のコマンドとを区別するために、文言上、呼び分けるに過ぎない。
【0025】
描画を行うためのオペレータのうち、描画オペレータは、線、図形、テキスト等の具体的な描画の内容(画像)を指定するオペレータである。また、描画オペレータ以外のオペレータをまとめてグラフィック・ステート(GS)オペレータと呼ぶ。このGSオペレータには、グラフィック・ステートと呼ばれる、描画するための設定(ペン、ブラシ、テキストのフォント等)を指定するオペレータが含まれる。
【0026】
上記の各ページの描画コマンドのうち、GSオペレータと描画オペレータとの組によって描画内容が記述される。本実施形態では、このGSオペレータと描画オペレータの組をブロックとして、このブロック単位で複数のCPUへの割り当てを行い、描画コマンドの並列処理を実行する。並列処理を行うためのブロックの分割および各CPUへの割り当ての手順については、後述する。
【0027】
<制御部100の機能構成>
図3は、制御部100の機能構成を示す図である。
図3に示すように、制御部100は、データ解読部110と、中間言語コード生成部120と、中間言語処理部130と、印刷制御部140とを備える。これらの各機能は、例えば、ROMに格納されたプログラムをCPUが読み込んで実行することにより実現される。メモリ150は、例えば上述したRAMで実現され、データ受信バッファ、中間言語用バッファ、ラスタ・データ用バッファ、として使用される。また本実施形態において、メモリ150のその他の作業領域(ワーク・エリア)には、後述するポインタ・テーブル151が保持される。さらに、ROM160には、後述する使用メモリ予想テーブル161が保持される。
【0028】
データ解読部110は、I/Oインターフェイス300を介して受信され、データ受信バッファ(メモリ150)に保持された描画コマンドを解読し、個々のオペレータの列に分解する。そして、データ解読部110は、個々のオペレータ・レベルに分解された描画コマンドを中間言語コード生成部120に送る。
【0029】
中間言語コード生成部120は、データ解読部110から描画コマンドを受け取り、並列処理が可能なオペレータの組であるブロックごとに分ける。そして、各ブロックを複数のCPUに割り当て、各CPUで割り当てられたブロックのオペレータから中間言語によるコード列(以下、中間言語コード)を生成する。生成された中間言語コードは、中間言語用バッファ(メモリ150)に格納される。描画コマンドをブロック化し、CPUに割り当てる処理の詳細については後述する。個々のブロックのオペレータから中間言語コードを生成する処理は、既存の印刷装置における中間言語を生成する処理と同様である。ただし、本実施形態では、中間言語コードは、並列処理により生成されるため、ブロックごとに分割されている。そこで、中間言語コード生成部120は、元の描画コマンドにおける各ブロックの順番を管理するためのポインタ・テーブル151を作成し、メモリ150に格納する。ポインタ・テーブル151の詳細については後述する。
【0030】
中間言語処理部130は、ポインタ・テーブル151により指定された順番で中間言語用バッファから中間言語コードを読み出し、ラスタ・データに変換する。生成されたラスタ・データは、ラスタ・データ用バッファ(メモリ150)に格納される。
【0031】
印刷制御部140は、ラスタ・データ用バッファからラスタ・データを読み出す。そして、印刷機構200を制御し、用紙等の印刷媒体上に、読み出したラスタ・データに基づく画像を形成する。
【0032】
<中間言語コード生成部120の動作>
次に、中間言語コード生成部120による処理の並列化について詳細に説明する。
図4は、描画コマンドにおけるブロックの構成例を示す図である。
図4に示すように、描画コマンドにおいて、連続する1対のGSオペレータと描画オペレータによってブロックが構成されている。図4の例では、4つのブロック(第1ブロック〜第4ブロック)が記載されている。第1ブロックはGSオペレータGS1および描画オペレータD1で、第2ブロックはGSオペレータGS2および描画オペレータD2で、第3ブロックはGSオペレータGS3および描画オペレータD3で、第4ブロックはGSオペレータGS4および描画オペレータD4で、それぞれ構成されている。
【0033】
中間言語コード生成部120は、原則として、描画コマンドを上記のブロック単位に分割する。そして、このブロックごとに、中間言語コードを生成する処理を各CPUに割り当てて並列処理を行う。しかし、描画オペレータの多くは、直前のオペレータ終了時点の座標値を使用する。このようなオペレータは、並列に処理することができず、シーケンシャルに処理しなければならない。そこで、本実施形態の中間言語コード生成部120は、座標値の設定箇所に着目し、座標を新規に設定している箇所を分割位置として、描画コマンドを分割する。以下、描画コマンドの分割方法を詳細に説明する。
【0034】
まず、ブロック単位の分割について説明する。描画コマンドがブロックごとに分割された場合、異なるブロックの描画オペレータは、並列に処理される。ただし、上述したように、描画するための座標の設定に関しては以前のオペレータの実行結果に依存するため、各CPUが各ブロックの描画オペレータを実行する場合に、実行しようとするブロックよりも前のブロックのGSオペレータを全て実行する必要がある。例えば、図4に示した描画コマンドを4個のCPUで並列処理する場合を考える。このとき、描画オペレータD1を実行するCPUは、GSオペレータGS1を実行する。また、描画オペレータD2を実行するCPUは、GSオペレータGS1、GS2を実行する。また、描画オペレータD3を実行するCPUは、GSオペレータGS1、GS2、GS3を実行する。また、描画オペレータD4を実行するCPUは、GSオペレータGS1、GS2、GS3、GS4を全て実行する。
【0035】
ここで、図4の描画コマンドに関して、上記のように並列処理する場合と、単一のCPUで逐次処理する場合とにおける処理ステップ数を比較する。なお、図示の通り、GSオペレータGS1を実行する場合の処理ステップ数は4、描画オペレータD1を実行する場合の処理ステップ数は3、GSオペレータGS2を実行する場合の処理ステップ数は6、描画オペレータD2を実行する場合の処理ステップ数は16、GSオペレータGS3を実行する場合の処理ステップ数は2、描画オペレータD3を実行する場合の処理ステップ数は4、GSオペレータGS4を実行する場合の処理ステップ数は2、描画オペレータD4を実行する場合の処理ステップ数は10である。
【0036】
4個のCPUで並列処理の場合、描画コマンドD1を実行するCPUでは、処理ステップ数が7(=GS1+D1)である。描画コマンドD2を実行するCPUでは、処理ステップ数が26(=GS1+GS2+D2)である。描画コマンドD3を実行するCPUでは、処理ステップ数が16(=GS1+GS2+GS3+D3)である。描画コマンドD4を実行するCPUでは、処理ステップ数が24(=GS1+GS2+GS3+GS4+D4)である。したがって、上記のうちで最大の処理ステップ数26が、図4の描画コマンドを並列処理する場合の処理ステップ数となる。
【0037】
一方、逐次処理する場合、GSオペレータGS1〜GS4および描画オペレータD1〜D4を実行する場合の処理ステップ数を単純に加算することになるので、47である。したがって、4個のCPUで並列処理する方が、各CPUにおいて処理対象のブロック以前の全てのブロックにおけるGSオペレータを実行するとしても、逐次処理よりも少ない処理ステップ数で完了する。なお、ここでは単純に処理ステップ数のみを比較したが、実際の処理においては、GSオペレータより描画オペレータの方が、個々のオペレータの処理に要する時間が長い。そのため、並列処理する場合の処理に要する時間の短縮は、さらに顕著である。
【0038】
さて、上記のようにして、全てのブロックを並列処理することが望ましいが、描画オペレータが他のブロックにおける描画オペレータの実行結果に依存するために、その2つのブロックを並列処理できない場合がある。この場合、上述したブロックごとの分割位置を修正し、並列処理できない複数のブロックをまとめて1個のCPUに割り当てる必要がある。このような観点からブロックを並列処理できるか否かを判断するため、本実施形態では、ブロックを構成するGSオペレータおよび描画オペレータを、完結型描画オペレータ、通常描画オペレータ、座標設定GSオペレータ、通常GSオペレータの4つの種類に分類する。
【0039】
完結型描画オペレータは、描画オペレータのうち、座標をオペレータのオペランド(引数)に与えるものである。直前のオペレータの処理には依存しない。例えば、PCL−XLでは、Pie、Rectangle、RoundRectangle、Chord、Ellipse等の描画オペレータが該当する。
【0040】
通常描画オペレータは、完結型描画オペレータではない通常の描画オペレータである。座標値は、「オペレータ実行直前の値」を用いる。そのため、直前のオペレータの処理が終了をするまで次の描画オペレータは実行できない。
【0041】
座標設定GSオペレータは、GSオペレータのうち、座標を設定しているものである。例えば、PCL−XLでは、NewPath、SetCursor等のGSオペレータが該当する。
【0042】
通常GSオペレータは、座標設定GSオペレータ以外の全てのGSオペレータである。すなわち、通常GSオペレータによって、座標以外の種々の設定が行われる。
【0043】
図4に示した描画コマンドにおいて、例えば、GSオペレータGS2に上記の座標設定GSオペレータが存在せず、かつ描画オペレータD2の先頭が上記の完結型描画オペレータでない場合を考える。この場合、描画オペレータD2の先頭のオペレータによる描画開始座標は、GSオペレータGS1、描画オペレータD1、GSオペレータGS2の全てに依存する。すなわち、描画オペレータD2による描画は、描画オペレータD1による描画が終わった後でなければ実行できず、これらを並列処理することはできない。したがって、この場合、中間言語コード生成部120は、第1ブロックと第2ブロックをまとめて1個のCPUに割り当てる。CPUは、この第1ブロックと第2ブロックのオペレータをシーケンシャルに実行する。分割位置が修正されて、複数のブロックが1個のCPUに割り当てられた場合は、その後の処理において、この1個のCPUに同時に割り当てられた複数のブロックを1ブロックとして扱って良い。
【0044】
<処理に要する時間を考慮したオペレータの割り当ての改善方法>
上記のようにして、ページごとの中間言語コードの生成を並列処理にて行うことが可能となった。以下、オペレータの割り当てを改善し、中間言語コードの生成処理をさらに効率良く実行する方法を考える。
【0045】
まず、処理に要する時間を考慮して、ブロックをCPUに割り当てる方法を説明する。
実際の処理において、GSオペレータより描画オペレータの方が、個々のオペレータの処理に要する時間が長いことを上述した。そこで、本実施形態は、ブロックにおけるオペレータの種類に基づいて処理に要する時間を予想し、処理時間が増加しない範囲で、処理の並列化を緩和する。
【0046】
個々のオペレータの実行に要する時間は、同じ種類のオペレータであれば、完全に同一ではないが、それほど大きく変わらない。そこで、オペレータの種類ごとに予め平均処理時間を測定し、処理時間テーブルを作成しておく。この処理時間テーブルは、予めROM160に保存しておく。中間言語コード生成部120は、データ解読部110により解読された個々のオペレータに関して、この処理時間テーブルを参照して平均処理時間を求め、ブロックの予想処理時間を計算する(ブロック内のオペレータの平均処理時間を加算する)。
【0047】
図4に示した描画コマンドで、上述したように、第1ブロックと第2ブロックを1個のCPUに割り当てた場合を考える。この場合、この2つのブロック(以下、第1〜第2ブロックと記す)のオペレータを実行するために要する予想処理時間は、第3ブロックおよび第4ブロックの各々の予想処理時間と比べて非常に長くなる。そこで、第3ブロックの予想処理時間と第4ブロックの予想処理時間の合計が、第1〜第2ブロックの予想処理時間よりも長い場合は、第3ブロックと第4ブロックをまとめて、1個のCPUに割り当てる。このようにすれば、全体の予想処理時間を増やすことなく、第1ブロックから第4ブロックまでを2個のCPUに割り当てることができた。4個のCPUを持つ制御部100であれば、2個のCPUが余るので、これらのCPUを用いて当該ページの後続のブロックや後続のページのブロックを割り当てて処理させることができる。
【0048】
<メモリの使用量を考慮したオペレータの割り当ての改善方法>
次に、中間言語コード生成部120が処理を行う際のメモリ使用量を考慮して、ブロックをCPUに割り当てる方法を説明する。
描画コマンドのオペレータを中間言語コードに変換する処理自体は、上記のように複数のCPUに割り当てて並列処理することにより、処理に要する時間を短縮することが可能である。しかし、処理に要するメモリ・サイズが制御部100のメモリ150の空き容量を超える場合、メモリ150に記憶されているデータを圧縮したり、磁気ディスク等へ退避させたりすることにより空き領域を拡大しなければならない。この空き領域を拡大する処理を行うことにより、中間言語コード生成部120の処理効率が低下する。そこで、本実施形態は、中間言語コード生成部120の処理に要するメモリ・サイズを予測し、このメモリ・サイズがメモリ150の空き容量を超えないように、CPUへのブロックの割り当てを行うこととする。
【0049】
ブロックのうち、GSオペレータが記載された部分は、記載されたGSオペレータの数に関わらず、メモリ使用量の最大値(上限)は固定である。これは、GSオペレータに関しては、メモリ使用量は、その構造体のサイズにより定まるためである。したがって、GSオペレータ部分のメモリ使用量は正確に計算することができる。
【0050】
一方、描画オペレータが記載された部分は、記載された描画オペレータの数に応じて必要なメモリ・サイズが変わる(オペレータの数が増えると必要なメモリ・サイズも増加する)。また、オペレータの種類によって実行に必要なメモリ・サイズが異なる。同じ種類のオペレータの必要メモリ・サイズは、完全に同一ではないが、それほど大きく変わらない。そこで、オペレータの種類ごとに必要メモリ・サイズの平均値を算出し、使用メモリ予想テーブル161を作成しておく、この使用メモリ予想テーブル161は、予めROM160に保存しておく。中間言語コード生成部120は、データ解読部110により解読された個々のオペレータに関して、使用メモリ予想テーブル161を参照して必要メモリ・サイズの平均値を求め、ブロックの描画オペレータ部分のメモリ使用量を計算する(ブロック内の各描画オペレータに関して、実行に必要なメモリ・サイズの平均値を加算する)。この描画オペレータ部分のメモリ使用量と上記GSオペレータ部分のメモリ使用量とを加算して、ブロックの予想メモリ使用量が得られる。なお、GSオペレータ部分のメモリ使用量は、描画オペレータの必要メモリ・サイズと共に使用メモリ予想テーブル161に保持させておいても良い。
【0051】
図5は、メモリ使用量を考慮したブロックの割り当ての手順の概略を示すフローチャートである。
まず、中間言語コード生成部120は、割り当ての対象として、n個のブロックに着目する(ステップ501)。ここで、nはCPUの数である。n個のブロックの先頭から順に、第1ブロック、第2ブロック、・・・、第nブロックとする。次に、中間言語コード生成部120は、使用メモリ予想テーブル161を参照し、各ブロックの予想メモリ使用量を算出する(ステップ502)。
【0052】
次に、中間言語コード生成部120は、各ブロックの予想メモリ使用量を第1ブロックから順に加算し(ステップ503)、

式(1):
(現在のメモリ残量)×0.8≧(m個のブロックの予想メモリ使用量の合計)

を満たす最大のmを求める(ステップ504)。すなわち、並列処理が可能な予想メモリ使用量の閾値として、現在のメモリ残量を基準とする動的な値(この例では0.8を乗じた値)が設定される。ここで、メモリ残量とは、メモリ150の空き容量である。また、m≦nである。メモリが十分ある場合はm=nとなる。予想メモリ使用量の合計が最大のときでもメモリ残量に余裕を持たせるために、メモリ残量に0.8を乗じている。この予想メモリ使用量の閾値を設定するための、メモリ残量に乗ずる値は自由に設定して良い。例えば、メモリ不足に対応するための処理(オーバーヘッド)を頻繁に起こさないようにするためには、値を小さくすれば良い。
【0053】
この後、求めたmの値に基づき、m個のブロックをm個のCPUに割り当て(ステップ505)、並列処理にて中間言語コードを生成する処理を実行する。そして、後続のブロックに着目し(ステップ506)、処理中のページを構成するブロックを全て処理するまで、ステップ501以降の処理を繰り返す(ステップ507)。
【0054】
図4に示した描画コマンドを例として、メモリ使用量を考慮したブロックの割り当てについて具体的に説明する。
図6は、図4に示した描画コマンドにおけるオペレータごとの必要メモリ・サイズと、ブロックごとの予想メモリ使用量とを示す図である。なお、図6に示すメモリ・サイズの値は、各オペレータ間の相対的な値を示しており、特定の単位(バイト等)を示すものではない。
【0055】
図6に示す例では、GSオペレータ部分のメモリ使用量を100としている。各描画オペレータの必要メモリ・サイズの値は、上記の使用メモリ予想テーブル161を参照して得られた値である。各オペレータの必要メモリ・サイズを加算して得られる、各ブロックの予想メモリ使用量は、第1ブロックが1120、第2ブロックが820、第3ブロックが160、第4ブロックが1520である。したがって、第1ブロックから第4ブロックまでの予想メモリ使用量の合計は3620、第1ブロックから第3ブロックまでの予想メモリ使用量の合計は2100である。
【0056】
ここで、メモリ150の空き容量が3000であるとする。すると、

3000×0.8<3620

で、第1ブロックから第4ブロックまでの予想メモリ使用量の合計は、メモリ150の空き容量を超えてしまう。一方、

3000×0.8>2100

で、第1ブロックから第3ブロックまでの予想メモリ使用量の合計は、メモリ150の空き容量以内に収まる。したがって、メモリ不足に対応するための処理(オーバーヘッド)を回避するためには、第1ブロックから第3ブロックまでを3個のCPUに割り当てて、並列処理を行う。このとき、1個のCPUはアイドル状態となり、次のブロックが割り当てられるのを待つ。
【0057】
<ポインタ・テーブル>
以上のようにして、描画コマンドの各ページを構成するブロックが複数のCPUに割り当てられ、並列処理にて中間言語コードが生成される。生成された中間言語コードは、中間言語用バッファ(メモリ150)に格納される。ここで、中間言語コードは、上記のようにブロックごとの並列処理により生成されるため、ブロックごとに分割されている。そこで、本実施形態では、中間言語コード生成部120は、元の描画コマンドにおける各ブロックの順番を管理するためのポインタ・テーブル151を作成する。すなわち、ポインタ・テーブル151は、並列処理により同時に生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を保持する。
【0058】
ポインタ・テーブル151は、上記の手順で生成したブロックごとの中間言語コードと共に、中間言語バッファ(メモリ150)に格納される。なお、実際には、上記のように描画コマンドの分割位置が修正されて1個のCPUに複数のブロックが割り当てられている場合があるが、この場合は、1個のCPUに割り当てられたブロック全体で1ブロックとしてポインタ・テーブル151に登録される。
【0059】
図7は、ポインタ・テーブル151の構成例を示す図である。
図7に示すように、ポインタ・テーブル151は、通し番号とブロックごとの中間言語コード群へのポインタとを関連づけている。この通し番号を各中間言語コードの元の描画コマンドにおける順番に対応づけて、テーブルにポインタを登録する。このようにすれば、中間言語処理部130は、ポインタ・テーブル151の通し番号順に、ポインタにて指定される中間言語コード群を中間言語用バッファから読み出すことで、元の描画コマンドにおける順番通りに中間言語コードを取得することができる。
【0060】
<制御部100の動作の流れ>
次に、制御部100の動作の全体的な流れを説明する。
図8−1、2は、制御部100の動作の全体的な流れを示すフローチャートである。
ここでは、並列処理を行うCPUが4個である場合を例として説明する。また、図8−1、2には、印刷対象の描画コマンドのうち、1ページ分の描画コマンドを処理して印刷出力する動作が示されている。なお、ストリーム・ヘッダや、各ページのスタート・ページに基づく処理は、既存の印刷装置の制御手段による処理と同様であるため、説明を省略している。
【0061】
制御部100の中間言語コード生成部120は、まず変数BLOCKNUMおよび変数CPU_Nを初期化する(ステップ801)。ここで、変数BLOCKNUMは、現在処理中のブロックの通し番号を保存する変数である。また、変数CPU_Nは、いくつのCPUが使用されたか、言い換えれば、いくつのブロックが中間言語用バッファに書き込まれたか、を示す変数である。このCPU_Nは、全てのCPUから共通にアクセスできる1つの変数である。
【0062】
次に、制御部100の中間言語コード生成部120は、現在の処理対象となっているページの先頭のブロックから順に、データ解読部110を介してデータ受信バッファ(メモリ150)に保持されている描画コマンドのオペレータを読み込んで、CPUへの割り当てを行う。本動作例では、CPUを4個としているので、最大で4ブロック分の描画コマンドを並列処理することができる。そこで、最大で4ブロック分の描画コマンドを順次読み込んで、処理を行う。以下、1サイクルの処理で中間言語コード生成部120が読み込み得る4ブロックを、順に、ブロック#1、ブロック#2、ブロック#3、ブロック#4とする。また、制御部100を構成する4個のCPUを、CPU101、CPU102、CPU103、CPU104とする。
【0063】
図8−1を参照すると、中間言語コード生成部120は、まず1ブロック読み込み処理によりブロック#1を読み込む(ステップ802)。そして、読み込んだブロック#1に関してメモリ使用量予想処理を行う(ステップ803)。1ブロック読み込み処理およびメモリ使用量予想処理の詳細な手順については後述する。
【0064】
次に、中間言語コード生成部120は、1ブロック読み込み処理によりブロック#2を読み込み(ステップ804)、続いて、読み込んだブロック#2に関してメモリ使用量予想処理を行う(ステップ805)。そして、中間言語コード生成部120は、ブロック#1、#2の予想メモリ使用量の合計が、図5を参照して説明した式(1)を満たすか否かを判断する。ここで、ステップ802およびステップ804で2つのブロックが読み込まれているので、式(1)におけるmの値は2である。ブロック#1、#2の予想メモリ使用量の合計が式(1)を満たさない場合(ステップ806でNo)、中間言語コード生成部120は、ステップ804で読み込んだブロック#2のデータをデータ受信バッファに戻す(ステップ807)。これ以降、このサイクルでは、中間言語コード生成部120は、1ブロック(ブロック#1)を対象として処理を行う。
【0065】
ブロック#1、#2の予想メモリ使用量の合計が式(1)を満たす場合(ステップ806でYes)、次に、中間言語コード生成部120は、1ブロック読み込み処理によりブロック#3を読み込み(ステップ808)、続いて、読み込んだブロック#3に関してメモリ使用量予想処理を行う(ステップ809)。そして、中間言語コード生成部120は、ブロック#1〜#3の予想メモリ使用量の合計が、図5を参照して説明した式(1)を満たすか否かを判断する。ここでは、ステップ808で、さらに1ブロックが読み込まれているので、式(1)におけるmの値は3である。ブロック#1〜#3の予想メモリ使用量の合計が式(1)を満たさない場合(ステップ810でNo)、中間言語コード生成部120は、ステップ808で読み込んだブロック#3のデータをデータ受信バッファに戻す(ステップ811)。これ以降、このサイクルでは、中間言語コード生成部120は、2ブロック(ブロック#1、#2)を対象として処理を行う。
【0066】
ブロック#1〜#3の予想メモリ使用量の合計が式(1)を満たす場合(ステップ810でYes)、次に、中間言語コード生成部120は、1ブロック読み込み処理によりブロック#4を読み込み(ステップ812)、続いて、読み込んだブロック#4に関してメモリ使用量予想処理を行う(ステップ813)。そして、中間言語コード生成部120は、ブロック#1〜#4の予想メモリ使用量の合計が、図5を参照して説明した式(1)を満たすか否かを判断する。ここでは、ステップ812で、さらに1ブロックが読み込まれているので、式(1)におけるmの値は4である。ブロック#1〜#4の予想メモリ使用量の合計が式(1)を満たさない場合(ステップ814でNo)、中間言語コード生成部120は、ステップ812で読み込んだブロック#4のデータをデータ受信バッファに戻す(ステップ815)。これ以降、このサイクルでは、中間言語コード生成部120は、3ブロック(ブロック#1〜#3)を対象として処理を行う。一方、ブロック#1〜#4の予想メモリ使用量の合計が式(1)を満たす場合(ステップ814でYes)、中間言語コード生成部120は、読み込んだ4ブロック(ブロック#1〜#4)の全てを対象として処理を行う。
【0067】
以上の動作において、ブロックを読み込む、ブロックのデータをデータ受信バッファに戻す、等の記載で表現される動作の実現方法は特に限定しない。すなわち、これらの動作において、必ずしもメモリ150内のデータ移動やコピーが行われるわけではない。例えば、メモリ150に保持されている一連の描画コマンドのどこまで読んだかを示すポインタを用意し、このポインタを操作する、といった動作によって実現しても良い。
【0068】
次に、図8−2を参照すると、ブロック#1のみが処理対象である場合(ステップ806でNo、ステップ807の後)、中間言語コード生成部120は、CPU101にブロック#1を割り当て、このブロック#1のオペレータに対応する中間言語コードを生成する(ステップ816)。そして、生成した中間言語コード群を中間言語用バッファ(メモリ150)に格納する。また、ポインタ・テーブル151の通し番号「BLOCKNUM+1」のエントリに、格納した中間言語コード群へのポインタを書き込む(ステップ817)。この後、中間言語コード生成部120は、変数CPU_Nの値に1を加算して新たな変数CPU_Nとする(ステップ818)。
【0069】
次に、ブロック#1、#2が処理対象である場合(ステップ810でNo、ステップ811の後)、中間言語コード生成部120は、CPU101にブロック#1を割り当て、CPU102にブロック#2を割り当てて、並列処理により、このブロック#1、#2のオペレータに対応する中間言語コードを生成する(ステップ819)。そして、生成した中間言語コード群を中間言語用バッファ(メモリ150)に格納する。また、ポインタ・テーブル151の通し番号「BLOCKNUM+1」のエントリに、ブロック#1のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「BLOCKNUM+2」のエントリに、ブロック#2のオペレータに対応する中間言語コード群へのポインタを書き込む(ステップ820)。この後、中間言語コード生成部120は、変数CPU_Nの値に2を加算して新たな変数CPU_Nとする(ステップ821)。
【0070】
次に、ブロック#1〜#3が処理対象である場合(ステップ814でNo、ステップ815の後)、中間言語コード生成部120は、CPU101にブロック#1を割り当て、CPU102にブロック#2を割り当て、CPU103にブロック#3を割り当てて、並列処理により、このブロック#1〜#3のオペレータに対応する中間言語コードを生成する(ステップ822)。そして、生成した中間言語コード群を中間言語用バッファ(メモリ150)に格納する。また、ポインタ・テーブル151の通し番号「BLOCKNUM+1」のエントリに、ブロック#1のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「BLOCKNUM+2」のエントリに、ブロック#2のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「BLOCKNUM+3」のエントリに、ブロック#3のオペレータに対応する中間言語コード群へのポインタを書き込む(ステップ823)。この後、中間言語コード生成部120は、変数CPU_Nの値に3を加算して新たな変数CPU_Nとする(ステップ824)。
【0071】
次に、ブロック#1〜#4が処理対象である場合(ステップ814でYes)、中間言語コード生成部120は、CPU101にブロック#1を割り当て、CPU102にブロック#2を割り当て、CPU103にブロック#3を割り当て、CPU104にブロック#4を割り当てて、並列処理により、このブロック#1〜#4のオペレータに対応する中間言語コードを生成する(ステップ825)。そして、生成した中間言語コード群を中間言語用バッファ(メモリ150)に格納する。また、ポインタ・テーブル151の通し番号「BLOCKNUM+1」のエントリに、ブロック#1のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「BLOCKNUM+2」のエントリに、ブロック#2のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「BLOCKNUM+3」のエントリに、ブロック#3のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「BLOCKNUM+4」のエントリに、ブロック#4のオペレータに対応する中間言語コード群へのポインタを書き込む(ステップ826)。この後、中間言語コード生成部120は、変数CPU_Nの値に4を加算して新たな変数CPU_Nとする(ステップ827)。
【0072】
ステップ818、821、824、827のいずれかで、変数CPU_Nが更新された後、中間言語コード生成部120は、変数BLOCKNUMの値に更新された変数CPU_Nの値を加算して新たな変数BLOCKNUMとし(ステップ828)、変数CPU_Nを初期化する(ステップ829)。そして、中間言語コード生成部120は、1ページ分の処理が完了したか否かを判断する。完了していない場合(ステップ830でNo)、中間言語コード生成部120は、ステップ802に戻り、上記の処理を繰り返す。
【0073】
1ページ分の処理が完了したならば(ステップ830でYes)、次に、制御部100の中間言語処理部130が、中間言語コード群からラスタ・データを生成する中間言語描画処理を実行する(ステップ831)。中間言語描画処理の手順については後述する。中間言語描画処理により生成されたラスタ・データは、ラスタ・データ用バッファ(メモリ150)に格納される。
【0074】
次に、制御部100の印刷制御部140が、ラスタ・データ用バッファから1ページ分の画像のラスタ・データを読み出し、印刷機構200を制御して、用紙等の印刷媒体上に画像を形成して印刷出力する(ステップ832)。印刷対象の文書が複数ページにわたる場合は、以上の処理がページ数分だけ繰り返される。
【0075】
<1ブロック読み込み処理>
図9は、図8−1のステップ802、804、808、812に示す、1ブロック読み込み処理の手順を示すフローチャートである。
図9を参照すると、1ブロック読み込み処理において中間言語コード生成部120は、まずGSオペレータ受信処理を実行し(ステップ901)、データ受信バッファにオペレータが残っているかを判断する。オペレータが残っているならば(ステップ902でYes)、次に、中間言語コード生成部120は、描画オペレータ受信処理を実行し(ステップ903)、データ受信バッファにオペレータが残っているかを判断する。オペレータが残っているならば(ステップ904でYes)、次に、中間言語コード生成部120は、分割位置チェック処理を実行する(ステップ905)。以上の、GSオペレータ受信処理、描画オペレータ受信処理、分割位置チェック処理の手順については後述する。
【0076】
GSオペレータ受信処理または描画オペレータ受信処理の後にオペレータが残っていない場合((ステップ902でNo、またはステップ904でNo)、中間言語コード生成部120は、1ブロック読み込み処理を終了する。分割位置チェック処理の結果、分割位置の修正が必要ない場合も(ステップ906でNo)、中間言語コード生成部120は、1ブロック読み込み処理を終了する。一方、分割位置の修正が必要ならば(ステップ906でYes)、中間言語コード生成部120は、ステップ901に戻って、以上の動作を繰り返す。
【0077】
<描画オペレータ受信処理>
図10は、図9のステップ901に示す、描画オペレータ受信処理の手順を示すフローチャートである。
図10を参照すると、描画オペレータ受信処理において中間言語コード生成部120は、まずデータ解読部110に、次のオペレータの情報を要求する(ステップ1001)。次のオペレータが存在する場合(ステップ1002でYes)、そのオペレータが描画オペレータであれば(ステップ1003でYes)、中間言語コード生成部120は、データ解読部110からそのオペレータを1つ受信し、メモリ150の作業領域に格納する(ステップ1004)。そして、ステップ1001に戻り、処理を繰り返す。
【0078】
次のオペレータが存在しない場合(ステップ1002でNo)、および次のオペレータが存在するが描画オペレータでない(GSオペレータである)場合(ステップ1003でNo)は、中間言語コード生成部120は、描画オペレータ受信処理を終了する。なお、以上の処理において、オペレータの種類の判断は、予めオペレータを分類したテーブルをROM160等に保持しておき、参照して行えば良い。
【0079】
<GSオペレータ受信処理>
図11は、図9のステップ903に示す、GSオペレータ受信処理の手順を示すフローチャートである。
図11を参照すると、描画オペレータ受信処理において中間言語コード生成部120は、まずデータ解読部110に、次のオペレータの情報を要求する(ステップ1101)。次のオペレータが存在する場合(ステップ1102でYes)、そのオペレータがGSオペレータであれば(ステップ1103でYes)、中間言語コード生成部120は、データ解読部110からそのオペレータを1つ受信し、メモリ150の作業領域に保持する(ステップ1104)。そして、ステップ1101に戻り、処理を繰り返す。
【0080】
次のオペレータが存在しない場合(ステップ1102でNo)、および次のオペレータが存在するがGSオペレータでない(描画オペレータである)場合(ステップ1103でNo)は、中間言語コード生成部120は、GSオペレータ受信処理を終了する。なお、以上の処理において、オペレータの種類の判断は、予めオペレータを分類したテーブルをROM160等に保持しておき、参照して行えば良い。
【0081】
<分割位置チェック処理>
図12は、図9のステップ905に示す、分割位置チェック処理の手順を示すフローチャートである。
図12を参照すると、分割位置チェック処理において中間言語コード生成部120は、まず、次のブロックの先頭のオペレータを指示する次ブロック先頭ポインタを、処理中のオペレータの位置を指示する値に書き換える(ステップ1201)。そして、分割位置修正フラグの値を、修正を要することを示す値(図12では「1」)とする(ステップ1202)。
【0082】
次に、中間言語コード生成部120は、GSオペレータ受信処理を行う(ステップ1203)。そして、読み込んだGSオペレータ中に、座標設定オペレータが存在するか否かを判断する。座標設定オペレータが存在する場合(ステップ1204でYes)、着目している次のブロックは、現在処理中(読み込み中)のブロックと並列に処理することができるので、分割位置修正フラグの値を、修正を要しないことを示す値(図12では「0」)とする(ステップ1205)。これにより、現在処理中のブロックと次のブロックとは分割され、並列に処理されることとなる。次に、中間言語コード生成部120は、現在処理中のオペレータの位置に、次ブロック先頭ポインタの値を書き換えて、分割位置チェック処理を終了する(ステップ1208)。次ブロック先頭ポインタの値を現在処理中のオペレータの位置に戻すことは、分割位置チェック処理においてデータを読み込んだために進んだカウンタを元に戻すことを意味している。
【0083】
読み込んだGSオペレータ中に、座標設定オペレータが存在しない場合(ステップ1204でNo)、中間言語コード生成部120は、データ解読部110に、さらに次のオペレータの情報を要求する(ステップ1206)。次のオペレータが存在し、かつそのオペレータが完結型描画オペレータである場合(ステップ1207でYes)、着目している次のブロックは、現在処理中のブロックと並列に処理することができるので、分割位置修正フラグの値を「0」とする(ステップ1205)。これにより、現在処理中のブロックと次のブロックとは分割され、並列に処理されることとなる。次に、中間言語コード生成部120は、現在処理中のオペレータの位置に、次ブロック先頭ポインタの値を書き換えて、分割位置チェック処理を終了する(ステップ1208)。
【0084】
次のブロックにおいて、GSオペレータ中に座標設定オペレータが存在せず(ステップ1204でNo)、かつその次に完結型描画オペレータが存在しない場合(ステップ1207でNo)、次のブロックの描画オペレータは、現在処理中のブロックの描画オペレータの実行結果に依存するため、現在処理中のブロックと次のブロックとを並列に処理することができない。したがって、分割位置修正フラグの値は変更されず、ステップ1202で設定された「1」のままである。これにより、現在処理中のブロックと次のブロックとは分割されず、図9に示した1ブロック読み込み処理で一緒に読み込まれ、逐次処理されることとなる。この後、中間言語コード生成部120は、現在処理中のオペレータの位置に、次ブロック先頭ポインタの値を書き換えて、分割位置チェック処理を終了する(ステップ1208)。
【0085】
<メモリ使用量予想処理>
図13は、図8−1のステップ803、805、809、813に示す、メモリ使用量予想処理の手順を示すフローチャートである。
図13を参照すると、メモリ使用量予想処理において中間言語コード生成部120は、まずGSオペレータのメモリ使用量を使用メモリ予想テーブル161から読み出す(ステップ1301)。次に、中間言語コード生成部120は、処理中のブロック内の全ての描画オペレータを抽出する(ステップ1302)。このとき、抽出するのはオペレータ本体のみであり、オペレータに付随する描画データは無視する。
【0086】
次に、中間言語コード生成部120は、使用メモリ予想テーブル161から、ステップ1302で抽出した描画オペレータの必要メモリ・サイズの平均値を読み出す(ステップ1303)。そして、ステップ1301で取得したGSオペレータ部分のメモリ使用量と、ステップ1303で取得した各描画オペレータの必要メモリ・サイズの平均値とを合計し、ブロック全体の予想メモリ使用量を算出する(ステップ1304)。
【0087】
図14は、使用メモリ予想テーブル161の構成例を示す図である。
図14に示すように、使用メモリ予想テーブル161は、1ブロックにおけるGSオペレータ部分のメモリ使用量と、個々の描画オペレータの予想メモリ使用量(必要メモリ・サイズの平均値)とを登録している。中間言語コード生成部120は、この使用メモリ予想テーブル161を参照して、上記ステップ1301およびステップ1303で必要な情報を取得する。
【0088】
<中間言語描画処理>
図15は、図8−2のステップ831に示す、中間言語描画処理の手順を示すフローチャートである。
図15を参照すると、中間言語描画処理において中間言語処理部130は、まずメモリ150に保持されているポインタ・テーブル151を参照し、未処理のポインタのうちで通し番号が最も若いポインタに着目する(ステップ1501)。そして、ステップ1501で着目したポインタが指示する中間言語コード群を中間言語用バッファ(メモリ150)から読み出し、描画処理(ラスタ・データの生成)を行う(ステップ1502)。以上の処理を、中間言語用バッファに保持されている全ての中間言語コード群に対して順次行い、中間言語用バッファが空になったならば、中間言語処理部130は、中間言語描画処理を終了する(ステップ1503)。
【0089】
以上、本実施形態について説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。例えば、上記の実施形態では、制御部100を4個のCPUで構成したが、CPUの個数は上記の構成例に限定されない。また、1個のCPUに複数のプロセッサ・コアを搭載したマルチコア・プロセッサを用いても良い。この場合、マルチコア・プロセッサにおける個々のプロセッサ・コアを、上記の実施形態における個々のCPUと同等に扱う。すなわち、ブロック単位に分割された描画コマンドを、各プロセッサ・コアに割り当てて、各プロセッサ・コアによる並列処理により中間言語コードに変換する。その他、上記実施形態に、種々の変更または改良を加えたものも、本発明の技術的範囲に含まれることは、特許請求の範囲の記載から明らかである。
【符号の説明】
【0090】
100…制御部、110…データ解読部、120…中間言語コード生成部、130…中間言語処理部、140…印刷制御部、150…メモリ、160…ROM、200…印刷機構、300…I/Oインターフェイス

【特許請求の範囲】
【請求項1】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成部と、
前記中間言語生成部により生成された前記中間言語コードを処理してラスタ・データを生成する中間言語処理部と、
前記中間言語処理部により生成された前記ラスタ・データに基づいて印刷処理を行う印刷機構とを備え、
前記中間言語生成部は、前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って前記中間言語コードを生成する、装置。
【請求項2】
前記中間言語生成部は、連続する2つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に持つオペレータでない場合に、当該2つのブロックを分割せずに逐次処理し、
その他の場合には当該2つのブロックを分割して並列処理する、請求項1に記載の装置。
【請求項3】
前記中間言語生成部は、1つの前記ブロックのオペレータを処理する場合に、当該ブロックに先行するブロックにおける前記グラフィック・ステート・オペレータを処理した後に、当該ブロックのオペレータを処理する、請求項1または請求項2に記載の装置。
【請求項4】
前記中間言語生成部は、並列処理される複数の前記ブロックのうち、特定のブロックの処理に要する時間が他の連続する複数のブロックの処理に要する時間よりも長いと推定される場合、当該他の連続する複数のブロックを分割せずに逐次処理する、請求項1乃至請求項3のいずれかに記載の装置。
【請求項5】
前記中間言語生成部は、複数の前記ブロックを並列処理するために必要と推定されるメモリ使用量が物理メモリの空き容量を基準とする閾値よりも大きい場合に、並列処理を行うブロック数を減らす、請求項1乃至請求項4のいずれかに記載の装置。
【請求項6】
前記中間言語生成部は、並列処理により生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を生成し、
前記中間言語処理部は、前記対応情報に基づき、元の描画コマンドの順番で前記中間言語コードを処理する、請求項1乃至請求項5のいずれかに記載の装置。
【請求項7】
前記中間言語生成部は、複数のCPUを備えるマルチ・プロセッサにより実現され、前記ブロックを各CPUに割り当てて、並列処理を行う、請求項1に記載の装置。
【請求項8】
前記中間言語生成部は、1つのCPUに複数のプロセッサ・コアを備えたマルチコア・プロセッサにより実現され、前記ブロックを各プロセッサ・コアに割り当てて、並列処理を行う、請求項1に記載の装置。
【請求項9】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成部と、
前記中間言語生成部により生成された前記中間言語コードを処理してラスタ・データを生成する中間言語処理部と、
前記中間言語処理部により生成された前記ラスタ・データに基づいて印刷処理を行う印刷機構とを備え、
前記中間言語生成部は、
前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位に分け、
連続する2つの前記ブロックに関して、後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該2つのブロックを分割せずに逐次処理し、その他の場合には当該2つのブロックを分割して並列処理し、
並列処理される複数の前記ブロックのうち、特定のブロックの処理に要する時間が他の連続する複数のブロックの処理に要する時間よりも長いと推定される場合、当該他の連続する複数のブロックを分割せずに逐次処理し、
複数の前記ブロックを並列処理するために必要と推定されるメモリ使用量が物理メモリの空き容量を基準とする閾値よりも大きい場合に、並列処理を行うブロック数を減らし、
1つの前記ブロックのオペレータを処理する場合に、当該ブロックに先行するブロックにおける前記グラフィック・ステート・オペレータを処理した後に、当該ブロックのオペレータを処理することによって中間言語コードを生成し、
並列処理により生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を生成し、
前記中間言語処理部は、前記対応情報に基づき、元の描画コマンドの順番で前記中間言語コードを処理する、装置。
【請求項10】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置の制御装置において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成部と、
前記中間言語生成部により生成された前記中間言語コードを、印刷処理に用いるラスタ・データに変換する中間言語処理部とを備え、
前記中間言語生成部は、前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って前記中間言語コードを生成する、装置。
【請求項11】
前記中間言語生成部は、連続する2つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該2つのブロックを分割せずに逐次処理し、
その他の場合には当該2つのブロックを分割して並列処理する、請求項10に記載の装置。
【請求項12】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置の制御方法において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得するステップと、
取得した前記描画コマンドおよび前記印刷データを中間言語コードに変換するステップと、
生成された前記中間言語コードを処理してラスタ・データを生成するステップと、
生成された前記ラスタ・データに基づいて印刷機構を制御し、印刷処理を行うステップとを含み、
前記中間言語コードに変換するステップは、
前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割するステップと、
分割されたブロックごとに並列処理を行って前記中間言語コードを生成するステップと、
を含む、方法。
【請求項13】
前記描画コマンドを分割するステップでは、連続する2つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該2つのブロックを分割せずに逐次処理し、
その他の場合には当該2つのブロックを分割して並列処理する、請求項12に記載の方法。
【請求項14】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置を制御するコンピュータを、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成手段と、
前記中間言語生成手段により生成された前記中間言語コードを処理してラスタ・データを生成する中間言語処理手段と、
前記中間言語処理手段により生成された前記ラスタ・データに基づいて印刷機構を制御し、印刷処理を行う印刷制御手段として機能させ、
前記中間言語生成手段は、前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って前記中間言語コードを生成する、プログラム。
【請求項15】
前記中間言語生成手段は、連続する2つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該2つのブロックを分割せずに逐次処理し、
その他の場合には当該2つのブロックを分割して並列処理する、請求項14に記載のプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8−1】
image rotate

【図8−2】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate


【公開番号】特開2010−244359(P2010−244359A)
【公開日】平成22年10月28日(2010.10.28)
【国際特許分類】
【出願番号】特願2009−93340(P2009−93340)
【出願日】平成21年4月7日(2009.4.7)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【復代理人】
【識別番号】100104880
【弁理士】
【氏名又は名称】古部 次郎
【復代理人】
【識別番号】100118201
【弁理士】
【氏名又は名称】千田 武
【復代理人】
【識別番号】100118108
【弁理士】
【氏名又は名称】久保 洋之
【Fターム(参考)】