(57)【要約】【課題】マルチコアプロセッサーを利用してパケットを処理する際、マルチコアプロセッサーのリソースを有効利用できるようにする。【解決手段】送信コントロール部112には、処理が完了したデータパケットがストアされる複数の出力バッファが設けられている。出力バッファは、例えば、出力ポート毎に設けられている。ワークコントロール部120は、受信したデータパケットに対する処理を複数のサブワークに分割し、複数のコア130上で実行されている複数のスレッド131の何れかに割り当てる。その際、使用率が所定の閾値を超える出力キューに関連するサブワークについては、スレッド131の割り当てを制限する。【選択図】図１
2010226275.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサーコアと、
処理の完了したパケットがストアされる複数の出力キューと、
受信したパケットに対する処理を複数のサブワークに分割し、該各サブワークを前記プロセッサーコア上で実行されるスレッドに割り当てるワークコントロール部とを備え、
前記ワークコントロール部は、前記複数の出力キューの中に輻輳している出力キューが存在する場合は、該輻輳している出力キューをストア先にしているパケットに関連するサブワークについてはスレッドの割り当てを制限することを特徴とする通信装置。
【請求項２】
請求項１に記載の通信装置において、
前記輻輳している出力キューは、使用率が第１の閾値を超える出力キューであることを特徴とする通信装置。
【請求項３】
請求項１または２に記載の通信装置において、
前記サブワークに対するスレッドの割り当ての制限は、前記サブワークに対するスレッドの割り当てを禁止することであることを特徴とする通信装置。
【請求項４】
請求項１または２に記載の通信装置において、
前記サブワークに対するスレッドの割り当ての制限は、前記サブワークに対するスレッドの割り当て頻度を他のスレッドに比較して少なくすることであることを特徴とする通信装置。
【請求項５】
請求項１乃至４の何れか１項に記載の通信装置において、
前記出力キューにストアされているパケットは、そのパケットに関する全てのサブワークが完了した後、送出されることを特徴とする通信装置。
【請求項６】
請求項１乃至５の何れか１項に記載の通信装置において、
前記ワークコントロール部は、前記複数のサブワークを前記プロセッサーコア上で実行されるスレッドに割り当てる際、優先度の高いサブワークから優先的にスレッドを割り当てることを特徴とする通信装置。
【請求項７】
請求項６に記載の通信装置において、
パケットのストア先にする出力キューを決定するサブワークの優先度を他のサブワークよりも高くすることを特徴とする通信装置。
【請求項８】
請求項６に記載の通信装置において、
前記出力キュー毎の処理待ちパケット出力キューであって、処理が未完了のパケットをストアし、処理が完了したパケットを自処理待ちパケット出力キューに対応する出力キューへ出力する処理待ちパケット出力キューを備え、
使用率が第２の閾値以上の処理待ちパケット出力キューに関連するサブワークの優先度を他のサブワークよりも高くすることを特徴とする通信装置。
【請求項９】
請求項１乃至８の何れか１項に記載の通信装置において、
前記プロセッサーコアは複数存在することを特徴とする通信装置。
【請求項１０】
ワークコントロール部が、受信したパケットに対する処理を複数のサブワークに分割する第１のステップと、
前記ワークコントロール部が、サブワークをプロセッサーコア上で実行される複数のスレッドの内の何れかに割り当てる際、処理が完了したパケットがストアされる複数の出力キューの中に輻輳している出力キューが存在する場合は、該輻輳している出力キューをストア先にしているパケットに関連するサブワークについてはスレッドの割り当てを制限する第２のステップとを含むことを特徴とする通信方法。
【請求項１１】
請求項１０に記載の通信方法において、
前記輻輳している出力キューは、使用率が第１の閾値を超える出力キューであることを特徴とする通信方法。
【請求項１２】
請求項１０または１１に記載の通信方法において、
前記サブワークに対するスレッドの割り当ての制限は、前記サブワークに対するスレッドの割り当てを禁止することであることを特徴とする通信方法。
【請求項１３】
請求項１０または１１に記載の通信方法において、
前記サブワークに対するスレッドの割り当ての制限は、前記サブワークに対するスレッドの割り当て頻度を他のスレッドに比較して少なくすることであることを特徴とする通信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パケットの転送処理技術に関する。
【背景技術】
【０００２】
複数の入力ポートと複数の出力ポートとを備え、入力ポートから入力されたパケットをその宛先やQoSクラスに応じた出力ポートから出力する、パケットの転送処理を行う通信装置は、従来から種々のものが知られている（例えば、特許文献１参照）。
【０００３】
特許文献１に記載されている通信装置は、マルチコアプロセッサーを用いて構成されており、異なるIPフローに属するパケットに対する処理（デフラグメント処理、IPSec復号化処理、ネットワークアドレス変換処理など）を異なるプロセッサーコアで並列に処理することにより、スループットを向上させるようにしている。ここで、マルチコアプロセッサーとは、２つ以上のプロセッサーコアを１個のパッケージに集積したマイクロプロセッサーである。また、異なるIPフローに属するパケットとは、IPヘッダー、TCPヘッダーについて異なる5-tuple情報を持つパケットである。5-tuple情報とはIPパケットの「あて先IPアドレス」、「ソースIPアドレス」、「プロトコル番号」、TCP／UDPヘッダーの「あて先ポート番号」、「ソースポート番号」の5つの情報を指す。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特表２００８−５１２９５０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、プロセッサーによる処理の完了したパケットは、その出力先もしくはQoSクラスに対応した出力キューを介して外部に送出されるが、対応する出力キューが輻輳しバッファのオーバーフローが発生すると、処理済みのパケットが出力キューで破棄されてしまう。この場合、最終的に廃棄されたパケットに対して、プロセッサー処理能力、メモリー等のリソースが使用されるため、リソースが有効活用されていないことになる。しかし、特許文献１においては、このようなことは全く考慮されていない。なお、このような問題は、マルチコアプロセッサーを利用した通信装置特有のものではなく、シングルコアプロセッサーを利用した通信装置においても発生する。
【０００６】
［発明の目的］
そこで、本発明の目的は、リソースを有効利用し、パケットに対する処理を効率的に行えるようにすることにある。
【課題を解決するための手段】
【０００７】
本発明にかかる第１の通信装置は、
プロセッサーコアと、
処理の完了したパケットがストアされる複数の出力キューと、
受信したパケットに対する処理を複数のサブワークに分割し、該各サブワークを前記プロセッサーコア上で実行されるスレッドに割り当てるワークコントロール部とを備え、
前記ワークコントロール部は、前記複数の出力キューの中に輻輳している出力キューが存在する場合は、該輻輳している出力キューをストア先にしているパケットに関連するサブワークについてはスレッドの割り当てを制限する。
【０００８】
本発明にかかる第１の通信方法は、
ワークコントロール部が、受信したパケットに対する処理を複数のサブワークに分割する第１のステップと、
前記ワークコントロール部が、サブワークをプロセッサーコア上で実行される複数のスレッドの内の何れかに割り当てる際、処理が完了したパケットがストアされる複数の出力キューの中に輻輳している出力キューが存在する場合は、該輻輳している出力キューをストア先にしているパケットに関連するサブワークについてはスレッドの割り当てを制限する第２のステップとを含む。
【発明の効果】
【０００９】
本発明によれば、廃棄される可能性が高いパケットの処理に向けられていたプロセッサー処理能力、メモリなどのリソースの割り当てを、廃棄される可能性が低い他のパケットの処理に向けることが可能となり、通信装置が備えているリソースを有効利用することが可能になるという効果を得ることができる。
【図面の簡単な説明】
【００１０】
【図１】図１は本発明にかかる通信装置の第１の実施の形態の構成例を示すブロック図である。
【図２】図２は主に受信コントロール部111の処理を説明するための図である。
【図３】図３はワークテーブル、パケットエレメントテーブル、および、アクションテーブルの関係を示す図である。
【図４】図４は送信コントロール部112の構成例を示すブロック図である。
【図５】図５はワークコントロール部120の構成例を示すブロック図である。
【図６】図６はパケットエレメントテーブル210の構成例を示す図である。
【図７】図７はワークテーブル211の構成例を示す図である。
【図８】図８はスレッド131の処理例を示すフローチャートである。
【図９】図９は本発明にかかる通信装置の第２の実施の形態で使用するワークコントロール部120の構成例を示すブロック図である。
【図１０】図１０は第２の実施の形態で利用するワークテーブル211の構成例を示す図である。
【発明を実施するための形態】
【００１１】
次に、本発明の第１の実施の形態について図面を参照して詳細に説明する。
【００１２】
図１を参照すると、本発明の第１の実施の形態にかかる通信装置は、データパケットの転送処理を行うものであり、データパケット（単にパケットという場合もある）を受信する受信インタフェース部101と、処理済みのデータパケットを送信する送信インタフェース部102とを備えている。なお、図示を省略したが、受信インタフェース部101、送信インタフェース部102は、それぞれ複数の受信ポート、送信ポートを備えている。
【００１３】
受信インタフェース部101及び送信インタフェース部102は、それぞれスイッチ部103a,103bを介してマルチコアプロセッサー部105内の受信コントロール部111及び送信コントロール部112に接続されている。ここで、スイッチ部103aは、複数のマルチコアプロセッサー部150の内のどのマルチコアプロセッサー部へデータパケットを出力すべきかを決定する機能を持っている。この場合、IPデータパケットの「あて先IPアドレス」、「ソースIPアドレス」、「プロトコル番号」などの情報からハッシュ関数を用いて算出した値をもとに、出力先のマルチコアプロセッサー部を決定する等の方式をとることが可能である。つまり、データパケットのIPフローに応じて出力先のマルチコアプロセッサー部を決定することが可能である。また、スイッチ部103bは、各マルチコアプロセッサー部150からのデータパケットを送信インタフェース部102へ出力する機能を持っている。
【００１４】
また、受信コントロール部111及び送信コントロール部112はマルチコアプロセッサー部150の内部のバスインタフェース160と接続されており、それぞれ受信インタフェース部101から渡されたデータパケットをバスインタフェース160へ出力する機能、およびバスインタフェース160を介して送られてくるマルチコアプロセッサー部150の外部へのデータパケットをスイッチ103bを介して送信インタフェース部102に渡す機能を持っている。
【００１５】
マルチコアプロセッサー部150の内部には複数のコア130 が配置されており、各コア130は、それぞれバスインタフェース160を介して、ワークコントロール部120、メインメモリ140、受信コントロール部111、送信コントロール部112に接続されている。また、各コア130はそれぞれ複数のスレッド131を同時に実行できる構成となっている。受信コントロール部111は、新規に受信したデータパケットをメインメモリ140にストアすると共に、ワークコントロール部120に対して上記データパケットの処理をワークという形で受け渡し、ワークに対するスレッド131の割り当てを依頼する機能を有する。
【００１６】
ワークコントロール部120は、ワークを複数のサブワークに分割し、各サブワークにコア130上で実行されるスレッド131を割り当てる機能を有する。ここで、サブワークとしては、例えば、送信コントロール部112が備えている複数の出力キューの内のどの出力キューにデータパケットを格納するのかを決定する処理、デフラグメント処理、IPSec復号化処理、IPSec暗号化処理、ネットワークアドレス変更処理などがある。更に、ワークコントロール部120は、送信コントロール部112が備えている複数の出力キューの中に輻輳している出力キューが存在している場合は、その出力キューを格納先にしているパケットに関するサブワークについてはスレッド131の割り当てを制限する機能を有する。この機能により、将来的に廃棄される可能性が高いパケットによってリソースが消費されることを防ぐことができる。
【００１７】
各コア130上で実行されるスレッド131は、ワークコントロール部120によってサブワークが割り当てられると、割り当てられたサブワークに応じた処理命令を実行する。ワーク処理のための入力情報、行うべき命令(アクション)はメインメモリ140から入手し、また、処理結果である出力情報はメインメモリ140に対して書き込む。また、処理の過程で得られたさらに細分化されたサブワークをワークコントロール部120に対して発行し、該当サブワークに対する他のスレッド131の割り当てを依頼することが可能である。
【００１８】
送信コントロール部112は、データパケットの送信先毎（出力ポート毎）、もしくはQoSクラス毎の出力キューを備えており、出力タイミングをスケジューリングした上で、スイッチ部103bを介して送信インタフェース部102へと送信する。更に、送信コントロール部112は、上記複数の出力キューの内の何れかに輻輳が発生した場合、輻輳の発生した出力キューを示す情報をワークコントロール部120に渡す機能を有する。
【００１９】
受信インタフェース部101にて受信されたデータパケットは、スイッチ部103aを介してマルチコアプロセッサー部150の受信コントロール部111へと転送される。図２を参照すると、受信コントロール部111は、新規に受信したデータパケット201について、エレメントIDと呼ばれるユニークなID情報およびワークIDと呼ばれるユニークなID情報を採番する。採番したエレメントIDは、上記データパケット201を識別するために利用され、ワークIDは、データパケット201に対する処理（ワーク）を複数のサブワークに階層的に分割した際の最上位のサブワークを識別するために利用される。
【００２０】
また、受信コントロール部111は、受信したデータパケット201や、採番したエレメントIDおよびワークIDなどを含む情報をパケットエレメントテーブル210と呼ばれる形でメインメモリ140に格納すると共に、採番したワークIDおよびエレメントIDや、ワークの処理内容などを含む情報をワークテーブル211と呼ばれる形でメインメモリ140に格納する。更に、受信コントロール部111は、採番したエレメントIDおよびワークIDをそれぞれ送信コントロール部112およびワークコントロール部120へ送信する。なお、パケットエレメントテーブル210及びワークテーブル211については、図６及び図７を参照して後で詳しく説明する。
【００２１】
送信コントロール部112は、受信コントロール部111から渡されたエレメントIDをパケットキュー群220に格納し、パケット送信スケジューラー230を用いてスケジューリングする。そして、送出するデータパケットを決定すると、そのデータパケットをメインメモリ140から読み出し、送信インタフェース部102へ送る。なお、送信コントロール部112の詳細な構成及び動作については、後で、図４を参照して説明する。
【００２２】
また、ワークコントロール部120は、受信コントロール部111から渡されたワークIDをワークキュー群221に格納し、その後、ワークスケジューラー231を用いてどのサブワークをどのスレッド131に割り当てるのかを決定する。そして、割り当て先の決定したサブワークのワークIDを割り当て先のスレッド131に渡す。また、ワークコントロール部120は、コア130上で動作しているスレッド131からサブワークIDが渡された場合も、同様の処理を行う。なお、ワークコントロール部120の詳細な構成及び動作については、後で、図５を参照して詳細に説明する。
【００２３】
ここで、図３を参照して、データパケット201を管理するパケットエレメントテーブル210と、このデータパケット201についての各サブワークを管理するワーク管理テーブル211との関係について説明する。
【００２４】
データパケット201の受信時、受信コントロール部111は、上記データパケット201を管理するためのパケットエレメントテーブル210と、上記データパケット201に対する各サブワークの内の、最上位階層（第１階層）のサブワークを管理するためのワークテーブル211を生成する。この２つのテーブル210、211には、同一のエレメントID及びワークID301が設定されており、エレメントIDによって両テーブル210、211は関連付けられるようになっている。データパケット201に関連する各サブワークのワークテーブル211には、そのワークテーブル固有のワークIDが設定されると共に、自ワークテーブルの親及び子を示すワークIDが設定されており、これらによりワークテーブルの階層関係を認識できるようになっている。
【００２５】
各サブワークで行われる具体的な処理内容はアクションと呼ばれており、メインメモリ140内に保存されているアクションテーブル310にその処理命令が記述されている。アクションテーブル310には、各サブワークに関連する処理命令が、それぞれ異なるアクションID302に関連付けて登録されており、各サブワークのワークテーブル211には、そのサブワークで実行する処理命令を示すアクションIDが登録されている。従って、アクションIDによって、サブワークとそのサブワークで実行する処理命令とを関連付けることができる。
【００２６】
図４を参照すると、送信コントロール部112は、パケットキュー群220と、パケット送信スケジューラー230とを備えている。
【００２７】
パケットキュー群220は、出力先振り分けパケットキュー402、処理待ちパケット出力キュー群401、および、出力キュー群403から構成されている。
【００２８】
処理待ちパケット出力キュー群401は、データパケットの出力インタフェース（出力ポート）ごと、もしくはQoSクラスごとの処理待ちパケット出力キューを備え、出力キュー群403も出力インタフェースごと、もしくはQoSクラスごとの出力キューを備えている。図４では処理待ちパケット出力キュー群401および出力キュー群403は、それぞれN個の処理待ちパケット出力キューおよび出力キューから構成されており、各処理待ちパケット出力キューおよび出力キューには、#1〜#Nの出力キューIDと呼ばれる識別子が付与されている。出力キューIDが#1〜#Nの処理待ちパケット出力キューから出力されるエレメントIDは、同一の出力キューIDを持つ出力キューに入力される。また図４に示すように、処理待ちパケット出力キュー群401の前段には、出力先振り分けパケットキュー402が配置されており、出力キューIDがまだ確定していないデータパケットに関して、そのエレメントIDをストアする。
【００２９】
受信コントロール部111から送信コントロール部112に送付されたデータパケット201のエレメントIDは、最初に出力先振り分けパケットキュー402にストアされる。このキュー402は、FIFO(First In First Out)の原則に従って、エレメントIDを処理待ちパケット出力キュー群401内の何れかのキューに振り分ける機能を持っている。出力先振り分けパケットキュー402は、キューからエレメントIDを出力する際に、出力するエレメントIDに対応したパケットエレメントテーブル（そのテーブルを識別するための情報として、上記エレメントIDと同一のエレメントIDが設定されているパケットエレメントテーブル、図６参照）をチェックする。このパケットエレメントテーブルに、出力キューIDが記録済みであれば（出力キューID有効ビットが“１”であれば）、処理待ちパケット出力キュー群401内の対応するキューへ該当エレメントIDの振り分けを行う。例えば、パケットエレメントテーブルに出力キューIDとして#3が記録されている場合は、処理待ちパケット出力キュー群401内のN個のキューの内、出力キューIDが#3の処理待ちパケット出力キューにエレメントIDを振り分ける。出力キューIDがパケットエレメントテーブルに記録されていない場合は、記録されるまで待ち続ける。なお、パケットエレメントテーブル210への出力キューIDの記録は、コア130で実行されているスレッド131によって行われるものである。スレッド131の動作については、後で図８を参照して詳しく説明する。
【００３０】
処理待ちパケット出力キュー群401内の各キューにストアされたエレメントIDは、FIFOの原則に従って、同一の出力キューIDを持つ、出力キュー群403内の出力キューへと送信される。処理待ちパケット出力キュー群401は、キューからエレメントIDを出力する際に、対応したパケットエレメントテーブルをチェックする。該当するデータパケットに関するすべてのサブワークが完了し、ワーク完了ビットが“１”になっている場合、出力キュー群403内の対応する出力キューへエレメントIDの転送を行う。該当するパケットエレメントテーブルのワーク完了ビットが“０”になっている場合は、ワーク完了ビットが“１”になるまで待ち続ける。なお、ワーク完了ビットの設定は、コア130で実行されているスレッド131によって行われるものである。
【００３１】
パケット送信スケジューラー230は、出力キュー群403を構成する各出力キューの先頭にストアされているエレメントIDを順次読み出し、読み出したエレメントIDに対応するデータパケットをメインメモリ140から読み出して送信インタフェース部102の該当する出力ポート（エレメントIDを読み出した出力キューに対応する出力ポート）へ送信する。また、パケット送信スケジューラー230は、出力キュー403群内の輻輳した出力キューを検出するため、出力キューの使用率を監視している。そして、使用率が予め定められている閾値を超える出力キューが発生した場合には、その出力キューに輻輳が発生したと判断し、その出力キューの出力キューIDを含んだ輻輳通知をワークコントロール120へ送信する。また、使用率が閾値以下に戻った出力キューが発生した場合には、その出力キューの出力キューIDを含んだ輻輳解消通知をワークコントロール部120へ送信する。なお、閾値は、例えば80％程度とすることができる。
【００３２】
図５を参照すると、ワークコントロール部120は、図２に示したワークキュー群221を構成するワーク出力キュー群501及び出力先振り分けワークキュー502と、ワークスケジューラー231と、ラウンドロビン機能部511、512と、出力キューIDチェックポイント521とを備えている。ワーク出力キュー群501は、処理待ちパケットキュー群401や出力キュー群403と同様にN個のワーク出力キューから構成されており、#1〜#Nの出力キューIDによって識別することができる。
【００３３】
ワークコントロール部120は、受信コントロール部111或いはコア130上で実行されているスレッド131からワークIDが入力されると、このワークIDが所属するパケットエレメントテーブル（このワークIDによって示されるサブワークの生成元のパケットエレメントテーブル）の状態に応じて、このワークIDの分配先（ストア先）にするキューを決定する。具体的には、パケットエレメントテーブル210に出力キューID（図６参照）が記録済みであれば、ワーク出力キュー群501を構成するN個のキューの内の、上記出力キューIDによって特定されるキューに、ワークIDを分配する。これに対して、出力キューIDがパケットエレメントテーブルに記録されていない状態であれば、ワークIDを出力先振り分けワークキュー502へと分配する。
【００３４】
ワーク出力キュー群501を構成するN個のワーク出力キュー、および、出力先振り分けワークキュー502にストアされたワークIDは、FIFOの原則に従って、それぞれラウンドロビン機能部511、ラウンドロビン機能部512を経由して、ワークスケジューラー231へと配信される。つまり、ワークスケジューラー231は、各コア130に属するスレッド131の処理状況を確認し、ワークを処理していないスレッド131を見つけた場合は、ラウンドロビン機能部511、ラウンドロビン機能部512を経由して、ワーク出力キュー群501を構成するN個のワーク出力キュー、或いは、出力先振り分けワークキュー502からワークIDを引き取り、このワークIDを上記見つけたスレッド131に割り当てる。ここで、出力キューIDチェックポイント521は、出力先振り分けワークキュー502からワークID情報が引き出された場合に、該当ワークIDが所属するデータパケットのパケットエレメントテーブルの状態を再度チェックし、出力キューIDがパケットエレメントテーブルに記録済みであれば、ワーク出力キュー501へのワークIDの再振り分けを行うものである。出力キューIDがパケットエレメントテーブルに記録済みでなければ、ワークスケジューラー231はそのままワークIDを引き取る。
【００３５】
ワークコントロール部120は、送信コントロール部112内の出力キュー群403を構成するN個の出力キューの使用率が全て閾値以下である場合には、上述した処理を行う。これに対して、使用率が閾値を超える出力キューが発生した場合には、その出力キューに対応したワーク出力キューからのワークIDの出力を制限する。このようにする理由は、データパケットの出力キューが何らかの理由で輻輳状態にある場合、該当出力キューがオーバーフローしてしまう可能性があるためである。該当出力キューがオーバーフローして対応するデータパケットが廃棄された場合、該当するデータパケットに対応するワークに費やされたマルチコアプロセッサーの処理能力が無駄になってしまう。そこで、本実施の形態では、データパケットの出力キュー群403を構成するN個の出力キューの中に使用率がある一定の閾値を超える出力キューが発生した場合、該当出力キュー403が輻輳状態であるとみなし、該当出力キューに対応したワーク出力キューからのワークIDの出力を制限することで、将来的に廃棄される可能性が高いデータパケットに対する処理(サブワーク)へのスレッド131のアサイン（割り当て）を後回しにし、他の廃棄される可能性が少ないパケットに対する処理（サブワーク）をスレッド131にアサインすることができる。
【００３６】
ここで、具体例を挙げて使用率が閾値を超える出力キューが発生した場合の動作について説明する。今、例えば、出力キュー群403を構成するN個の出力キューの内、出力キューIDが#1の出力キューの使用率が閾値を超えたとする。なお、以下の説明では、出力キューIDが#jの出力キューや、ワーク出力キューなどを、出力キュー#jや、ワーク出力キュー#jと記す場合がある。パケット送信スケジューラー230は、上記出力キュー#1の使用率が閾値を超えたことを検出すると、出力キューID「#1」を含んだ輻輳通知をワークコントロール部120へ送信する。
【００３７】
ワークコントロール部120内のワークスケジューラー231は、送信コントロール部112から出力キューID「#1」を含んだ輻輳通知が送られてくると、ワーク出力キュー群501を構成するN個のワーク出力キュー#1〜#Nの内の、ワーク出力キュー#１からのワークIDの出力を制限する。具体的には、例えば、ラウンドロビン機能部512に対して、ワーク出力キュー#1からのワークIDの読み出しを禁止することを指示する。これにより、ワーク出力キュー#1からはワークIDが出力されなくなる。あるいは、例えば、ラウンドロビン機能部512に対して、ワーク出力キュー#1からは、M回（Mは２以上の整数）の走査につき１回だけストアされているワークIDを読み出すことを指示する。これにより、ワーク出力キュー#1から出力されるワークIDの数は、他のワーク出力キュー#2〜#Nから出力されるワークIDの数の1/Mとなる。
【００３８】
また、送信コントロール部112内のパケット送信スケジューラー230は、出力キュー#1の使用率が閾値以下に戻ったら、出力キューID「#1」を含んだ輻輳解消通知をワークコントロール部120へ送信する。これにより、ワークコントロール部120内のワークスケジューラー231は、ラウンドロビン機能部512に対して、輻輳通知受信時に行った制限を解除することを指示する。これにより、パケット出力キュー#1からも他のパケット出力キュー#2〜#Nと同様にワークIDが出力される。
【００３９】
次に、図６および図７を参照して、パケットエレメントテーブル210およびワークテーブル211について説明する。
【００４０】
先ず、図６を参照してパケットエレメントテーブル210の各構成要素について説明する。
【００４１】
・エレメントID…データパケット201の受信時に受信コントロール部111で採番されたエレメントIDが設定される。
・エレメントID有効ビット…エレメントIDが有効か否か、つまり、該当パケットエレメントテーブル210が有効か否かを表示する。
【００４２】
・ワークID…データパケット201の受信時に受信コントロール部111で採番されたワークIDが設定される。
・ワークID有効ビット…ワークIDが有効か否かを表示する。
【００４３】
・ワーク処理結果…ワークの処理結果が設定される。
・ワーク完了ビット…データパケット201に関するワークが完了したか否かを表示する。
【００４４】
・出力キューID…送信コントロール部112のパケットキュー220について、該当パケットがどの出力キュー403から出力されるのかを示すID情報を記載する［データパケット201の格納先にする出力キューのID（出力キューID）が設定される］。
・出力キューID有効ビット…出力キューIDが有効か否かを表示する。
【００４５】
・パケットキュー種別表示フィールド…該当パケットエレメントテーブル210のエレメントIDが、送信コントロール部112に設けられている出力先振り分けパケットキュー402、処理待ちパケット出力キュー群401または出力キュー群403の内の何れに収容されているかを表示する。
【００４６】
・パケットキュー先行エレメントID…パケットキュー群220において、このパケットエレメントテーブル210の生成元となったデータパケットのエレメントIDの前段に先行して収容されているエレメントIDを表示する。
・パケットキュー先行エレメントID有効ビット…パケットキュー群220において、このパケットエレメントテーブル210の生成元となったデータパケットのエレメントIDの前段に先行して収容されているエレメントIDが存在するか否かを表示する。
【００４７】
・パケットキュー後続エレメントID…パケットキュー群220において、このパケットエレメントテーブル210の生成元となったデータパケットのエレメントIDの後段に後続して収容されているエレメントIDを表示する。
・パケットキュー後続エレメントID有効ビット…パケットキュー群220において、このパケットエレメントテーブル210の生成元となったデータパケットのエレメントIDの後段に後続して収容されているエレメントIDが存在するかどうかを表示する。
【００４８】
・データパケット…データパケットの内容がストアされる。
【００４９】
次に、図７を参照してワークテーブル211の構成要素について説明する。
【００５０】
・ワークID…このワークテーブル211によって管理されるサブワーク（該当サブワーク）を特定するID情報である。
・ワークID有効ビット…ワークIDが有効か否か、つまり、該当ワークテーブル211の情報が有効か否かを示す。
【００５１】
・エレメントID…該当サブワークの生成元となっているデータパケットを示すエレメントIDが設定される。言い換えれば、該当サブワークによって処理が行われるデータパケットのエレメントIDが設定される。
・エレメントID有効ビット…エレメントIDが有効か否かを表示する。
【００５２】
・アクションID…該当サブワークが実際に行う処理(アクション)の内容を示したアクションテーブル310（図３参照）のID情報を示す。
・アクションID有効ビット…アクションIDが有効か否かを表示する。
【００５３】
・割り当てスレッドID…該当サブワークを割り当てるスレッド131のIDが設定される。
・割り当てスレッド完了ビット…該当サブワークに対するスレッド割り当てが完了し、割り当てスレッドIDが有効になったか否かを表示する。
【００５４】
・親ワークID…該当サブワークの生成元となった親サブワークがあれば、親サブワークのID情報を表示する。
・親ワークID有効ビット…親サブワークID情報が有効か否かを表示する。該当サブワークの生成元となった親サブワークが無ければ“０”を設定する。
【００５５】
・ワークキューID…このワークテーブル121のワークIDがワークコントロール部120内のどのキューにストアされているかを表示する。
・ワークキュー割り当て完了ビット…該当ワークテーブル121のワークID情報がワーク出力キュー501に割り当てられたか否かを表示する。
【００５６】
・ワークキュー先行ワークID…ワークキュー群221において、このワークテーブル121のワークIDの前段に先行して収容されているワークIDを表示する。
・ワークキュー先行ワークID有効ビット…ワークキュー群221において、このワークテーブル121のワークIDの前段に先行して収容されているワークIDが存在するか否かを表示する。
【００５７】
・ワークキュー後続ワークID…ワークキュー群221において、このワークテーブル121のワークIDの後段に後続して収容されているワークIDを表示する。
・ワークキュー後続ワークID有効ビット…ワークキュー群221において、このワークテーブル121のワークIDの後段に後続して収容されているワークIDが存在する否かを表示する。
【００５８】
・処理経過情報…該当サブワークの処理を実行した結果をこのフィールドに随時アップデートして記録する。
【００５９】
・サブワークID…該当サブワークの配下にサブワークが存在していれば、サブワークIDをテーブルに追加する。
・サブワークID発行完了ビット…該当サブワークの発行が完了しているか否かを表示する。
【００６０】
・サブワークアクションID…該当サブワークが実行するアクションのID情報を記録する。
・サブワーク入力データ…該当サブワークを発行する際、入力データとして使用したい値があれば記載する。
【００６１】
・サブワークID結果情報…該当サブワークが実行完了した際に得られた実行結果情報を記録する。
・サブワークID結果有効ビット…該当サブワークが実行完了して、サブワークID結果情報が有効になっているかどうかを表示する。
【００６２】
なお、最下位階層のワークテーブルには、項目「サブワークID発行完了ビット」「サブワークID」「サブワークアクションID」「サブワーク入力データ」「サブワークID結果有効ビット」「サブワークID結果情報」は存在しない。
【００６３】
次に、受信コントロール111がデータパケット201を受信した際に行うパケットエレメントテーブルの生成処理およびワークテーブルの生成処理について、図６および図７を参照して説明する。
【００６４】
先ず、図６を参照してパケットエレメントテーブル210の生成処理について説明する。パケットエレメントテーブル210の生成処理においては、各項目に対して次のような設定を行う。
【００６５】
・エレメントID…データパケット201の受信時に採番したエレメントIDを設定する。
・エレメントID有効ビット…エレメントIDが有効であることを示す“１”を設定する。
【００６６】
・ワークID…データパケット201の受信時に採番したワークIDを設定する。
・ワークID有効ビット…ワークIDが有効であることを示す“１”を設定する。
【００６７】
・ワーク処理結果…未処理であることを設定する。
・ワーク完了ビット…ワークが完了していないことを示す“０”を設定する。
【００６８】
・出力キューID…何も設定しない。出力キューIDは、サブワークが割り当てられたスレッドによって設定される。
・出力キューID有効ビット…出力キューIDが無効であることを示す“０”を設定する。
【００６９】
・パケットキュー種別表示フィールド…何も設定しない。このフィールドは、送信コントロール部112によって設定される。
【００７０】
・パケットキュー先行エレメントID…何も設定しない。この項目は、送信コントロール部112によって設定される。
・パケットキュー先行エレメントID有効ビット…無効であることを示す“０”を設定する。
【００７１】
・パケットキュー後続エレメントID…何も設定しない。この項目は、送信コントロール部112によって設定される。
・パケットキュー後続エレメントID有効ビット…無効であることを示す“０”を設定する。
【００７２】
・データパケット…受信したデータパケット201を設定する。
【００７３】
次に、図７を参照してワークテーブル210の生成処理について説明する。ワークテーブル210の生成処理においては、各項目に対して次のような設定を行う。
【００７４】
・ワークID…データパケット201の受信時に採番したワークIDを設定する。
・ワークID有効ビット…ワークIDが有効であることを示す“１”を設定する。
【００７５】
・エレメントID…データパケット201の受信時に採番したエレメントIDを設定する。
・エレメントID有効ビット…エレメントIDが有効であることを示す“１”を設定する。
【００７６】
・アクションID…最上位のサブワークでのアクションが定義されたアクションIDを設定する。
・アクションID有効ビット…アクションIDが有効であることを示す“１”を設定する。
【００７７】
・割り当てスレッドID…何も設定しない。この項目は、ワークコントロール部120によって設定される。
・割り当てスレッド完了ビット…スレッドへの割り当てが完了していないことを示す“０”を設定する。
【００７８】
・親ワークID…自身が最上位階層のサブワークであり、親ワークは存在しないので、何も設定しない。
・親ワークID有効ビット…親ワークIDが無効であることを示す“０”を設定する。
【００７９】
・ワークキューID…この項目はワークコントロール部120によって設定されるので、何も設定しない。
・ワークキュー割り当て完了ビット…ワークキュー群への割り当てが完了していないことを示す“０”を設定する。
【００８０】
・ワークキュー先行ワークID…この項目はワークコントロール部120によって設定されるので、何も設定しない。
・ワークキュー先行ワークID有効ビット…ワークキュー先行ワークIDが無効であることを示す“０”を設定する。
【００８１】
・ワークキュー後続ワークID…この項目はワークコントロール部120によって設定されるので、何も設定しない。
・ワークキュー後続ワークID有効ビット…ワークキュー後続ワークIDが無効であることを示す“０”を設定する。
【００８２】
・処理経過情報…任意 (データパケット201中の特定フィールドを設定することも可能)
【００８３】
・サブワークID…自サブワークに対して予め定められているサブワークそれぞれについてサブワークIDを採番し、設定する。
・サブワークID発行完了ビット…未発行を示す“０”を設定する。
【００８４】
・サブワーク入力データ…該当サブワークを発行する際、入力データとして使用したい値があれば記録する。
・サブワークアクションID…サブワークで実施するアクションのアクションIDを設定する。
【００８５】
・サブワークID結果情報…この項目は、スレッドによって設定されるので、何も設定しない。
・サブワークID結果有効ビット…サブワークID結果情報が無効であることを示す“０”を設定する。
【００８６】
受信コントロール部111は、メインメモリ140上にパケットエレメントテーブル210及びワークテーブル211を生成すると、最上位階層のサブワークのワークIDをワークコントロール部120に送付して該当サブワークへのスレッドへの割り当てを依頼すると共に、データパケット201のエレメントIDを送信コントロール部112へ送付する。なお、以下では、最上位階層のサブワークをサブワークW1と記す。また、サブワークW1のワークIDがID「IDW1」であり、データパケット201のエレメントIDが「ID201」であるとする。
【００８７】
ワークコントロール部120では、受信コントロール部111から送られてきた最上位階層のサブワークW1のワークID「IDW1」を出力先振り分けワークキュー502にストアし、送信コントロール部112では、受信コントロール部111から送られてきたエレメントID「ID201」を出力先振り分けパケットキュー402にストアする。
【００８８】
その後、ワークコントロール部120内のワークスケジューラー231によって、最上位階層のサブワークW1にスレッド131が割り当てられる。ワークスケジューラー231は、最上位のサブワークW1にスレッド131を割り当てると、該当するワークテーブル211に割り当てスレッドIDとして上記スレッドのIDを設定すると共に、割り当てスレッド完了ビットを“１”とする。
【００８９】
スレッド131は、最上位階層のサブワークW1のワークID「IDW1」が割り当てられると、図８のフローチャートに示す処理を開始する。
【００９０】
スレッド131は、先ず、該当ワークID「IDW1」のワークテーブル211に対して排他制御を実施する（ステップ１）。ここで排他制御の設定および解除手順について下記に定義する。
【００９１】
[排他制御の設定手順]
・他のスレッドが該当ワークID「IDW1」のワークテーブル211に対して排他制御を行っているかどうかを確認する。
・他のスレッドが排他制御を行っている場合は排他制御が解除されるまで待ち続ける。他のスレッドが排他制御を行っている場合、下記の動作となる。
→該当スレッドは該当ワークIDのサブワークを実行できない
→該当スレッドは該当ワークIDのワークテーブル211にアクセスできない
・他のスレッドによる排他制御が行われていない場合は該当ワークID「IDW1」のワークテーブル211に対して排他制御を設定し、他のスレッドが該当ワークIDのワークを実行できず、なおかつ該当ワークID「IDW1」のワークテーブル211にアクセスできないようにする。
【００９２】
[排他制御の解除手順]
・該当ワークID「IDW1」のワークテーブル211に対する排他制御を解除し、他のスレッドが該当ワークID「IDW1」のワークを実行できるようにすると共に、該当ワークID「IDW1」のワークテーブル211にアクセスできるようにする。
【００９３】
その後、スレッド131は、該当ワークテーブル211に設定されているアクションIDを参照し、対応するアクションテーブルに記載されている命令（命令列）を実行する（ステップ２）。命令を実行する際に引き渡す入力データと実行後に期待される出力データは下記になる。なお、命令を実行した後は、アクションID有効ビットを“０”とする。なお、命令列は、サブワークの初回発行時と再発行時とで処理内容を異なるものにすることができる。
【００９４】
［入力データ］ワークID、アクションID、処理経過情報、各サブワークIDの結果情報
［出力データ］処理経過情報 (情報をアップデートする)、サブワークID、サブワークアクションID、サブワーク入力データ、出力キューID
【００９５】
今、例えば、ステップ２において、データパケット201をストアする出力キューを決定したとすると、スレッド131は、上記出力キューの出力キューID（例えば、#1とする）をデータパケット201用のパケットエレメントテーブル210に設定すると共に、出力キューID有効ビットを“１”とする。これにより、送信コントロール部112は、出力先振り分けパケットキュー402にストアされている、データパケット201を特定するエレメントIDを処理待ちパケット出力キュー群401を構成するキューの内の、出力キューIDが#1のキューにストアする。なお、パケットエレメントテーブル210に出力キューIDを設定するなど、パケットエレメントテーブル210を更新する場合には、パケットエレメントテーブル210に対して排他制御を実施した上で更新を行い、その後、排他制御を解除する。
【００９６】
その後、スレッド131は、サブワークW1についてのワークテーブル211のサブワークID発行完了ビットに基づいて、未発行のサブワークがあるか否かを判定する（ステップ３）。そして、全て“１”となっている場合は、未発行のサブワークが無いと判断してステップ４へ進み、そうでない場合は、未発行のサブワークがあると判断してステップ13へ進む。なお、ワークテーブルに項目「サブワークID発行完了ビット」が存在しない場合は、未発行のサブワークが無いと判断するものとする。今、処理対象にしているサブワークW1は、最上位階層のサブワークであり、まだ、サブワークの発行処理を行っていないので、スレッド131は、ステップ13に進む。
【００９７】
ステップ13において、スレッド131は、未発行のサブワーク（第２階層のサブワーク）の発行処理を行う。具体的には、最上位のサブワークW1のワークテーブル211を参照し、サブワークID発行完了ビットが“０”となっているサブワークIDそれぞれについて、メインメモリ140上に新規のワークテーブルを生成する。その後、ワークコントロール部120へ該当サブワークID（第２階層のサブワークのサブワークID）を送付する。なお、ワークテーブルの生成方法は、前述した最上位階層のワークテーブルの生成方法と下記の点を除いて同じである。また、この例では、m個のサブワークが発行されたとし、各サブワークをサブワークW21〜W2mと記す。また、該当サブワークが属するデータパケットが廃棄されている場合はサブワークの発行を行わない(この場合、該当ワークが属するパケットエレメントテーブルのエレメントIDが“０”となっていることで判別可能である)。
【００９８】
・アクションID…最上位のサブワークW1のワークテーブル211中のアクションIDを設定する。
・親ワークID…該当サブワークW2i（1≦i≦ｍ）の発行元となったサブワークW1のワークIDを設定する。
・親ワークID有効ビット…“１”を設定する。
・処理経過情報…サブワークID入力データを使用する。
【００９９】
その後、スレッド131は、サブワークW1のワークテーブル211に対する排他制御を解除し、その処理を終了する。
【０１００】
一方、第２階層のサブワークW2iのサブワークID（IDW2iとする）が渡されたワークコントロール部120は、このサブワークW2iの生成元となったデータパケット201のパケットエレメントテーブル210の出力キューID（#1が設定されている）を参照し、上記サブワークID「IDW2i」を、ワーク出力キュー群501を構成するワーク出力キューの内の、出力キューIDが#1のキューにストアする。その後、ワークコントロール部120内のワークスケジューラー231は、この第２階層のサブワークID「IDW2i」にスレッド131（最上位階層のサブワークIDを割り当てたスレッドと同じスレッドである場合もあるし、異なるスレッドである場合もある）を割り当てる。
【０１０１】
第２階層のサブワークID「IDW2i」が割り当てられたスレッド131は、前述したステップ１、２の処理を行った後、未発行のサブワークが存在するか否かを判定する（ステップ３）。今、第２階層が最下位層であるとすると、項目「サブワークID発行完了ビット」が存在しないので、スレッド131は、未発行のサブワークが無いと判断してステップ４に進む。
【０１０２】
ステップ４では、未完了のサブワークが存在するか否かを判定する。未完了のサブワークが存在するか否かは、現在処理対象にしているサブワークW2iのワークテーブルに設定されているサブワークID結果有効ビットに基づいて行う。即ち、サブワークID結果有効ビットが全て“１”である場合には未完了のサブワークが無いと判断し、そうで無い場合は未完了のサブワークが存在すると判断する。また、ワークテーブルに項目「サブワークID結果有効ビット」が無い場合も、未完了のサブワークが無いと判断する。現在処理対象にしているサブワークW2iは最下位階層のサブワークであり、そのワークテーブルには項目「サブワークID結果有効ビット」が存在しないので、スレッド131は、未完了のサブワークが無いと判断し、ステップ５に進む。
【０１０３】
ステップ５では、現在処理対象にしているサブワークW2iを発行した、親となるサブワークが存在するか否かを判断する。具体的には、サブワークW2iのワークテーブルに登録されている親ワークID有効ビットが“１”であれば、親となるサブワークが存在すると判断し、“０”であれば、親となるサブワークが存在しないと判断する。そして、親となるサブワークが存在する場合には、ステップ６に進み、存在しない場合は、ステップ１４へ進む。この例の場合、処理対象にしているサブワークW2iは、第２階層のサブワークであり、親となるサブワークW1が存在するので、ステップ６へ進むことになる。
【０１０４】
ステップ6では、サブワークW2iの親となるサブワークW1のワークテーブルに対する排他制御を行う。次のステップ7では、サブワークW1に設定されているサブワークID結果情報の内、現在実行中のワークID「IDW2i」と一致するものを更新し、更に、サブワークID結果有効ビットを“１”に変更する。
【０１０５】
次の、ステップ8では、処理対象にしているサブワークW2iの親となるサブワークW1において、全てのサブワークW21〜W2mが完了しているか否かを、サブワークW1のサブワークID結果有効ビットが全て“１”になっているか否かに基づいて判断する。そして、全てが“１”になっている場合は、サブワークW1の全てのサブワークW21〜W2mが完了していると判断してステップ9に進み、そうでない場合はステップ10に進む。
【０１０６】
ステップ9では、サブワークW2iの親であるサブワークW1のワークID「IDW1」をワークコントロール部120へ送信し、サブワークW1へのスレッド131の割り当てを要求する。次のステップ10では、サブワークW1のワークテーブルに対する排他制御を解除する。ステップ11では、サブワークW2i及びそれよりも下位のサブワークの処理が完了したと判断し、サブワークW2iのワークテーブルのワークID有効ビットを“０”とする。そして、最後に、現在処理対象にしているサブワークW2iのワークテーブルに対する排他制御を解除する（ステップ12）。
【０１０７】
ステップ9においてワークコントロール部120に送信された最上位階層のサブワークW1のワークID「IDW1」は、ワーク出力キュー群501内の出力キューIDが「#1」のキューにストアされ、ワークスケジューラー231によってスレッド131が割り当てられる。
【０１０８】
最上位階層のサブワークW1が割り当てられたスレッド131は、前述したステップ１、２の処理を行った後、未発行のサブワークがあるか否かを調べる（ステップ３）。この例では、既にサブワークW1は、全てのサブワークW21〜W2mを発行済みであり、該当するワークテーブルのサブワークID発行完了ビットが“１”となっているので、ステップ３の判断結果はＮ（Ｎｏ）となり、ステップ４の処理が行われる。
【０１０９】
ステップ４では、サブワークW1に未完了のサブワークが存在するか否かを調べる。この例では、未完了のサブワークは存在しないので、ステップ４の判断結果はＮとなり、ステップ５の処理が行われる。
【０１１０】
ステップ５では、サブワークW1に親となるサブワークが存在するか否かを調べる。この例では、サブワークW1は最上位階層のサブワークであるので判断結果はＮとなり、ステップ14の処理が行われる。
【０１１１】
ステップ14では、サブワークW1のワークテーブルの処理経過情報や、サブワークW1配下のサブワークW21〜W2mのワークテーブルのサブワークID結果情報を使用して、ワーク発生元となったデータパケット201のパケットエレメントテーブル210を更新（例えば、データパケットのアドレスの書き換えなど）する。なお、パケットエレメントテーブル210を更新する場合は、排他制御を実行した後、更新処理を行う。
【０１１２】
本実施の形態によれば、廃棄される可能性が高いデータパケットの処理に向けられていたプロセッサー処理能力、メモリなどのリソースの割り当てを、廃棄される可能性が低い他のデータパケットの処理に向けることが可能となり、通信装置が備えているリソースを有効利用することが可能になるという効果を得ることができる。その理由は、出力キュー群403を構成するキューの中に輻輳している出力キューが存在する場合は、該輻輳している出力キューを格納先にしているパケットに関連するサブワークについてはスレッドの割り当てを制限するようにしているからである。
【０１１３】
また、本実施の形態では、同一フローに属するデータパケットを同一の出力キューにストアし、データパケットに関する全てのサブワークが完了した後、出力キューから送出するようにしているので、1つのデータパケットに関する複数のサブワークを任意の複数のスレッド131で並行して実行させることが可能になり、処理効率が向上する。
【０１１４】
更に、本実施の形態では、サブワークを任意のスレッド131に割り当てることができるので、コア数やスレッド数がデバイスのアップグレードにより増加した場合でも処理アルゴリズムを修正することなく、容易に処理能力の向上を図ることが可能となる。
【０１１５】
［本発明の第２の実施の形態］
次に、本発明にかかる通信装置の第2の実施の形態について説明する。本実施の形態は、サブワークに優先度を付与し、優先度の高いサブワークに優先的にスレッドを割り当てるようにしたことを特徴とする。以下では、第1の実施の形態との相違点について説明する。
【０１１６】
本実施の形態では、第1の実施の形態で利用するワークテーブルに「ワーク優先度」という項目を追加した図１０に示すワークテーブルを利用する。なお、本実施の形態では、ワーク優先度は、第1レベル〜第kレベルのk段階であるとする。第1レベルが最も優先度が高いとする。
【０１１７】
また、本実施の形態では、ワークコントロール部120として図9に示す構成を有するものを利用する。本実施の形態のワークコントロール部120は、ワーク出力キュー群501の代わりにワーク出力キュー群501aを備えている点、および、ラウンドロビン機能部512の代わりにラウンドロビン機能部512aを備えている点が、図5に示した第１の実施の形態のワーク出力キュー群501と相違している。
【０１１８】
第１の実施の形態のワーク出力キュー群501はN個（出力キュー群403を構成するキューの数と同数）のキューによって構成されているのに対し、本実施の形態のワーク出力キュー群501aは、N×k個のキューによって構成されている。即ち、本実施の形態のワーク出力キュー群501aは、1つの出力キューに対して、ワーク優先度の段階数分（k個）のキューから構成されている。別の言い方をすれば、１つの出力キューIDに対応付けて、ワーク優先度「第1レベル〜第kレベル」用のk個のキューが設けられている。ワークコントロール部120は、コア130からワークIDが渡された場合、ストア先にするキューの出力キューIDが既に確定している場合は、上記出力キューIDによって特定されるk個のキューの内に、上記ワークIDのワーク優先度に応じたキューにストアする。なお、図９においては、出力キューID「X」に対応する第Yレベルのキューには、符号LX-Yを付している。
【０１１９】
ラウンドロビン機能部512aは、ワークIDの出力を停止もしくは抑制（選択される割合を他のキューよりも少なくする）するキューの出力キューIDがワークスケジューラー231によって指定された場合、上記出力キューIDに対応するk個のキューからのワークIDの出力を停止もしくは抑制する。また、ラウンドロビン機能部512aは、ワーク優先度が高いキューにストアされているワークIDを優先的に出力する。例えば、ワーク優先度が最も高い第1レベルのキューからはk回の走査全てにおいてワークIDを出力し、第2レベルのキューからはk回の走査の内の(k-1)回の走査においてワークIDを出力し、最もワーク優先度が低い第kレベルのキューからはk回の走査の内の１回の走査においてワークIDを出力する。
【０１２０】
ワークテーブルへのワーク優先度の設定は、ワークコントロール部120において行われると共に、図８に示したフローチャートのステップ13において行われる。
【０１２１】
ワークコントロール部120では、最上位階層のサブワークに対応するワークテーブルを生成する際、予め定められているワーク優先度を設定する。
【０１２２】
ステップ13において、スレッド131は、例えば、次のようなサブワークに高いワーク優先度を与える。
【０１２３】
・データパケットの出力キューIDを算出するサブワーク…データパケットの出力キューIDを求める操作を優先的に処理すると、マルチコアプロセッサー部150のリソースを効果的にサブワークに対して配分することが可能となると考えられる。そのため、データパケットの出力キューIDを算出するサブワークのワーク優先度を高くする。
・処理待ちパケット出力キュー（処理待ちパケット出力キュー群401を構成しているキュー）が輻輳しているデータパケットのサブワーク…処理待ちパケット出力キューが輻輳しているデータパケットに所属するサブワークは処理が遅れていると考えられるため、該当サブワークの優先度を上げる。なお、処理待ちパケット出力キューが輻輳しているか否かは、例えば、キューの使用率が閾値を超えているか否かにより判断する。
・QoSクラスが高いデータパケットに対応するサブワーク
・その他、処理単位が大きいワーク、配下のサブワーク数が大きいワーク、メモリーを大量に確保しているワーク等
【０１２４】
本実施の形態によれば、第１の実施の形態で得られる効果に加え、更に処理を効率的に行うことが可能になるという効果を得ることができる。その理由は、ワーク優先度の高いワークに優先的にスレッドを割り当てるようにしているからである。
【産業上の利用可能性】
【０１２５】
本発明は、パケットの転送処理を行う通信装置に利用可能である。
【符号の説明】
【０１２６】
101…受信インタフェース部
102…送信インタフェース部
103a,103b…スイッチ部
111…受信コントロール部
112…送信コントロール部
120…ワークコントロール部
130…コア
131…スレッド
140…メインメモリ
150…マルチコアプロセッサー部
160…バスインタフェース
201…データパケット
210…パケットエレメントテーブル
211…ワークテーブル
220…パケットキュー群
221…ワークキュー群
230…パケット送信スケジューラー
231…ワークスケジューラー
401…処理待ちパケット出力キュー群
402…出力先振り分けパケットキュー
403…出力キュー群
501,501a…ワーク出力キュー群
502…出力先振り分けワークキュー
511,512,512a…ラウンドロビン機能部
【図１】
2010226275.tif 000003
【図２】
2010226275.tif 000004
【図３】
2010226275.tif 000005
【図４】
2010226275.tif 000006
【図５】
2010226275.tif 000007
【図６】
2010226275.tif 000008
【図７】
2010226275.tif 000009
【図８】
2010226275.tif 000010
【図９】
2010226275.tif 000011
【図１０】
2010226275.tif 000012