(57)【特許請求の範囲】
【請求項１】
プロセッサと、
該プロセッサに結合され、ヒープメモリ割当プログラムが格納された記憶手段と、
を有する画像形成装置において、
該ヒープメモリ割当プログラムは、該プロセッサに対し、
（ａ）要求サイズの記憶領域を確保可能か否かを判定させ、肯定判定した場合には要求サイズの記憶領域を確保させ、
（ｂ）処理（ａ）で否定判定した場合には、第１状態であれば第２状態になるのを待って処理（ａ）に戻らせ、ここに該第１状態は、処理中を含むメモリ上ディスプレイリスト残存頁数が２以上であり、該第２状態は、該処理中を含むメモリ上ディスプレイリスト残存頁数が１以下であることを含み、
（ｃ１）処理（ｂ）で該第１状態でなければ、該処理中を含むメモリ上ディスプレイリスト残存頁数が１以下かつ処理中ディスプレイリストの作成済バンド数がラスタライズ開始条件未満の値であるか否かを判定させ、
（ｃ２）処理（ｃ１）で肯定判定した場合には、例外としてラスタライズを開始させ、処理（ａ）に戻らせ、
（ｃ３）処理（ｃ１）で否定判定した場合には、該ガベージコレクションを行わせた後に該要求サイズの記憶領域を確保させる、
ことを特徴とする画像形成装置。
【請求項２】
処理（ｃ３）は、該プロセッサに対し、
（ｃ３１）処理（ｃ１）で否定判定した場合には、記憶領域確保要求が、ディスプレイリスト作成処前の処理を行うプログラムからの要求であるか否かを判定させ、肯定判定した場合には、フォントキャッシュを解放させて処理（ａ）に戻らせ、
（ｃ３２）処理（ｃ３１）で否定判定した場合には、該ガベージコレクションを行わせた後に該要求サイズの記憶領域を確保させる、
ことを特徴とする請求項１に記載の画像形成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数タスクからのヒープメモリ獲得要求に応答して、必要に応じガベージコレクションを行うヒープメモリ割当プログラムを備えた画像形成装置に係り、特に、メモリ解放を待てば要求サイズのメモリを確保できると予測できる場合にメモリ解放を待つヒープメモリ割当プログラムを備えた画像形成装置に関する。
【背景技術】
【０００２】
Ｃ＋＋やＪａｖａ（登録商標）等のオブジェクト指向プログラミング言語では、ヒープメモリ内の領域の動的確保及び解放がシステム側（ランタイムライブラリ）で行われる。要求サイズのメモリ領域を確保できない場合、ガベージコレクションが行われて、参照されなくなったオブジェクトが解放され、また、コンパクションが行われて連続した空き領域が生成される。
【０００３】
しかしながら、ヒープメモリサイズが比較的大きいので、コンパクションでのオブジェクトのコピーに要する時間が比較的長く、また、ガベージコレクションが何時行われるかアプリケーションにおいて予測ができず、不意に処理が遅延する原因となる。
【０００４】
そこで、下記特許文献１では、画像形成装置において、外部からの印刷データの待ち受け時間にガベージコレクションを行うことにより、印刷処理への影響を低減している。
【特許文献１】特開２００６−３４４１８４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかし、印刷データを受信した後、印刷データを遅滞なく処理して印刷を行いたい場合、処理実行のためのメモリ割当ができなくてガベージコレクションが実行されると、処理が遅延する。
【０００６】
一般に、ガベージコレクション実行時にはその他の全処理が停止されるので、特に、複数の処理を効率よく並列実行している場合、ガベージコレクションが度々実行されると、処理遅延の影響が比較的大きくなる。
【０００７】
本発明の目的は、このような問題点に鑑み、ヒープメモリ確保遅延を抑制することが可能な画像形成装置を提供することにある。
【課題を解決するための手段】
【０００８】
本発明の第１態様では、プロセッサと、該プロセッサに結合され、ヒープメモリ割当プログラムが格納された記憶手段と、を有する画像形成装置において、該ヒープメモリ割当プログラムは、該プロセッサに対し、
（ａ）要求サイズの記憶領域を確保可能か否かを判定させ、肯定判定した場合には要求サイズの記憶領域を確保させ、
（ｂ）処理（ａ）で否定判定した場合には、第１状態であれば第２状態になるのを待って処理（ａ）に戻らせ、
（ｃ）処理（ｂ）で該第１状態でなければ、ガベージコレクションを行わせた後に該要求サイズの記憶領域を確保させる。
【０００９】
本発明による画像形成装置の第２態様では、第１態様において、該第１状態は、処理中を含むメモリ上ディスプレイリスト残存頁数が２以上であり、該第２状態は、該処理中を含むメモリ上ディスプレイリスト残存頁数が１以下であることを含む。
【００１０】
本発明による画像形成装置の第３態様では、第２態様において、処理（ｃ）は、該プロセッサに対し、
（ｃ１）該第１状態でなければ、該処理中を含むメモリ上ディスプレイリスト残存頁数が１以下かつ処理中ディスプレイリストの作成済バンド数がラスタライズ開始条件未満の値であるか否かを判定させ、
（ｃ２）処理（ｃ１）で肯定判定した場合には、例外としてラスタライズを開始させ、処理（ａ）に戻らせ、
（ｃ３）処理（ｃ１）で否定判定した場合には、該ガベージコレクションを行わせた後に該要求サイズの記憶領域を確保させる。
【００１１】
本発明による画像形成装置の第４態様では、第３態様において、
処理（ｃ３）は、該プロセッサに対し、
（ｃ３１）処理（ｃ１）で否定判定した場合には、記憶領域確保要求が、ディスプレイリスト作成処前の処理を行うプログラムからの要求であるか否かを判定させ、肯定判定した場合には、フォントキャッシュを解放させて処理（ａ）に戻らせ、
（ｃ３２）処理（ｃ３１）で否定判定した場合には、該ガベージコレクションを行わせた後に該要求サイズの記憶領域を確保させる。
【００１２】
本発明の第５態様では、プロセッサと、該プロセッサに結合され、それぞれ異なるタスクとして実行される複数の処理プログラムと、ヒープメモリ管理プログラムとが格納された記憶手段と、を有する画像形成装置において、
該複数の処理プログラムのそれぞれは、該プロセッサに対し、本体処理の前処理として自タスクに対応したセマフォのロックを獲得させ、該本体処理の後処理としてこのロックを解放させ、
該ヒープメモリ管理プログラムは、該タスクと別のタスクとして実行されるヒープメモリ割当プログラムと、該ヒープメモリ割当プログラムと並列実行可能なヒープメモリ解放プログラムとを有し、
該ヒープメモリ割当プログラムは、該プロセッサに対し、要求サイズの記憶領域を確保できないないと判断した場合、ガベージコレクションの前処理として、該複数の処理プログラムのそれぞれに対応したセマフォのロックを獲得させ、該ガベージコレクションを行わせ、該ガベージコレクションの後処理としてこれらセマフォのロックを解放させ、
該ヒープメモリ解放プログラムは該プロセッサに対し、該複数の処理プログラムの任意の１つからの解放要求に応答して、該ヒープメモリの対応する記憶領域を解放させ、
該複数の処理プログラムの任意の１つは、該プロセッサに対し、該ヒープメモリ割当プログラムを介しヒープメモリ割当要求する前に、自タスクに対応したセマフォのロックを解放させ、該ヒープメモリ割当プログラムから戻った後にこのセマフォのロックを獲得させる。
【発明の効果】
【００１３】
上記第１態様の構成によれば、第１状態であれば第２状態になるのを待って、要求サイズの記憶領域を確保可能か否かを判定し、否定判定した場合にガベージコレクションを行わせるので、ガベージコレクション実行回数を低減してヒープメモリ確保遅延を抑制することが可能となるという効果を奏する。
【００１４】
上記第２態様の構成によれば、該第１状態は処理中を含むメモリ上ディスプレイリスト残存頁数が２以上であり、該第２状態は該処理中を含むメモリ上ディスプレイリスト残存頁数が１以下であることを含むので、効率よくガベージコレクション実行回数を低減してヒープメモリ確保遅延を抑制することが可能となるという効果を奏する。
【００１５】
上記第３態様の構成によれば、該第１状態でなくても、該処理中を含むメモリ上ディスプレイリスト残存頁数が１以下かつ処理中ディスプレイリストの作成済バンド数がラスタライズ開始条件未満の値であると判定した場合には、例外としてラスタライズを開始させて、要求サイズの記憶領域が確保可能になるのを待つので、さらに効率よくガベージコレクション実行回数を低減してヒープメモリ確保遅延を抑制することが可能となるという効果を奏する。
【００１６】
上記第４態様の構成によれば、記憶領域確保要求が、ディスプレイリスト作成処前の処理を行うプログラムからの要求である場合、フォントキャッシュを解放させて要求サイズの記憶領域が確保可能か否かを判定するので、さらに効率よくガベージコレクション実行回数を低減してヒープメモリ確保遅延を抑制することが可能となるという効果を奏する。
【００１７】
上記第５態様の構成によれば、それぞれ異なるタスクとして実行される複数の処理プログラムのうち、ヒープメモリ割当プログラムを呼び出したもの以外が１頁分処理を終了するまで、該ヒープメモリ割当プログラムにおいてガベージコレクションの実行が待たされるので、この実行の開始時には参照されなくなったデータの量が比較的多いと考えられ、ガベージコレクション実行により確保可能になる連続領域が比較的大きくなって効率よくガベージコレクションを実行することができるとともに、これによりガベージコレクション実行回数を低減してヒープメモリ確保遅延を抑制することが可能となるという効果を奏する。
【００１８】
本発明の他の目的、構成及び効果は以下の説明から明らかになる。
【実施例１】
【００１９】
以下、図面を参照して本発明の実施例を説明する。なお、ガベージコレクションに関しては実施例４で説明する。
【００２０】
図２１は、本発明の実施例１に係る画像形成装置１０のハードウェア構成を示す概略ブロック図である。
【００２１】
この画像形成装置１０では、ＣＰＵ１１、ＥＥＰＲＯＭ１２、ＲＡＭ１３、圧縮・伸長プロセッサ１４、通信インターフェイス１５、パネルインターフェイス１６、エンジンコントローラ１７及び搬送コントローラ１８がバス１９で結合され、インターフェイス１６、インターフェイスを含むエンジンコントローラ１７並びに搬送コントローラ１８にそれぞれ操作パネル２０、プリントエンジン２１及び用紙搬送装置２２が結合されている。通信インターフェイス１５には、不図示のホストコンピュータが結合される。
【００２２】
ＥＥＰＲＯＭ１２には、ＯＳ（Operating System）、ドライバ及びアプリケーションが格納される。ＲＡＭ１３には、一時的なデータが格納される。このＯＳは、アプリケーションのマルチスレッドに対応し、かつ、セマフォ機能を備えている。
【００２３】
圧縮・伸長プロセッサ１４は、例えばＡＳＩＣ（Application Specific Integrated Circuit）で構成され、圧縮処理と伸長処理とを同時に行うことができる。圧縮・伸長プロセッサ１４は、互いに並列処理可能な圧縮部１４１、伸長部１４２及び伸長部１４３（図図１参照）と、ＤＭＡＣ（Direct Memory Access Controller）とを備え、ＲＡＭ１３内のデータを圧縮部１４１、伸長部１４２又は伸長部１４３にＤＭＡでブロック転送させて圧縮又は伸長を行い、その結果をＲＡＭ１３又はエンジンコントローラ１７へＤＭＡでブロック転送させることが可能である。ＤＭＡＣは、圧縮・伸長プロセッサ１４と別体であってもよい。
【００２４】
操作パネル２０は、キー及び表示パネルを供えている。エンジンコントローラ１７は、ＣＰＵと、プリントエンジン制御用プログラムが格納されたメモリと、受信したビットマップデータを格納するバッファメモリとを備えている。
【００２５】
図１は、ホストコンピュータから受信した印刷データをビットマップ展開する部分の機能ブロック図である。
【００２６】
この印刷データは、頁記述言語（ＰＤＬ）で記述されており、通信インターフェイス１５を介してバッファメモリ１３１に格納される。図１において、バッファメモリ１３１、ヒープメモリ１３２及び共有メモリ１３３はＲＡＭ１３中の記憶領域である。インタープリタ１２１、ＲＩＰ１２２及び制御部１２３はいずれも、上記アプリケーションプログラムの一部に対応しており、ＣＰＵ１１により実行される。
【００２７】
制御部１２３は、ホストコンピュータからの印刷要求に対し、ホストコンピュータからの印刷データを、通信インターフェイス１５を介してバッファメモリ１３１に格納させる。制御部１２３は、インタープリタ１２１を起動させることにより、この印刷データを、各頁について、バンドごとのディスプレイリスト（中間コード）に変換させ、ヒープメモリ１３２に格納させる。制御部１２３は、ＲＩＰ１２２及び圧縮・伸長プロセッサ１４を起動させることにより、それぞれ後述の処理をさせる。
【００２８】
図１０（Ａ）〜（Ｃ）は、ディスプレイリスト概略説明図である。
【００２９】
図１０（Ａ）に示す如く、１頁分の印刷データ３０には、図形オブジェクト３１〜３４がこの順にＰＤＬで記述されており、これらを記述順にラスタライズすることにより、ビットマップデータ領域上で、図形オブジェクト３１に図形オブジェクト３３が上書きされ、図形オブジェクト３３に図形オブジェクト３４が上書きされて、図１０（Ａ）に示すような画像が得られる。必要なメモリ容量を低減するために、図１０（Ｂ）に示すように、印刷データ３０をバンド４０〜４３に分割するとともに、ラスタライズを高速処理するために、分割されたオブジェクトを中間コードに変換する。一般に、オブジェクトには図形オブジェクト以外に文字オブジェクト及びイメージオブジェクトが含まれる。オブジェクトの中間コード化において、ベクトルデータの文字オブジェクトは、イメージデータに変換される。
【００３０】
図１０（Ｃ）は、印刷データ３０に含まれる各図形オブジェクトがバンド毎の中間コードデータに変換されている状態をイメージ的に示す。図中の中間コードブロックＬｉｊは、バンドｉのディスプレイリストを構成するｊ番目のブロックであることを示している。図形の合成が適正に行われるようにするために、各バンドでのブロック記述順は、図形オブジェクトの記述順に従っている。例えばバンド４１のディスプレイリストでのブロック記述順は、中間コードブロックＬ１０、Ｌ１１、Ｌ１２、Ｌ２１となっている。
【００３１】
バンド数が多いほど、所要メモリ容量を低減することができるが、トータル処理時間が増加するので、ＲＡＭ１３の容量に応じてバンド数が決定され、この値は例えば３６である。また、メモリ管理を容易にするために、１ブロックの最大記憶容量が決定され、この容量の各ブロックＬｉｊに、できるだけ多くの中間コードが詰め込まれる。
【００３２】
図２は、ヒープメモリ１３２に格納されるディスプレイリストのデータ構造を示している。このデータ構造は、リスト構造である。
【００３３】
Ｌバンド配列１３２０は、その要素数がバンド数に等しく、要素ｉ（ｉは０〜ｎのいずれか）はディスプレイリストＬｉのポインタである。各ディスプレイリストＬｉのブロック数は一定ではない。図１では簡単化のために、各ディスプレイリストＬｉのブロック数が３である場合を示している。ブロックＬｉｊの中間コードは、イメージデータの場合、イメージデータ格納先を示すポインタとデータのバイト数とを含むコードであり、イメージデータ自体はブロックＬｉｊ内に含まれない。イメージデータがバンド境界を含む場合には、バンド境界で分割されたイメージデータがポインタとデータのバイト数とで同様に指定される。
【００３４】
一方、共有メモリ１３３には、ビットマップデータ領域１３３Ｂと圧縮データ領域１３３Ｃとが確保される。また、圧縮・伸長プロセッサ１４は互いに並列処理可能な圧縮部１４１と伸長部１４２とを備えている。
【００３５】
次に、ＲＩＰ１２２、圧縮・伸長プロセッサ１４及びこれらを制御する制御部１２３によるバンドｉの処理について説明する。ブロック識別変数ｊの初期値は０である。制御部１２３は、ＲＩＰ１２２を頁毎に開始制御し、制御圧縮・伸長プロセッサ１４をバンド毎に開始制御する。
【００３６】
（１）ｊ＝０の場合は、ステップ（２）へ進む。ｊ＞０の場合、伸長部１４２は、圧縮バンド領域Ｃｉに格納されている圧縮データを呼び出し、元のビットマップデータに伸長させて、サブ領域ＢＭＰｋに格納する。
【００３７】
（２）ＲＩＰ１２２は、ヒープメモリ１３２内の中間コードブロックＬｉｊをビップマップデータに変換して、サブ領域ＢＭＰｋに格納させることにより、（１）で伸長されたビットマップデータに上書きする。
【００３８】
（３）圧縮部１４１は、サブ領域ＢＭＰｋに格納されたビットマップデータを圧縮して、圧縮データ領域１３３Ｃ内の圧縮バンド領域Ｃｉに格納する。
【００３９】
（４）ＲＩＰ１２２は、ｊを１だけインクリメントし、中間コードブロックＬｉｊがヒープメモリ１３２内に存在すれば、上記ステップ（１）へ戻る。
【００４０】
圧縮部１４１と伸長部１４２とを並列に動作させることができ、かつ、圧縮・伸長プロセッサ１４での処理とディスプレイリスト作成及びラスタライズのソフトウェア処理とを並列に行うことが可能である。一方、同一バンドについて圧縮処理と伸長処理とソフトウェア処理とのうちの任意の２つを同時に行うことができない。そこで、図４に示す如く、同時に３バンドの処理を行う。そして、例えば、バンド０の伸長を行っているときにバンド１の圧縮を行うとともに、バンド２のディスプレイリスト作成とラスタライズとを直列処理する。これら圧縮、伸長及びラスタライズはいずれも、ビップマップデータを取り扱うので、図１に示す如く、ビットマップデータ領域１３３Ｂは、ＢＭＰ０〜ＢＭＰ２に分割された３バンド分の領域を有している。
【００４１】
圧縮部１４１の平均圧縮率を１／ｃ（ｃ＝圧縮後のサイズ／圧縮前のサイズ）、１頁のバンド数をｎ＋１とすると、１頁分のビットマップデータに対する圧縮データと３バンド分ビットマップ領域との合計の圧縮率は、３／（ｎ＋１）＋１／ｃとなる。例えば、ｎ＝３５、ｃ＝１０の場合、圧縮率は３／３６＋１／１０＝１１／６０となる。
【００４２】
図３は、共有メモリ１３３に格納される、ラスタライズ、圧縮及び伸張に関係したデータの構造を示す。
【００４３】
Ｃバンド配列１３３０は、その要素数がバンド数に等しく、要素ｉ（ｉは０〜ｎのいずれか）は圧縮バンド領域Ｃｉのポインタである。ブロック最大番号配列１３３１は、その要素数がバンド数に等しく、要素ｉにはバンドｉのブロック番号最大値ｊｅ（ｉ）が格納されている。Ｂバンド配列１３３２は、その要素数が３であり、要素ｋ（ｋは０〜２のいずれか）はサブ領域ＢＭＰｋのポインタである。
【００４４】
バンド・ブロック番号変数群１３３３には、変数Ｒ、Ｃ及びＤについてそれぞれ、現在の処理対象のバンド番号とブロック番号との組（ｉ，ｊ）、（ｐ，ｑ）及び（ｒ，ｓ）が格納される。変数Ｒ、Ｃ及びＤは、スレッド間でブロックの処理完了を通知して（図５のステップＳ５、図６（Ａ）のステップＳ１６及び図６（Ｂ）のステップＳ２４）、次のブロックの処理開始時点を適正にするために、すなわち、同一バンドに関し、伸張が完了してからラスタライズし、ラスタライズが完了してから圧縮し、圧縮が完了してから伸張を行うために用いられる。以下の例では、バンド・ブロック番号変数群１３３３には次の又は処理中の処理対象のバンド番号とブロック番号とが格納されるが、このデータは、１つ前の処理対象の処理完了も意味している。
【００４５】
図７は、ソフトウェアと圧縮部１４１と伸長部１４２との並列処理を示す概略タイミングチャートである。図７は、バンド０〜２のそれぞれが３ブロックのディスプレイリストを有する場合を示す。図８は、バンドＢＮＤ０〜ＢＮＤ２毎に図７の処理を再配列したものを示している。
【００４６】
Ｌｉｊ、Ｒｉｊ、Ｃｉｊ及びＤｉｊはそれぞれ、バンドｉ及びブロックｊに関するディスプレイリスト作成、ラスタライズ、圧縮及び伸長の処理を示す。
【００４７】
図１及び図７において、制御部１２３のソフトウェア構成を簡単にするために、圧縮部１４１及び伸長部１４２に対する処理開始制御はそれぞれ、制御部１２３でのスレッドＴｈ１及びＴｈ２で行われる。インタープリタ１２１及びＲＩＰ１２２の処理は、スレッドＴｈ０での処理である。すなわち、３スレッドによる並列処理が行われる。
【００４８】
スレッドＴｈ０は、制御部１２３により生成されて開始される。スレッドＴｈ０において、中間コードブロックＬ００の作成処理が行われ、次いでラスタライズＲ００の処理が行われ、ラスタライズＲ００が完了すると、スレッドＴｈ０によりスレッドＴｈ１が生成されて開始される。スレッドＴｈ１により、圧縮部１４１を介して圧縮Ｃ００の処理が行われ、圧縮Ｃ００の処理が完了すると、スレッドＴｈ１により、Ｔｈ２が生成されて開始される。スレッドＴｈ１及びＴｈ２によりそれぞれ、圧縮部１４１及び伸長部１４２を介して圧縮Ｃ１０及び伸長Ｄ００の処理が行われる。
【００４９】
一般に、スレッドＴｈ０では、中間コードブロックＬｉｊの作成及びラスタライズＲｉｊの処理がバンド順次ブロック順次に行われ、通常、圧縮Ｃｉｊを開始する時点では、ラスタライズＲｉｊの処理が完了している。ここにバンド順次ブロック順次とは、ブロックｊ及びバンドｉ０の初期値を共に０とし、バンドｉ及びブロックｊを次のように変化させることを意味する。
【００５０】
（ａ）ブロックｊを一定にしてバンドｉをｉ０、ｉ０＋１、ｉ０＋２と順次変化させ、
（ｂ）ｊがブロック番号最大値ｊｅ（ｉ）より小さければブロックｊを１だけインクリメントさせて、（ａ）へ戻り、そうでなければ（ｄ）へ進む。
【００５１】
（ｄ）ｉ０＋２がバンド番号最大値ｎより小さければｊ＝０とし且つｉ０を３だけインクリメントさせて、（ａ）へ戻る。
【００５２】
スレッドＴｈ１では、１ブロックに対する圧縮部１４１の処理完了通知に応答してバンド順次ブロック順次になるようにバンドｐ及びブロックｑが更新され、対応するラスタライズＲｐｑの処理が完了していることを条件に、圧縮部１４１に対し圧縮Ｃｐｑの処理を開始させる。試験例では、図７に示すように、圧縮Ｃｐｑを間断なく連続的に行うことができた。
【００５３】
スレッドＴｈ２では、１ブロックに対する伸長部１４２の完了通知に応答してバンド順次ブロック順次になるようにバンドｒ及びブロックｓが更新され、伸長部１４２に対し伸長Ｄｒｓの処理を開始させる。ただし、各バンドｒについて、最後のブロックｊｅ（ｒ）に関しては、伸長Ｄｒｓの処理を開始させない。
【００５４】
図５は、スレッドＴｈ０の処理を示すフローチャートである。ｉ０の初期値は０である。以下、カッコ内は図中のステップ識別符号を示す。
【００５５】
（Ｓ０）ブロック最大番号配列１３３１の要素ｉに格納されている値ｊｅ（ｉ）を読み出し、ステップＳ１〜ＳＡの処理を、ブロックｊが０からｊｅ（ｉ）までについて順次繰り返す。
【００５６】
（Ｓ１）ｉ＝ｉ０からｉ０＋２までについて順次、ステップＳ２からＳ９までの処理を繰り返す。
【００５７】
（Ｓ２）ヒープメモリ１３２内に中間コードブロックＬｉｊを作成する。
【００５８】
（Ｓ３、Ｓ４）ｊ＝０であれば、サブ領域ＢＭＰｋをゼロクリアする。ここにｋはｉ＝ｉ０＋ｋを満たす値である。
【００５９】
（Ｓ５）バンド・ブロック番号変数群１３３３の変数Ｄの内容ｒｓを見て伸張Ｄｉ（ｊ−１）の処理が完了しているか否か（ただし、ｊ＝０の場合には伸張Ｄ（ｉ−１）ｊの処理が完了しているか否か）を判定し、すなわち、ｒ＝ｉ且つｓ＝ｊであるか否かを判定し、肯定判定した場合にはステップＳ６へ進む。
【００６０】
（Ｓ６）ヒープメモリ１３２からこの中間コードブロックＬｉｊを読出し、ラスタライズしてビットマップデータ領域１３３Ｂのサブ領域ＢＭＰｋに上書きする。
【００６１】
（Ｓ７、Ｓ８）ｉ０＝０かつｊ＝０であれば、スレッドＴｈ１を生成し開始させる。
【００６２】
（Ｓ９）バンド・ブロック番号変数群１３３３の変数Ｒの内容（ｉ，ｊ）を上記のように更新する。すなわち、（ｉ，ｊ）をバンド順次ブロック順次における次の値にする。
【００６３】
（ＳＣ）ｉ０を３だけインクリメントする。
【００６４】
（ＳＤ）ｉ０＞ｎであれば処理を終了し、そうでなければステップＳ０へ戻る。
【００６５】
図６（Ａ）は、スレッドＴｈ１での処理を示すフローチャートである。
【００６６】
（Ｓ１０）バンド・ブロック番号変数群１３３３の変数Ｃの内容（ｐ，ｑ）を読み出し、圧縮部１４１に対し圧縮Ｃｐｑの処理を開始させる。この際、圧縮部１４１には、圧縮データ格納先先頭アドレスとしてＣバンド配列１３３０の要素ｉの内容と、圧縮対象データ先頭アドレスとしてＢバンド配列１３３２の要素ｋの内容が供給される。ここにｋは、ｐを３で割ったときの剰余である。
【００６７】
（Ｓ１１）圧縮部１４１の処理完了イベント発生を待つ。このイベント発生により、ウエイト状態が解除されてステップＳ１２へ進む。ウエイト状態解除前は、ＯＳにより直ぐに次のスレッドに切り替えられるので、図５の処理遅延が防止される。
【００６８】
（Ｓ１２、Ｓ１３）ｐ＝０かつｑ＝０であれば、スレッドＴｈ２を生成し開始させる。
【００６９】
（Ｓ１４）ｐ＝ｎであり、かつ、ｑ＝ｊｅ（ｎ）であれば処理を終了し、そうでなければステップＳ１５へ進む。
【００７０】
（Ｓ１５）バンド・ブロック番号変数群１３３３の変数Ｃの内容（ｐ，ｑ）を上記のように更新する。
【００７１】
（Ｓ１６）バンド・ブロック番号変数群１３３３の変数Ｒの内容ｉｊを見てＲｐｑの処理が完了しているか否かを判定し、すなわち、０≦ｑ≦ｊｅ（ｐ）−１のときはｉ＝ｐ且つｊ＝ｑ＋１であるか否かを判定しｑ＝ｊｅ（ｐ）のときはｉ＝ｐ＋１且つｊ＝０であるか否かを判定し、肯定判定した場合にはステップＳ１０へ戻る。
【００７２】
図６（Ｂ）は、スレッドＴｈ３での処理を示すフローチャートである。
【００７３】
（Ｓ２０）バンド・ブロック番号変数群１３３３の変数Ｄの内容（ｒ，ｓ）を読み出し、伸長部１４２に対し伸張Ｄｐｑの処理を開始させる。この際、伸長部１４２には、伸張対象先頭アドレスとしてＣバンド配列１３３０の要素ｉの内容と、伸張データ格納先先頭アドレスとしてＢバンド配列１３３２の要素ｋの内容が供給される。ここにｋは、ｒを３で割ったときの剰余である。
【００７４】
（Ｓ２１）伸長部１４２の処理完了イベント発生を待つ。このイベント発生により、ウエイト状態が解除されてステップＳ２２へ進む。ウエイト状態解除前は、ＯＳにより直ぐに次のスレッドに切り替えられる。
【００７５】
（Ｓ２２）ｒ＝ｎであり、かつ、ｓ＝ｊｅ（ｎ）−１であれば処理を終了し、そうでなければステップＳ２３へ進む。
【００７６】
（Ｓ２３）バンド・ブロック番号変数群１３３３の変数Ｄの内容（ｒ，ｓ）を上記のように更新する。
【００７７】
（Ｓ２４）バンド・ブロック番号変数群１３３３の変数Ｃの内容ｐｑを見てＣｒｓの処理が完了しているか否かを判定し、すなわち、０≦ｓ≦ｊｅ（ｒ）−１のときはｐ＝ｒ且つｑ＝ｓ＋１であるか否かを判定しｓ＝ｊｅ（ｒ）のときはｐ＝ｒ＋１且つｑ＝０であるか否かを判定し、肯定判定した場合にはステップＳ２０へ戻る。
【００７８】
以上のような処理により、１頁分の圧縮データ（頁データ）が圧縮データ領域１３３Ｃ上に生成される。制御部１２３はこれに応答して、上記３スレッドとは別の、制御部１２３に含まれるスレッドＴｈＰを生成し開始させる。
【００７９】
スレッドＴｈＰでは、エンジンコントローラ１７のデータ入力がレディ状態であることを確認して、この頁データをバンド順次に、伸長部１４３を介し、伸長させエンジンコントローラ１７へ転送させる。この際、バンドｉに関しては、伸長部１４３に、伸長対象データ先頭アドレスとしてＣバンド配列１３３０の要素ｉの内容と、転送先アドレスとしてエンジンコントローラ１７のアドレスとが供給される。
【００８０】
エンジンコントローラ１７は、転送されたビットマップデータを受け取ってそのバッファメモリに格納した後、直列データに変換しさらにビデオ信号に変換してプリントエンジン２１へ供給する。プリントエンジン２１は、この信号とエンジンコントローラ１７からの制御信号とに基づき、感光ドラムに静電潜像を形成させ、これにトナーを付着させて現像し、そのトナー像を用紙に転写させ、加熱及び加圧によりトナー像を用紙に定着させる。一方、ＣＰＵ１１は、プログラムに従って、搬送コントローラ１８を介し用紙搬送装置２２に対し用紙をプリントエンジン２１へ搬送させ、印刷された用紙を搬送させてトレイ上に排紙させる。
【００８１】
図９は、圧縮された頁データの伸長・転送処理と他の処理とを示す概略タイムチャートである。
【００８２】
このような処理により、スレッドＴｈ０〜Ｔｈ２による２頁目の各バンドの伸長・ラスタライズ・圧縮処理と、スレッドＴｈＰによる１頁目の頁データ伸長・転送処理とが並列に実行され、３頁目についても同様である。
【００８３】
本実施例１によれば、ビットマップデータ領域１３３Ｂが３バンド分で足りるので、必要なメモリ容量の増大を抑制することができ、また、３バンド分が伸長、ラスタライズ及び圧縮に関し互いにずれて並列処理されるので、圧縮及び伸長のそれぞれを殆ど連続的に行うことができ、印刷データを高速にビットマップ展開することができるという効果を奏する。さらに、伸長、ラスタライズ及び圧縮のそれぞれが異なるタスクで並列処理されるので、比較的簡単に圧縮及び伸長のそれぞれを殆ど連続的に行うことができるという効果を奏する。
【００８４】
また、圧縮１チャンネル伸長２チャンネルのハードウェア圧縮伸長プロセッサ１４を用いるとともに、圧縮・伸長プロセッサ１４に対する伸長及び圧縮の開始制御を上記のようなスレッドＴｈ１、Ｔｈ２及びＴｈＰで実行しているので、これらの処理のＣＰＵ負荷が比較的小さい。このため、これらスレッドによるスレッドＴｈ０の処理遅延が比較的小さく、また、並列処理により、全体として効率よく高速処理することが可能となる。さらに、多スレッド化によりプログラム構造が簡単化されるので、開発期間を短縮して製造コストを削減することが可能となる。
【００８５】
なお、伸長部１４３をエンジンコントローラ１７に備えてエンジンコントローラ１７側で伸長させることにより、頁データ転送効率を高めてもよい。
【実施例２】
【００８６】
上記実施例１では、ディスプレイリスト作成とラスタライズの処理を直列に行っていたが、両者を別スレッドにして並列処理することも可能であり、これを本発明の実施例２として以下に説明する。
【００８７】
図１２に示すように、ディスプレイリストのみの処理を行うスレッドＴｈ３を、スレッドＴｈ０よりも前に生成して開始させ、バンド順次ブロック順次に（ｉ，ｊ）を更新して中間コードブロックＬｉｊの作成処理を行う。
【００８８】
図１１は、この場合のスレッドＴｈ０での処理を示すフローチャートである。図５の処理と異なるのは、ステップＳ２及びＳ５の替わりにステップＳ３ａにおいて、伸張Ｄｉ（ｊ−１）のみならず中間コードブロックＬｉｊの作成完了も待つ点である。中間コードブロックＬｉｊの作成完了を通知するために、１３３３に変数Ｌを追加し、スレッドＴｈ３で１ブロックの中間コード作成処理を完了する毎に、バンド番号及びブロック番号を更新する。
【００８９】
図１３は、バンドＢＮＤ０〜ＢＮ２毎に図１２の処理を再配列したものを示す図である。
【００９０】
他の点は、実施例１と同じである。
【００９１】
本実施例２によれば、ディスプレイリスト作成とラスタライズとが並列処理させるので、それぞれの処理が簡単になり、また、ラスタライズの休止期間に対するラスタライズ実行時間が比較的小さいので、時分割並列処理におけるディスプレイリスト作成とラスタライズとの間の切り替えのオーバヘッドが比較的小さくなり、全体として効果的である。
【実施例３】
【００９２】
上記実施例１及び２では、伸長開始制御とラスタライズと圧縮開始制御とをそれぞれ異なるスレッドで実行するとともに、各スレッドで３バンド分をバンド順次に処理する場合を説明したが、各スレッドで１バンド分の伸長開始制御とラスタライズと圧縮開始制御とを実行することもできる。この場合、３スレッドのそれぞれは、変数領域のみ互いに異なる同一関数を用いることができる。
【００９３】
圧縮及び伸長のそれぞれについては同時に１バンド分しか処理できないので、スレッド間で同期を取る必要がある。このため、図１５に示す如く、サブ領域ＢＭＰｋ、ｋ＝０〜２のそれぞれについて、圧縮完了フラグＦｃ（ｋ）及び伸長完了フラグＦｄ（ｋ）を、共有メモリ１３３内に備える。共有メモリ１３３内にはまた、図３のバンド・ブロック番号変数群１３３３の替わりに、中間コードブロックの作成がどこまで完了しているかを示すバンド・ブロック番号変数１３３３ａが備えられている。図１５の他の点は図３と同一である。
【００９４】
図１６は、スレッドＴｈ０Ａ、Ｔｈ１Ａ、Ｔｈ２Ａ及びＴｈ３と、圧縮部１４１及び伸長部１４２の処理との概略タイミングチャートである。図１６では複雑化を避けるため、圧縮及び伸長とスレッドとの間の関係を示す点線はスレッドＴｈ０Ａについてのみ記載している。
【００９５】
スレッドＴｈ３は図１２のそれと同じであり、スレッドＴｈ０Ａ〜Ｔｈ２Ａと並列に処理される。スレッドＴｈ０Ａ、Ｔｈ１Ａ及びＴｈ２Ａはそれぞれ、スレッドＴｈ３で中間コードブロックＬ００、Ｌ１０及びＬ２０の作成が完了したタイミングで生成され開始される。この生成及び開始は、スレッドＴｈ３で行っても、不図示の別スレッドで行ってもよい。
【００９６】
図１２では、圧縮Ｃｉｊ及び伸長Ｄｉｊの２番目のインデックスｊはブロック番号を表していたが、図１６での対応する２番目のインデックスはサブ領域ＢＭＰｋのｋを示している。そこで、図１４ではこれらをＣｉｋ及びＤｉｋと表している。すなわち、圧縮Ｃｉｋは、サブ領域ＢＭＰｋのビットマップデータを圧縮してバンドｉの圧縮データ領域に格納することを意味し、伸長Ｄｉｋは、バンドｉの圧縮データ領域に格納されているデータを伸長してサブ領域ＢＭＰｋに格納することを意味する。
【００９７】
図１４は、スレッドＴｈ０Ａ〜Ｔｈ２Ａのうちの任意のスレッドＴｈｋで実行される処理を示すフローチャートである。
【００９８】
（Ｓ３０）バンド識別変数ｉにｋを代入し、このバンドのブロック識別変数ｊに初期値０を代入する。
【００９９】
（Ｓ３１）サブ領域ＢＭＰｋをゼロクリアする。
【０１００】
（Ｓ３２）中間コードブロックＬｉｊの作成が完了していれば、ステップＳ３３へ進む。
【０１０１】
（Ｓ３３）ラスタライズＲｉｊの処理を行う。
【０１０２】
（Ｓ３４）圧縮Ｃｉ（ｋ−１）が完了するのを待つ。すなわち、スレッドＴｈ（ｋ−１）Ａで開始制御された圧縮部１４１の処理完了イベントが発生すると、そのイベントハンドラにおいて、図１５の圧縮完了フラグＦｃ（ｋ−１）の値が１であれば、この値を０にしてステップＳ３５へ進み、そうでなければこのイベントハンドラを抜け、ＯＳにより次のスレッドに切り替えられる。ただし、Ｃｉ（ｋ−１）及びＦｃ（ｋ−１）において、ｋ＝０の場合にはｋ＝３とみなす。圧縮部１４１の処理完了イベントが発生していないウエイト状態解除前は、ＯＳにより直ぐに次のスレッドに切り替えられるので、図１４の処理遅延が防止される。この点は、他のウエイト状態についても同様である。
【０１０３】
（Ｓ３５）圧縮部１４１に対し圧縮Ｃｉｋの処理を開始させる。この際、圧縮部１４１には、圧縮データ格納先先頭アドレスとしてＣバンド配列１３３０の要素ｉの内容と、圧縮対象データ先頭アドレスとしてＢバンド配列１３３２の要素ｋの内容とが供給される。
【０１０４】
（Ｓ３６）ステップＳ３５で開始制御された圧縮部１４１の処理完了イベントが発生すると、そのイベントハンドラにおいて、図１５の圧縮完了フラグＦｃ（ｋ）の値を１にして、ステップＳ３７へ進む。
【０１０５】
（Ｓ３７）（ｉ，ｊ）を実施例１で述べたようにバンド順次ブロック順次における次の値にする。
【０１０６】
（Ｓ３８）ｊ＝ｊｅ（ｉ）であればステップＳ３Ｃへ進み、そうでなければステップＳ３９へ進む。
【０１０７】
（Ｓ３９）伸長Ｄｉ（ｋ−１）が完了するのを待つ。すなわち、図１５の伸長完了フラグＦｄ（ｋ−１）の値が１であれば、この値を０にしてステップＳ３Ａへ進む。ただし、Ｄｉ（ｋ−１）及びＦｄ（ｋ−１）において、ｋ＝０の場合にはｋ＝３とみなす。
【０１０８】
（Ｓ３Ａ）伸長部１４２に対し伸張Ｄｉｋの処理を開始させる。この際、伸長部１４２には、伸張対象先頭アドレスとしてＣバンド配列１３３０の要素ｉの内容と、伸張データ格納先先頭アドレスとしてＢバンド配列１３３２の要素ｋの内容が供給される。
【０１０９】
（Ｓ３Ｂ）ステップＳ３Ａで開始制御された伸長部１４２の処理完了イベントが発生すると、そのイベントハンドラにおいて、図１５の伸長完了フラグＦｄ（ｋ）の値を１にしてステップＳ３２へ進む。
【０１１０】
（Ｓ３Ｃ）ｉを３だけインクリメントし、また、ｊを０に初期化する。
【０１１１】
（Ｓ３Ｄ）ｉ＞ｎであれば処理を終了し、そうでなければステップＳ３１へ戻る。
【０１１２】
他の点は、実施例１と同じである。
【０１１３】
本実施例３によれば、３バンド分について圧縮及び伸長のそれぞれをほぼ連続的に行うことができるので、印刷データを高速にビットマップ展開することができる。
【０１１４】
また、１つのバンドについて伸長、ラスタライズ及び圧縮の一連の処理が１つのスレッド内でシーケンシャルに行われるので、その同期をスレッド間で取る必要がない。
【０１１５】
また、スレッドＴｈ０Ａ〜Ｔｈ２Ａで共通の関数を用いることができるので、実施例１及び２の場合よりもメモリ使用量を削減することができる。
【０１１６】
さらに、ディスプレイリスト作成がスレッドＴｈ０Ａ〜Ｔｈ２Ａと異なるスレッドで実行されるので、スレッドＴｈ０Ａ〜Ｔｈ２Ａの各々でディスプレイリストを作成する場合よりもオーバヘッドが少なくなり、処理効率がよい。
【０１１７】
同様に、スレッドＴｈ０Ａ〜Ｔｈ２Ａの各々で頁データ伸長・転送制御する場合よりも別スレッドＴｈＰで頁データ伸長・転送制御した方が、オーバヘッドが少なくなり、処理効率がよい。
【実施例４】
【０１１８】
図１７は、本発明の実施例４に係る、ホストコンピュータから印刷データを受信した後、中間言語に変換する迄の部分の機能ブロック図である。ラスタライズ以降の処理は図１と同じである。
【０１１９】
この実施例４では、制御部１２３Ａがホストコンピュータから通信インターフェイス１５を介した印刷要求を受け付けると、印刷データ前処理部１２４のスレッドを生成する。印刷データ前処理部１２４はこれに応答して、通信インターフェイス１５を介し受信した１頁分の印刷データ１３２１をヒープメモリ１３２に格納する。制御部１２３Ａは、改ページコマンド受信毎に、印刷データ前処理部１２４のスレッドを生成する。印刷データ前処理部１２４は、図１の制御部１２３の一部に相当し、図１７の制御部１２３Ａは、図１の制御部１２３からこの印刷データ前処理部１２４を除いたものに相当する。
【０１２０】
ＥＥＰＲＯＭ１２（図２１）には特定の書体のフォントファイル１２５が格納されており、印刷データ前処理部１２４は、印刷データがこの書体を使用している場合、フォントファイル１２５を参照し印刷データ中の文字コード列を文字列イメージ１３２１ａに変換する。この際、フォントキャッシュ１３２２にその文字コードの文字イメージが存在すればこれを用い、存在しなければ、これを文字イメージに変換してフォントキャッシュ１３２２に格納する。印刷データ前処理部１２４は、図形オブジェクトを台形等の基本図形に変換することにより、図１のＲＩＰ１２２での処理時間を短縮させてもよい。
【０１２１】
印刷データ前処理部１２４は、受信開始時にインタープリタ１２１のスレッドを生成する。
【０１２２】
インタープリタ１２１は、これに応答して、印刷データ前処理部１２４による処理と並列して、上記実施例１で述べた処理を行い、ヒープメモリ１３２にディスプレイリスト１３２３を１頁分作成する。文字列イメージ１３２１ａは、印刷データ１３２１内のイメージオブジェクトと同様に（実施例１参照）、ディスプレイリスト１３２３内のポインタによりリンクされている。
【０１２３】
印刷データ前処理部１２４及びインタープリタ１２１はそれぞれ、ヒープメモリ管理部１２６を介してヒープメモリ１３２内の領域の確保及び解放を行う。
【０１２４】
図１８は、ヒープメモリ管理部１２６関係の構成を示す概略ブロック図である。
【０１２５】
ヒープメモリ管理部１２６は、メモリ割当メソッド１２６０と、メモリ解放メソッド１２６１と、カウントメソッド１２６２とを備えている。メモリ割当メソッド１２６０及びメモリ解放メソッド１２６１はそれぞれ、印刷データ前処理部１２４又はインタープリタ１２１とは別のスレッドで実行される。一方、ＲＡＭ１３の一部領域であるスタティックメモリ１３４には、ヒープメモリ管理部１２６で使用されるヒープメモリ上印刷データ残存頁数１３４０とヒープメモリ上ディスプレイリスト残存頁数１３４１とが確保される。ここに「残存頁数」は、処理中の頁も含む頁数である。
【０１２６】
印刷データ残存頁数１３４０の初期値は０であり、印刷データ前処理部１２４は、印刷データ１３２１をヒープメモリ１３２内に１頁読み込む毎にカウントメソッド１２６２を介し印刷データ残存頁数１３４０を１だけインクリメントし、インタープリタ１２１からの解放指令に応答して、メモリ解放メソッド１２６１を介し該当頁の印刷データ１３２１（ディスプレイリスト１３２３からリンクされているイメージは対象外）をメモリから解放させ、カウントメソッド１２６２を介し印刷データ残存頁数１３４０を１だけデクリメントする。この解放指令は、インタープリタ１２１が１頁分のディスプレイリスト作成を終了したときに供給される。
【０１２７】
ディスプレイリスト残存頁数１３４１の初期値は０であり、インタープリタ１２１は、ディスプレイリスト１３２３をヒープメモリ１３２内に１頁作成する毎にカウントメソッド１２６２を介しディスプレイリスト残存頁数１３４１を１だけインクリメントし、図１のＲＩＰ１２２からの解放指令に応答して、メモリ解放メソッド１２６１を介し該当頁のディスプレイリスト１３２３をメモリから解放させ、カウントメソッド１２６２を介しディスプレイリスト残存頁数１３４１を１だけデクリメントする。この解放指令は、ＲＩＰ１２２が１頁分のラスタライズを終了したときに供給される。
【０１２８】
メモリ割当メソッド１２６０は、後述の所定条件を満たしていないことによりメモリ解放メソッド１２６１による解放を待っても要求サイズの記憶領域を確保できないないと判断した場合に、ガベージコレクタＧＣを呼び出す。メモリ解放メソッド１２６１は、メモリ割当メソッド１２６０と並列に実行される。このガベージコレクタＧＣは、システム側（ランタイムライブラリ内）であっても、アプリケーション側プログラムであってもよい。
【０１２９】
従来では、該条件を満たしているか否かを判定せずに、要求サイズの記憶領域を確保できないないと判断した場合にガベージコレクタＧＣが呼び出されていたので、処理に遅延が生ずる原因となっていた。しかし、本実施例４によれば、該条件を満たしている場合にはメモリ解放を待ってメモリ確保処理を行うので、ガベージコレクタＧＣが呼び出される確率が低減して、ガベージコレクタＧＣの実行による処理遅延を抑制できるという効果を奏する。
【０１３０】
ガベージコレクタＧＣ実行中に他のスレッドが動作していると、オブジェクト参照が変化してガベージコレクションに誤りが生ずる。また、コンパクション中にコピー元のデータが変化するとコピーに誤りが生ずる。
【０１３１】
そこで、ＯＳの機能であるバイナリセマフォを使用して、ヒープメモリ１３２を使用する、ヒープメモリ管理部１２６外のスレッド、本実施例４では印刷データ前処理部１２４のスレッドとインタープリタ１２１のスレッドとが動作を停止するのを待ってから、ガベージコレクタＧＣの実行を開始させる。
【０１３２】
図１９は、ヒープメモリ１３２を使用する、ヒープメモリ管理部１２６外の任意のスレッドＡでの、主にセマフォのロック獲得とロック解放とを示すフローチャートである。
【０１３３】
ステップＳ４１での本体処理(１頁分の処理)の前処理として、ステップＳ４０において、自スレッドＡに対応したセマフォのロックを獲得し、ステップＳ４１の後処理としてこのロックを解放させる。
【０１３４】
これにより、メモリ割当メソッド１２６０のスレッド（スレッドＢ）においてガベージコレクタＧＣ呼び出し前（図２０のステップＳ５８）にこのセマフォのロックを獲得しようとすると、スレッドＡに対応したセマフォのロックが既に獲得されていた場合、スレッドＢは、ＯＳにより待ち行列に入れられて、ステップＳ１２の処理終了までウエイト状態となる。
【０１３５】
またステップＳ４１内において、ステップＳ４１１でメモリ割当メソッド１２６０を呼び出す場合、その前処理として、ステップＳ４１０で、自スレッドＡに対応したセマフォのロックを解放させ、ステップＳ４１１の後処理としてこのロックを獲得する。
【０１３６】
これにより、スレッドＡがメモリ割当メソッド１２６０のスレッド（スレッドＢ）を生成してメモリ割当要求した場合、スレッドＢはガベージコレクタＧＣ呼び出し前（図２０のステップＳ５８）にスレッドＡに対応したセマフォを獲得できるので、スレッドＡ、Ｂ間でのデッドロックが回避される。
【０１３７】
図２０は、メモリ割当メソッド１２６０の処理を示すフローチャートである。このメソッドのスレッドＢは、印刷データ前処理部１２４又はインタープリタ１２１がヒープメモリ割当要求する際に、印刷データ前処理部１２４又はインタープリタ１２１により生成される。
【０１３８】
（Ｓ５０）要求サイズの記憶領域の確保可否を判定し、肯定判定した場合には該確保を実行する。
【０１３９】
（Ｓ５１）ステップＳ５０で確保できた場合には図２０の処理を終了（スレッドＢが自動消滅）し、そうでない場合にはステップＳ５２へ進む。
【０１４０】
（Ｓ５２）ディスプレイリスト残存頁数１３４１の値が２以上であれば、１頁分のディスプレイリスト１３２３の解放が間近と推定できるので、ステップＳ５３へ進み、そうでなければステップＳ５４へ進む。
【０１４１】
（Ｓ５３）ディスプレイリスト残存頁数１３４１がデクリメントされてイベントが発生するのを待つ。このデクリメントイベント発生に応答して、ステップＳ５０へ戻る。
【０１４２】
（Ｓ５４）ディスプレイリスト１３２３の完了バンド数ｉがｉｔ未満（ラスタライズ開始条件未満）であればステップＳ５５へ進み、そうでなければステップＳ５６へ進む。ここで、図１４のステップＳ３２での待ち時間を無くするために、原則としてｉ＝ｉｔである場合に図１４の処理が開始される。
【０１４３】
（Ｓ５５）この原則の例外として、図１４の処理を開始させることにより、図１４の処理が終わってディスプレイリスト１３２３が１頁分解放されるのを待ち、ステップＳ５０へ戻る。
【０１４４】
（Ｓ５６）印刷データ前処理部１２４からのメモリ割当要求であればステップＳ５７へ進み、そうでなければステップＳ５８へ進む。
【０１４５】
（Ｓ５７）フォントファイル１２５を解放させて、ステップＳ５０へ戻る。この場合、ステップＳ５１で否定判定したときにはステップＳ５１からステップＳ５８へ進む（不図示）。
【０１４６】
（Ｓ５８）ヒープメモリ１３２を使用する、ヒープメモリ管理部１２６外の各スレッドに対応したセマフォのロックを獲得する。獲得できない場合、スレッドＢは、この獲得ができるまでＯＳにより待ち行列に入れられる。本実施例４では、印刷データ前処理部１２４とインタープリタ１２１の一方のスレッドからのメモリ割当要求であり、該一方についてはステップＳ４１１の処理によりセマフォのロックを直ぐに獲得できるので、他方のスレッドがステップＳ４２を処理するまで、スレッドＢはＯＳにより待ち行列に入れられる。
【０１４７】
（Ｓ５９）ガベージコレクタＧＣを呼び出す。
【０１４８】
ステップＳ５８でウエイト中にインタープリタ１２１の処理が終了した場合、ラスタライズが終了して参照されなくなったディスプレイリスト１３２３中のバンド及びこれにリンクされた、印刷データ１３２１中のイメージデータが、ガベージコレクタＧＣにより解放され、その量は比較的多い。このため、ガベージコレクション実行により確保可能になる連続領域が比較的大きくなって効率よくガベージコレクションを実行することができるとともに、これによりガベージコレクション実行回数を低減してヒープメモリ確保遅延を抑制することが可能となる。
【０１４９】
（Ｓ５Ａ）ヒープメモリ１３２を使用する、ヒープメモリ管理部１２６外の各スレッドに対応したセマフォのロックを解放する。
【０１５０】
（Ｓ５Ｂ）要求サイズの記憶領域の確保可否を判定し、肯定判定した場合には該確保を実行する。
【０１５１】
（Ｓ５Ｃ、Ｓ５Ｄ）ステップＳ５Ｂで確保できなかった場合には、メモリフルエラーの異常表示を操作パネル２０に表示させてプリントジョブを異常終了する。
【０１５２】
なお、本発明には外にも種々の変形例が含まれる。
【０１５３】
例えば、バンド・ブロック番号変数群１３３３のデータ更新は、ラスタライズ等の処理開始前であってもよいことは勿論である。
【０１５４】
また、上記実施例では、２つのビットマップデータの合成が、一方のビットマップデータに対する他方のビットマップデータの上書きである場合を説明したが、ビットマップデータ間の論理演算を行うことによる合成であってもよい。
【０１５５】
さらに、マルチタスクとして、マルチスレッドの替わりにマルチプロセスを用いてもよい。
【０１５６】
さらにまた、ＣＰＵ１１としてダブルコアＣＰＵを用い、一方のコアと圧縮・伸張プログラムとの組を圧縮・伸長プロセッサとして用いる構成であってもよい。この場合、圧縮処理と伸張処理とをマルチタスク処理する。
【０１５７】
また、メモリ割当メソッド１２６０は、ステップＳ５０〜Ｓ５７の処理に特徴があるので、セマフォを用いずにメモリ割当メソッド１２６０から、印刷データ前処理部１２４とインタープリタ１２１のうち動作中のスレッドを停止させて、ガベージコレクタＧＣを実行させる構成であってもよい。また、該動作中のスレッドを停止させずに、これによりエラーが生じたら該エラーを修正する公知の方法を適用してもよい。
【０１５８】
さらに、メモリ割当メソッド１２６０は、ステップＳ５８〜Ｓ５Ａの処理にも特徴があるので、この場合にはステップＳ５２〜Ｓ５７の処理を含まない構成であってもよい。
【０１５９】
また、図１９のステップＳ４１１での本体処理は１頁分に限定されず、所定バンド数などの所定量であればよい。
【０１６０】
また、印刷データ前処理部１２４又はインタープリタ１２１を複数の機能に分割してそれぞれをスレッドで実行する構成であってもよい。
【図面の簡単な説明】
【０１６１】
【図１】本発明の実施例１〜３に係る、ホストコンピュータから受信した印刷データをビットマップ展開する部分の機能ブロック図である。
【図２】ディスプレイリストのデータ構造説明図である。
【図３】ラスタライズ、圧縮及び伸張に関係したデータ構造説明図である。
【図４】バンド処理順説明図である。
【図５】スレッドＴｈ０で行われるディスプレイリスト作成及びラスタライズの処理を示すフローチャートである。
【図６】（Ａ）はスレッドＴｈ１で行われる圧縮処理のフローチャートであり、（Ｂ）はスレッドＴｈ２で行われる伸張処理のフローチャートである。
【図７】図５、図６（Ａ）及び図６（Ｂ）での処理結果の一部を示す概略タイミングチャートである。
【図８】バンドＢＮＤ０〜ＢＮ２毎に図７の処理を再配列したものを示す図である。
【図９】圧縮された頁データの伸長・転送処理と他の処理とを示す概略タイムチャートである。
【図１０】（Ａ）〜（Ｃ）は、ディスプレイリスト概略説明図である。
【図１１】本発明の実施例２に係るディスプレイリスト作成及びラスタライズの処理を示すフローチャートである。
【図１２】実施例２での処理結果の一部を示す概略タイミングチャートである。
【図１３】バンドＢＮＤ０〜ＢＮ２毎に図１２の処理を再配列したものを示す図である。
【図１４】本発明の実施例３に係るスレッドＴｈ０Ａ〜Ｔｈ２Ａの任意の１つで実行される処理を示すフローチャートである。
【図１５】本発明の実施例３に係るラスタライズ、圧縮及び伸張に関係したデータ構造説明図である。
【図１６】実施例３での処理結果の一部を示す概略タイミングチャートである。
【図１７】本発明の実施例４に係る、ホストコンピュータから印刷データを受信した後中間言語に変換する迄の部分の機能ブロック図である。
【図１８】図１７中のヒープメモリ管理部関係の構成を示す概略ブロック図である。
【図１９】ヒープメモリを使用する、ガベージコレクタ以外の任意のスレッドでの主にセマフォのロックの獲得と解放とを示すフローチャートである。
【図２０】図１８中のメモリ割当メソッドの処理を示すフローチャートである。
【図２１】本発明の実施例１〜４に係る画像形成装置のハードウェア構成を示す概略ブロック図である。
【符号の説明】
【０１６２】
１０  画像形成装置
１１  ＣＰＵ
１２  ＥＥＰＲＯＭ
１２１  インタープリタ
１２２  ＲＩＰ
１２３  制御部
１２４  印刷データ前処理部
１２５  フォントファイル
１２６  ヒープメモリ管理部
１２６０  メモリ割当メソッド
１２６１  メモリ解放メソッド
１２６２  カウントメソッド
１３  ＲＡＭ
１３１  バッファメモリ
１３２  ヒープメモリ
１３２１  印刷データ
１３２１ａ  文字列イメージ
１３２２  フォントキャッシュ
１３２３  ディスプレイリスト
１３３  共有メモリ
１３４  スタティックメモリ
１３４０  印刷データ残存頁数
１３４１  ディスプレイリスト残存頁数
１３３Ｃ  圧縮データ領域
１３３Ｂ  ビットマップデータ領域
１３２０  Ｌバンド配列
１３３０  Ｃバンド配列
１３３１  ブロック最大番号配列
１３３２  Ｂバンド配列
１３３３  バンド・ブロック番号変数群
１４  圧縮・伸長プロセッサ
１４１  圧縮部
１４２、１４３  伸長部
１５  通信インターフェイス
１６  パネルインターフェイス
１７  エンジンコントローラ
１８  搬送コントローラ
１９  バス
２０  操作パネル
２１  プリントエンジン
２２  用紙搬送装置
３０  印刷データ
３１〜３４  図形オブジェクト
４０〜４３  バンド
Ｔｈ０〜Ｔｈ３、Ｔｈ０Ａ、Ｔｈ１Ａ、Ｔｈ２Ａ、ＴｈＰ  スレッド
Ｌ０〜Ｌｎ  ディスプレイリスト
Ｌｉｊ  中間コードブロック
Ｒｉｊ  ラスタライズ
Ｃｐｑ  圧縮
Ｄｒｓ  伸長
ＢＮＤ０〜ＢＮＤ２  バンド
ＢＭＰ０〜ＢＭＰ２  サブ領域
ＧＣ  ガベージコレクタ
【図１】
0005150214.tif 000002
【図２】
0005150214.tif 000003
【図３】
0005150214.tif 000004
【図４】
0005150214.tif 000005
【図５】
0005150214.tif 000006
【図６】
0005150214.tif 000007
【図７】
0005150214.tif 000008
【図８】
0005150214.tif 000009
【図９】
0005150214.tif 000010
【図１０】
0005150214.tif 000011
【図１１】
0005150214.tif 000012
【図１２】
0005150214.tif 000013
【図１３】
0005150214.tif 000014
【図１４】
0005150214.tif 000015
【図１５】
0005150214.tif 000016
【図１６】
0005150214.tif 000017
【図１７】
0005150214.tif 000018
【図１８】
0005150214.tif 000019
【図１９】
0005150214.tif 000020
【図２０】
0005150214.tif 000021
【図２１】
0005150214.tif 000022