JP2022107229A - 情報処理装置、制御方法及び制御プログラム - Google Patents

情報処理装置、制御方法及び制御プログラム Download PDF

Info

Publication number
JP2022107229A
JP2022107229A JP2021002051A JP2021002051A JP2022107229A JP 2022107229 A JP2022107229 A JP 2022107229A JP 2021002051 A JP2021002051 A JP 2021002051A JP 2021002051 A JP2021002051 A JP 2021002051A JP 2022107229 A JP2022107229 A JP 2022107229A
Authority
JP
Japan
Prior art keywords
thread
request
queue
response
waiting
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2021002051A
Other languages
English (en)
Inventor
宗則 前田
Munenori Maeda
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2021002051A priority Critical patent/JP2022107229A/ja
Priority to US17/480,172 priority patent/US11640246B2/en
Publication of JP2022107229A publication Critical patent/JP2022107229A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • G06F3/0613Improving I/O performance in relation to throughput
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0604Improving or facilitating administration, e.g. storage management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0653Monitoring storage devices or systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0655Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
    • G06F3/0659Command handling arrangements, e.g. command buffers, queues, command scheduling
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/067Distributed or networked storage systems, e.g. storage area networks [SAN], network attached storage [NAS]

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multi Processors (AREA)

Abstract

【課題】信頼性を確保しつつIO処理の性能を向上させる情報処理装置、制御方法及び制御プログラムを提供する。【解決手段】リクエストキュー131は、IO処理のリクエストを格納する。レスポンスキュー132は、IO処理の完了を通知するレスポンスを格納する。高速IOデバイス100は、リクエストキュー131からリクエストを取得して、IO処理を実行し、IO処理の完了後にレスポンスをレスポンスキュー132に格納する。IO待ちスレッド102は、コンテキストを退避させた後に、リクエストキュー131へのリクエストの書き込みを行う。IO完了通知スレッド103は、レスポンスキュー132に対してポーリングを行い、レスポンスキュー132へのレスポンスの格納を検出し、レスポンスキュー132からレスポンスを取得して、IO待ちスレッド102にIO処理の完了を通知する。【選択図】図3

Description

本発明は、情報処理装置、制御方法及び制御プログラムに関する。
大規模な企業向けのサーバであるエンタープライズサーバでは、高性能であることが重要な価値である。そのため、エンタープライズサーバでは、通信機器やストレージといった高速IO(Input Output)向け高速IOデバイスの性能を、ハードウェア性能を限界まで引き出すことが求められる。代表的な高速IOデバイスとしては、InfiniBand、Non-Volatile Memory Express(NVMe)、Intel(登録商標) I/O Acceleration Technology(OAT)及びIntel Quick Assist Technology(QAT)などがある。
高速IOデバイスは、一般的に、リクエストキューとレスポンスキューを有する。リクエストキューは、IO要求をリクエストとして格納するバッファである。レスポンスキューは、各リクエストに対する応答を格納するバッファである。リクエストキュー及びレスポンスキューには、コア別リクエストキューとコア別レスポンスキューとの組み合わせ、コア別リクエストキューとコア間供給レスポンスキューとの組み合わせなどいくつかの構成が存在する。ここでは、リクエストキュー及びレスポンスキューの組み合わせについては特に制限はない。
そして、高速IOデバイスのハードウェア性能を引き出すための技術として、カーネルバイパス技術と呼ばれるOS(Operating System)の介在を減らす技術が有力とみられている。従来のカーネルバイパス技術では、アプリケーション層における同期IO処理が一般的である。例えば、カーネルバイパス技術では、ストレージへの書き込みなどのIO操作を行ったスレッドはIO処理の完了までサスペンドして待機し、IO処理の完了後に復帰して処理を再開する。ここで、実行中のプログラムはプロセスと呼ばれ、プロセスは1つ以上のスレッドを有する。各スレッドは、CPU(Central Processing Unit)のいずれかのコアに割り当てられて実行される。すなわち、スレッドとは、プロセス内で命令を逐次実行する部分であり、CPUコアを利用する単位である。
このような高速IOデバイスの処理を向上させるため、様々な従来技術が提案されている。例えば、マルチCPUでリクエストキューへの書き込みと、レスポンスキューのポーリングとを並列実行することで、IOスループットの向上及びレスポンスの遅延時間の改善を両立するIOポーリングと呼ばれる技術が存在する。
他にも、協調型マルチスレッドと呼ばれる技術が存在する。この技術は、スレッドスケジューラの方式の1つであり、割り込みでスレッドを切り替えるのではなく、スレッド自らが制御をスケジューラに渡すことで、処理を実行するスレッドを同時実行中の別のスレッドに切り替えさせる技術である。この切り替えはコンテキストスイッチと呼ばれる場合がある。
コンテキストとは、スレッドの実行を停止させて、その後に再開するときに用いる最小限のデータセットであり、スレッドについてCPUが最後に実行した状態を表す情報である。協調型マルチスレッド処理では、プリエンプションを考慮しなくてもよく、関数の入り口で用いるデータセットに限定されるため、コンテキストは以下のようなものになる。すなわち、協調型マルチスレッド処理におけるコンテキストには、スタック、命令カウンタ、スタックポインタ、及び、OS毎にABI(Application Binary Interface)として規定されている汎用レジスタのサブセットであるCallee-savedレジスタが含まれる。命令カウンタとは、スレッドが次に実行するメモリのアドレスを示す情報である。また、スタックポインタとは、スタックの領域におけるプロセッサの次に使用する位置を示すポインタである。
ただし、IO待ちスレッドとIO完了通知スレッドとが異なるコアで動作するマルチプロセッサ環境では、異常事態が発生するおそれがある。例えば、以下のような状況が考えられる。IOリクエストを発行したIO待ちスレッドがリクエストキューにリクエストを書き込む時点では、未だ送信スレッドはコンテキストを退避させていない。高速IOデバイスが、動作してIOリクエストを処理し、それとともにレスポンスキューに完了通知を書き込む。IO処理の完了を通知するIO完了通知スレッドが、IO待ちスレッドとは異なるコアで動作して、通知にあるリクエストfd(file descriptor)から送信スレッドの復帰のための処理を行う。この時点でIO待ちスレッドがコンテキストの退避を行っていない状態が考えられる。この場合、コンテキスト情報は不当な値になっているため、IO待ちスレッドの復帰が失敗する。その後、IO待ちスレッドがコンテキストを退避させてサスペンドの状態に移行する。この場合、IO待ちスレッドを復帰させることが困難となり、送信完了タイムアウトやシステムデッドロックといった異常事態が発生する。このように、単にIO待ちスレッドとIO完了通知スレッドとを異なるマルチプロセッサ環境で動作させた場合、信頼性を確保することが困難である。
このような異常事態の発生を回避するためにいくつかの方法が考えられる。1つはシステムコールによるカーネル内実行である。これは、IO待ちスレッドの処理の主要部分であるリクエストfd獲得とリクエストfdリリースとを除いた処理をシステムコールとしてカーネル内部で実行する方法である。この方法であれば、システムコールからカーネルに移動した時点で、IO待ちスレッドのコンテキストは退避される。そのため、コンテキスト退避とIO待ちスレッドの復帰とのすれ違いは発生しない。ただし、協調型マルチスレッド環境でのカーネルバイパス技術を用いる場合、IO処理へのシステムコールの導入は困難である。
そこで、カーネルバイパス技術の仕組みにおいて、IO待ちスレッドとIO完了通知スレッドとが異なるマルチプロセッサ環境では、ロックによる排他制御が行われることが一般的である。これは、IO待ちスレッドがIOリクエストキューに書き込む前に、リクエストfd内のコンテキスト領域をロックし、コンテキストの退避が完了した後にIO待ちスレッドの動作の最後にロックが解除されるといった処理である。より詳しく説明すると、IO完了通知スレッドがコンテキスト領域にアクセスする際に、コンテキスト領域をロックする。既にロックがかかっている場合、IO待ちスレッドは、IO完了通知が行われるまで待ち合わせを行なう。この結果、コンテキスト退避とIO待ちスレッドの復帰とのすれ違いは発生しない。
なお、リクエストキューに関する技術として、以下のような技術が存在する。デバイスのリクエストキューに格納された順にリクエストを読み出し連番で順序番号を割り当て、読み出したコア毎にリクエストを読み出し順に並べたリストを作成してリクエストを順序番号順に並び替えて取得してリクエストキューに格納する技術がある。また、ユーザ要求をユーザ空間のリストに順次追加し、カーネル空間ではそのリストをたどり要求を処理し、既にカーネル空間がリスト末尾の情報を保持しているかによりリストの次の要素が有効か無効かを判定して処理を行う技術がある。
特開2018-180985号公報 特開2001-005767号公報
しかしながら、コンテキスト領域にロックをかけた場合、その間はIO待ちスレッドが待機することになり、IO処理の遅延時間が大きく性能が悪くなる。そもそも、排他制御は、アトミック命令によりメモリトランザクションをシリアライズするため、処理が重く大きなIO処理に遅延が発生するおそれがありIO処理の性能が悪化するおそれがある。例えば、排他制御を行った場合、数10マイクロ秒の遅延が発生する場合がある。
また、読み出し順に順序番号を割り当てたリクエストをリストにしたがってリクエストキューに格納する技術やユーザ要求の順番に応じて処理を行う技術では、コンテキストの格納タイミングについては考慮されていない。そのため、デッドロックなどの異常発生を軽減することは難しく、信頼性を確保することが困難である。
開示の技術は、上記に鑑みてなされたものであって、信頼性を確保しつつIO処理の性能を向上させる情報処理装置、制御方法及び制御プログラムを提供することを目的とする。
本願の開示する情報処理装置、リクエストキューは、IO処理のリクエストを格納する。レスポンスキューは、前記IO処理の完了を通知するレスポンスを格納する。IOデバイスは、前記リクエストキューから前記リクエストを取得して、取得した前記リクエストで指示された前記IO処理を実行し、前記IO処理の完了後に前記レスポンスを前記レスポンスキューに格納する。第1処理部は、自己の動作状態を表す情報であるコンテキストを退避させた後に、前記リクエストキューへのリクエストの書き込みを行う。第2処理部は、前記レスポンスキューに対してポーリングを行い、前記レスポンスキューへの前記レスポンスの格納を検出して、前記レスポンスキューから前記レスポンスを取得して、前記第1処理部に前記IO処理の完了を通知する。
1つの側面では、本発明は、信頼性を確保しつつIO処理の性能を向上させることができる。
図1は、コンピュータシステムのハードウェア構成図である。 図2は、プロセッサと高速IOデバイスとの間におけるリクエストを用いたIO処理を説明するための図である。 図3は、IO処理の実行に関するブロック図である。 図4は、リクエスト発行に伴う各スレッドの処理の詳細を説明するための図である。 図5は、実施例1に係る情報処理装置におけるIO処理のフローチャートである。 図6は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第1の図である。 図7は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第2の図である。 図8は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第3の図である。 図9は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第4の図である。 図10は、実施例2に係る情報処理装置におけるIO処理のフローチャートである。 図11は、実施例3に係る情報処理装置におけるIO処理のフローチャートである。
以下に、本願の開示する情報処理装置、制御方法及び制御プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、制御方法及び制御プログラムが限定されるものではない。
図1は、コンピュータシステムのハードウェア構成図である。コンピュータシステム1は、情報処理装置10、ドライブ装置20及び表示装置330を有する。
情報処理装置10は、プロセッサ11及び12、メモリ13、ネットワークIOデバイス14、ストレージIOデバイス15、SSD(Solid State Drive)、並びに、HDD(Hard Disk Drive)を有する。プロセッサ11及び12、メモリ13、ネットワークIOデバイス14、ストレージIOデバイス15、ドライブ装置20、並びに、表示装置30は、バス40により相互に接続される。
また、プロセッサ11及び12は、それぞれ複数のコアを有する。プロセッサ11及び12は、プログラムをメモリ13上に展開して実行する。プログラムを実行するにあたり、プログラムに含まれるスレッドをプロセッサ11及び12のそれぞれのコアが実行する。
プロセッサ11及び12は、プログラムを実行することでアプリケーションを動作させる。そして、プロセッサ11及び12は、アプリケーションを動作させることで、ネットワークIOデバイス14によりネットワークスイッチ2を介して外部との通信を行わせる。また、プロセッサ11及び12は、アプリケーションを動作させることで、ストレージIOデバイス15によりSSD16及びHDD17に対するデータの読み書きを行う。本実施例における、プロセッサ11及び12による、ネットワークIOデバイス14又はストレージIOデバイス15を用いたデータのIO処理については後で詳細に説明する。ここで、図1では、プロセッサ11及び12を記載したが、プロセッサの数に特に制限はない。
ネットワークIOデバイス14は、InfiniBandなどの高速IOデバイスである。ネットワークIOデバイス14は、ネットワークスイッチ2と接続される。ネットワークIOデバイス14は、プロセッサ11又は12からの指示を受けて、ネットワークスイッチ2を介して外部装置との間でデータの送受信を行う。
SSD16及びHDD17は、大容量の補助記憶装置である。SSD16及びHDD17は、各種プログラムやデータを格納する。
ストレージIOデバイス15は、NVMeなどの高速IOデバイスである。ストレージIOデバイス15は、SSD16及びHDD17に接続される。ストレージIOデバイス15は、プロセッサ11又は12からの指示を受けて、SSD16及びHDD17に対するデータの読み出し及び書き込みを実行する。
ドライブ装置20は、例えば磁気ディスクや光ディスク等の着脱可能な可搬型記憶媒体21が挿入され、挿入された可搬型記憶媒体21に対してデータの書き込みや読み出しを行なう。
表示装置30は、プロセッサ11及び12から送信された画像を表示する。利用者は、表示装置30を確認することで、情報を受け取ることが可能である。
図2は、プロセッサと高速IOデバイスとの間におけるリクエストを用いたIO処理を説明するための図である。次に、図2を参照して、プロセッサ11及び12によるIO処理の概要を説明する。ここでは、ネットワークIOデバイス14及びストレージIOデバイス15をまとめて高速IOデバイス100として説明する。また、プロセッサ11は、アプリケーションを動作させてIOリクエストの発行を行なうIO待ちスレッドを動作させる。また、プロセッサ12は、高速IOデバイスによるIO処理が完了したか否かの判定を行う完了通知スレッドを動作させる。また、メモリ13には、リクエストキュー131及びレスポンスキュー132が配置される。
プロセッサ11により実行されるIO待ちスレッドは、高速IOデバイス100にIO処理を行わせる場合、IO処理の実行を指示するリクエストを生成する。次に、プロセッサ11により実行されるIO待ちスレッドは、IO処理を要求するリクエストのリクエストキュー131への書き込みを行う。その後、プロセッサ11により実行されるIO待ちスレッドは、発行したリクエストに対するレスポンスが返ってくるまで待機する。そして、プロセッサ12により実行される完了通知スレッドによりレスポンスが検出されると、プロセッサ11により実行されるIO待ちスレッドは、処理実行を再開する。
高速IOデバイス100は、リクエストキュー131に格納されたリクエストを読み出す。そして、高速IOデバイス100は、リクエストで指示されたIO処理を行う。その後、高速IOデバイス100は、実行したIO処理の結果を格納したレスポンスをレスポンスキュー132に格納する。
プロセッサ11により実行されるIO完了通知スレッドは、レスポンスキュー132に対してポーリングを行いレスポンスの格納を監視する。IO完了通知スレッドは、高速IOデバイス100によりレスポンスキュー132へ格納されたレスポンスを取得してIO処理の完了を確認する。そして、プロセッサ12により実行されるIO完了通知スレッドは、IO待ちスレッドを再開させる。
次に、図3を参照して、本実施例に係るIO待ちスレッド102とIO完了通知スレッド103のIO処理時の動作について詳細に説明する。図3は、IO処理の実行に関するブロック図である。以下では、情報処理装置10におけるIO処理実行時の動作を説明する。IO待ちスレッド102が、「第1処理部」及び「第1スレッド」の一例にあたり、IO完了通知スレッド103が、「第2処理部」及び「第2スレッド」の一例にあたる。
情報処理装置10は、プロセッサ11及び12により実現されるスレッドスケジューラ101、IO待ちスレッド102及びIO完了通知スレッド103を有する。また、情報処理装置10は、メモリ13内にコンテキスト格納部104、リクエストキュー131及びレスポンスキュー132を有する。
スレッドスケジューラ101は、IO待ちスレッド102及びIO完了通知スレッド103の処理実行のスケジュールを管理する。スレッドスケジューラ101は、IO待ちスレッド102及びIO完了通知スレッド103などのスレッドから切り替えの依頼を受けて、処理を実行するスレッドを切り替える。スレッドスケジューラ101もスレッドにより動作される。スレッドスケジューラ101を動作させるスレッドを以下では、スケジューラスレッドと呼ぶ。
スレッドスケジューラ101は、実行状態への移行待ちのスレッドの情報を格納するウェイティングキューを管理する。スレッドスケジューラ101は、ウェイティングキューに格納されたスレッドを順番に取得して、処理実行の状態に遷移させて処理を行わせる。例えば、スレッドスケジューラ101は、IO処理のリクエストを発行して待機状態にあるIO待ちスレッド102がウェイティングキューに格納された場合、順番が来るとIO待ちスレッド102をウェイティングキューから取得する。そして、スレッドスケジューラ101は、IO待ちスレッド102をランニングスレッドにして処理の実行状態に復帰させて処理を再開させる。
IO待ちスレッド102は、実行中のアプリケーションの処理に関してIO処理を高速IOデバイス100に実行させることを決定する。そして、IO待ちスレッド102は、リクエストの処理の実行待ち中のスレッドであることを表すリクエストfdを取得する。
次に、IO待ちスレッド102は、リクエストの書き込み機能付きスレッド切り替え関数を実行することで、以下の処理を実行する。IO待ちスレッド102は、コンテキスト格納部104におけるリクエストfdを表すFd番号に対応する領域に自己のコンテキストを退避させる。また、IO待ちスレッド102は、スレッドスケジューラ101のスケジューラスレッド専用のFd番号を自己のスタックに退避させる。次に、IO待ちスレッド102は、リクエストキュー131へのリクエストの書き込みを行う。その後、IO待ちスレッド102は、スレッドの切り替えをスレッドスケジューラ101に依頼する。
ここで、リクエストの書き込み機能付きスレッド切り替え関数は、ABI規約にしたがった関数であり、関数読み出し前後でCallee-savedジスタを保持することができる。そして、リクエストの書き込み機能付きスレッド切り替え関数は、以下のパラメータを有する。パラメータは、例えば、書き込み先のリクエストキュー131の名前又はメモリアドレスや、IOコマンド、コマンドパラメータ及びFd番号の情報を含むリクエストなどを含む。他にも、パラメータは、リクエストを行なうIO待ちスレッド102に割り当てられたFd番号や、スケジューラスレッド専用のFd番号などを含む。
IO待ちスレッド102は、リクエストキュー131に格納したリクエストに対するレスポンスが返ってくるまで待機する。その後、IO待ちスレッド102は、IO完了通知スレッド103によりレスポンスが検出されIO処理の完了通知が出力された後に、処理を実行するランニングスレッドとして選ばれる順番を待つ。そして、スレッドスケジューラ101によるスレッドの切り替えが行われることで、IO待ちスレッド102は、処理を実行する状態に復帰する。この、リクエストキュー131にリクエストを格納してから処理を実行する状態に復帰するまでの状態が、「IO処理の完了を待機する状態」の一例にあたる。その後、IO待ちスレッド102は、リクエスト待ちのためのリクエストfdをリリースして、アプリケーション処理の実行を再開して継続する。
以上のように、本実施例に係る情報処理装置10では、IO待ちスレッド102は、リクエストの発行時に、コンテキストの退避、リクエストキュー131へのリクエストの書き込み、スレッドの切り替えの順で処理を実行する。これにより、リクエストキュー131へのリクエストの書き込み時には、確実にIO待ちスレッド102のコンテキストが退避されており、同期のすれ違いによる異常発生を回避して、IO待ちスレッド102を確実に処理実行の状態へ復帰させることができる。
また、本実施例に係るIO待ちスレッド102は、ABI規約にしたがった関数をリクエストの書き込み機能付きスレッド切り替え関数として用いる。この関数を使用することで、IO待ちスレッド102は、スレッド切り替えの引数としてスケジューラスレッド専用のFd番号を取得している場合、スケジューラスレッド専用のFd番号をIO待ちスレッド102のスタックに退避させる。これにより、IO待ちスレッド102は、スケジューラスレッド専用のFd番号のリクエストの書き込み関数の読み出しによる破壊を防止する。そして、リクエストの書き込み実行後に、IO待ちスレッド102は、スタックからスケジューラスレッド専用のFd番号を復元してスレッド切り替えを確実に行うことが可能となる。
また、本実施例に係るIO待ちスレッド102は、コンテキスト退避、リクエストキュー131へのリクエストの書き込み及びスレッドの切り替え依頼の3つの処理を順次行う1つのリクエストの書き込み機能付きスレッド切り替え関数を使用する。これにより、3つの処理の順序が確実に守られる。ただし、3つの処理の順序が守られるのであれば、IO待ちスレッド102は、それぞれの処理の実行に別の関数を用いてもよいし、2つの処理をまとめた関数を使用してもよい。
図3に戻って説明を続ける。IO完了通知スレッド103は、レスポンスキュー132に対してポーリングを行う。そして、IO完了通知スレッド103は、レスポンスキュー132に格納されたリクエストを取得してIO完了を確認する。次に、IO完了通知スレッド103は、取得した応答からリクエストfdを特定する。次に、IO完了通知スレッド103は、特定したリクエストfdを用いてIO待ちスレッド102のコンテキストを取得する。その後、IO完了通知スレッド103は、ウェイティングキューへのIO待ちスレッド102の挿入をスレッドスケジューラ101へ依頼する。
図4は、リクエスト発行に伴う各スレッドの処理の詳細を説明するための図である。次に、図4を使用して、本実施例に係るIO待ちスレッド102によるリクエスト書き込み時の状態遷移をさらに詳細に説明する。
図4は、プロセッサ11及び12がメモリ13上にプログラムを展開してアプリケーションを実行した状態を表す。メモリ13には、スレッドの処理実行のスケジュールを管理するスケジューラレイヤ110及びアプリケーションにおける各スレッドが動作するユーザスレッドレイヤ120が展開される。
スケジューラレイヤ110では、スケジューラスレッド111によりスレッドスケジューラ101が動作する。また、スケジューラレイヤ110には、その時点で処理の実行を行なうランニングスレッド121を示すポインタであるランニングスレッド情報112が存在する。さらに、スケジューラレイヤ110には、実行可能な状態で待機するスレッドであるウェイティングスレッド122を表すウェイティングキュー113が存在する。
ユーザスレッドレイヤ120は、処理実行中のスレッドであるランニングスレッド121が動作する。また、ユーザスレッドレイヤ120には、実行可能な状態で待機するスレッドであるウェイティングスレッド122が存在する。図4では、ウェイティングスレッド122として、スレッド221~223が存在する場合を記載した。また、ユーザスレッドレイヤ120には、リクエストを行ったIO処理の完了を待つなどの実行可能な状態への遷移を待機するスレッドであるサスペンデッドスレッド123が存在する。図4では、サスペンデッドスレッド123として、スレッド231~233が存在する場合を記載した。さらに、ユーザスレッドレイヤ120には、各スレッドに割り当てられたスタック211~215が存在する。例えば、ランニングスレッド121には、スタック211が割り当てられる。また、スレッド221にはスタック212が割り当てられ、スレッド222にはスタック213が割り当てられる。また、スケジューラスレッド101には、スタック214が割り当てられる。また、スレッド231には、スタック215が割り当てられる。図4では以上の割り当てが行われたスタック211~215を表示したが、他のスレッドにも同様にスタックが割り当てられる。
ここで、データ構造について説明する。スレッドは、それぞれに割り当てられた識別子であるスレッドID(Identifier)で識別される。そして、スレッドIDからそのスレッド用のスレッド構造体を検索することが可能である。スレッド構造体は、スレッドの状態を表すステート情報、そのスレッドを実行中のプロセッサ11又は12を表すCPU番号、コンテキスト構造体を含む。コンテキスト構造体には、スタック、命令カウンタ、スタックポインタ、及び、OS毎にABIとして規定されている汎用レジスタのサブセットであるCallee-savedレジスタが含まれる。すなわち、スレッド構造体が図3におけるコンテキスト格納部104にあたる。また、リクエスト待ちは、リクエストfdにより区別される。リクエストfdを用いることで、そのリクエスト用のリクエスト待ち構造体を検索することが可能である。リクエスト待ち構造体の中にスレッドIDの値であるtidが含まれる。
ランニングスレッド121がIO待ちスレッド102であり、高速IOデバイス100に対してIO処理のリクエストを行なう場合について説明する。ランニングスレッド121であるIO待ちスレッド102は、リクエスト待ちのリクエストfdを取得する。そして、IO待ちスレッド102は、自己を実行するCPU番号をtidで表されるスレッド構造体にCPU番号として格納する。次に、IO待ちスレッド102は、自己のコンテキストをtidで表されるスレッド構造体が有するコンテキスト構造体に格納する。そして、スレッドIDがtidである実行中のIO待ちスレッド102がIO処理のリクエストを実行する。次に、IO待ちスレッド102は、スレッドの状態をtidで示されるスレッド構造体に登録されたスレッドの状態をサスペンドに変更する。次に、IO待ちスレッド102は、tidで示されるスレッド構造体が有するコンテキスト構造体の情報を、スケジューラスレッド111が使用するスレッド構造体のコンテキスト構造体の情報をコンテキストにセットしてスレッドスケジューラ101を再開させる。これにより、ランニングスレッド121であったIO待ちスレッド102は、サスペンデッドスレッド123に遷移する。
IO完了通知スレッド103は、ポーリングによりIO応答を読み出してレスポンスキュー132からレスポンスを取得する。次に、IO完了通知スレッド103は、レスポンスのデータに含まれるリクエストfdを読み込む。そして、IO完了通知スレッド103は、取得したリクエストfdからリクエスト待ち構造体を検索して特定する。次に、IO完了通知スレッド103は、特定したリクエスト待ち構造体からスレッドIDの値であるtidを取得する。次に、IO完了通知スレッド103は、取得したtidで示されるスレッド構造体を特定する。次に、IO完了通知スレッド103は、特定したスレッド構造体からCPU番号を取得する。次に、IO完了通知スレッド103は、tidで示されるスレッド構造体に登録されたスレッドの状態をウェイティングに変更する。そして、IO完了通知スレッド103は、tidで示されるスレッド構造体に格納されたCPU番号を取得し、そのCPU番号を有するプロセッサ11又は12が管理するウェイティングキュー113にtidで表されるスレッドIDを登録する。これにより、例えばtidで示されるスレッド構造体に対応するスレッドがIO待ちスレッド102であれば、サスペンデッドスレッド123であったIO待ちスレッド102は、ウェイティングスレッド122に遷移する。IO完了通知スレッド103は、以上の処理を繰り返す。
スレッドスケジューラ101は、ウェイティングキュー113を監視する。ウェイティングキュー113が空であれば、スレッドスケジューラ101は、ウェイティングキュー113にウェイティングスレッド122のスレッドIDが登録されるまで待機する。ウェイティングキュー113にスレッドIDが登録されている場合、スレッドスケジューラ101は、ウェイティングキュー113からスレッドIDを取得する。そして、スレッドスケジューラ101は、取得したスレッドIDをtidとする。次に、スレッドスケジューラ101は、tidで示されるスレッド構造体を特定する。次に、スレッドスケジューラ101は、tidで示されるスレッド構造体に登録されたスレッドの状態をランニングに変更する。次に、スレッドスケジューラ101は、自己を実行するプロセッサ11又は12のCPU番号を取得する。そして、スレッドスケジューラ101は、取得したCPU番号のプロセッサが実行するスレッドスケジューラ101に割り当てられたスレッド構造体のコンテキスト構造体に、自己のコンテキストを保存する。その後、スレッドスケジューラ101は、tidで示されるスレッド構造体に含まれるコンテキスト構造体の情報をコンテキストにセットして、IO待ちスレッド102を処理の実行状態に復帰させる。これにより、ウェイティングスレッド122であったIO待ちスレッド102は、ランニングスレッド121に遷移する。IO待ちスレッド102は、IO完了通知スレッド103がIO処理の完了の通知を出力すると、コンテキストを用いて動作を再開するといえる。
次に、図5を参照して本実施例に係る情報処理装置10におけるIO処理の流れについて説明する。図5は、実施例1に係る情報処理装置におけるIO処理のフローチャートである。
IO待ちスレッド102は、リクエスト待ちのリクエストfdを取得する(ステップS101)。
次に、IO待ちスレッド102は、取得したリクエストfdに対応するコンテキスト格納部104の領域に自己のコンテキストを退避させる(ステップS102)。
次に、IO待ちスレッド102は、リクエストキュー131へリクエストを書き込む(ステップS103)。
次に、IO待ちスレッド102は、ランニングスレッド121をスケジューラスレッド111に切り替える(ステップS104)。
IO完了通知スレッド103は、レスポンスキュー132に対するポーリングを常に行う(ステップS201)。
そして、IO完了通知スレッド103は、レスポンスキュー132からレスポンスを取得することでIO完了を受信してリクエスト待ちのリクエストfdを特定する(ステップS202)。
次に、IO完了通知スレッド103は、取得したリクエストfdを用いて、IO待ちスレッド102のコンテキストを取得する(ステップS203)。
次に、IO完了通知スレッド103は、取得したコンテキストを用いて、IO待ちスレッド102をウェイティングキュー113に挿入する(ステップS204)。
スレッドスケジューラ101によりウェイティングキュー113から取得されランニングスレッド121に遷移することで、IO待ちスレッド102は、処理実行の状態に復帰する(ステップS105)。
その後、IO待ちスレッド102は、リクエストfdをリリースする(ステップS106)。
以上に説明したように、本実施例に係る情報処理装置は、IO待ちスレッドが、リクエストの発行時に、コンテキストの退避、リクエストキューへのリクエストの書き込み、スレッドの切り替えの順で処理を実行する。これにより、リクエストキューへのリクエストの書き込み時には、確実にIO待ちスレッドのコンテキストが退避されていることになり、同期のすれ違いによる異常発生を回避できる。すなわち、IO待ちスレッドを確実に処理実行の状態へ復帰させることができる。したがって、デッドロックなどの異常発生を抑制して信頼性を確保しつつ、カーネルバイパス技術を用いてシステムコール無しでIO制御を行うことができ、IO処理の性能を向上させることが可能となる。
次に実施例2について説明する。本実施例に係る情報処理装置も、図1~3で表される。本実施例に係る情報処理装置10は、コンテキスト退避、スレッド切り替え、リクエストキュー131へのリクエストの書き込みの順でIO待ちスレッド102が処理を行うことが実施例1と異なる。以下の説明では実施例1と同様の各部の動作については説明を省略する。
図3を参照して、本実施例に係るIO待ちスレッドとIO完了通知スレッドのIO処理時の動作について詳細に説明する。
IO待ちスレッド102は、アプリケーション処理実行中にIO処理を高速IOデバイス100に実行させることを決定する。そして、IO待ちスレッド102は、リクエストの処理の実行待ち中のスレッドであることを表すリクエストfdを取得する。
次に、本実施例に係るIO待ちスレッド102は、リクエストの書き込み機能付きスレッド切り替え関数を実行することで、以下の処理を実行する。IO待ちスレッド102は、コンテキスト格納部104におけるリクエストfdを表すFd番号に対応する領域に自己のコンテキストを退避させる。また、IO待ちスレッド102は、スレッドスケジューラ101のスレッドであるスケジューラスレッド110の専用のFd番号を自己のスタックに退避させる。次に、IO待ちスレッド102は、スレッドの切り替えをスレッドスケジューラ101に依頼する。その後、IO待ちスレッド102は、リクエストキュー131へのリクエストの書き込みを行う。
本実施例に係るリクエストの書き込み機能付きスレッド切り替え関数も、ABI規約にしたがった関数である。この関数を使用することで、IO待ちスレッド102は、リクエストキュー131の書き込みに用いる情報を、スケジューラスレッド111への切り替え後に可能となるように、スケジューラスレッド111のスタック214に退避させる。リクエストキュー131の書き込みに用いる情報とは、関数アドレスやパラメータリストなどである。これにより、IO待ちスレッド102は、リクエストキュー131の書き込みに用いる情報のスレッド切り替えによる破壊を防止できる。そして、スレッドの切り替え完了後に、IO待ちスレッド102は、リクエストキュー131の書き込みに用いる情報をスタック214から復元してリクエストキュー131へのリクエストの書き込みを確実に行うことが可能となる。
ここで、リクエストキュー131の書き込みに用いる情報のスレッド切り替えによる破壊を防止についてさらに詳細に説明する。まず、従来のように、リクエストキュー131へのリクエストの書き込み、コンテキスト退避、スレッドの切り替えの順で処理を行う場合について説明する。この手順では、リクエストキュー131へのリクエストの書き込みは、IO待ちスレッド102が行い、且つ、コンテキスト退避前である。そのため、リクエストキュー131へのリクエストの書き込みでは、IO待ちスレッド102により通常の関数呼び出しが行われる。通常の関数においては、コンテキストについて意識しなくてもよい。これに対して、本実施例に係る手順の場合以下のようなことが考えられる。
スレッドとは、論理的もしくは仮想的なプロセッサであり、コンテキストと呼ばれる本来は物理的なプロセッサ11などが有するプログラムカウンタや汎用レジスタといったレジスタ集合を、スレッド毎に有する。
スレッドの切り替えでは、その時点で実行中のIO待ちスレッド102からスケジューラスレッド111にランニングスレッド121が切り替わる。スレッド切り替えが完了した時点で、物理的なプロセッサ11ではそのプロセッサ11において以前にスレッドスケジューラ101が保存したコンテキストつまりレジスタ集合に置き換わり、スレッドスケジューラ101は、コンテキストの保存の直後から実行が再開したと把握する。
リクエストキュー131へのリクエストの書き込みは、スレッドスケジューラ101が実行するが、これはIO待ちスレッド102から差し込まれた処理であり、本来のスレッドスケジューラ101が再開直後に実行する処理ではない。したがって、IO待ちスレッド102は、スレッドスケジューラ101が再開直後に実行する処理に支障が生じないように、リクエストキュー131へのリクエストの書き込みの処理を行うことが好ましい。言い換えれば、IO待ちスレッド102は、スレッド切り替え実行後のレジスタ集合と、リクエストキュー131へのリクエストの書き込み実行後のレジスタ集合とが変化しないようにリクエストキュー131へのリクエストの書き込みの処理を行うことが好ましい。
ここで、本実施例ではリクエストの書き込み機能付きスレッド切り替え関数を使用することで、IO待ちスレッド102は、リクエストキュー131の書き込みに用いる情報を、スケジューラスレッド111のスタック214に退避させる。これにより、スケジューラスレッド111への切り替え後に、IO待ちスレッド102は、リクエストキュー131の書き込みに用いる情報にアクセス可能となる。リクエストキュー131の書き込みに用いる情報は、IO待ちスレッド102は当然把握する情報であるが、スレッドスケジューラ101は、知らない情報である。したがって、リクエストキュー131の書き込みに用いる情報の受け渡しを行わなければ、スレッドの切り替え後に情報はなくなってしまい、スレッドスケジューラ101は、リクエストキュー131の書き込みに用いる情報の取得が困難となる。
なお、IO待ちスレッド102からスレッドスケジューラ101のコンテキストにアクセス可能である。このアクセスには、スレッドスケジューラ101に割り当てられたスタック214へのアクセスも含まれるため、IO待ちスレッド102は、リクエストキュー131の書き込みに用いる情報を、スケジューラスレッド111のスタック214に退避させることができる。
図6は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第1の図である。図7は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第2の図である。図8は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第3の図である。図9は、スレッド切り替え関数及びリクエスト書き込み関数を説明するための第4の図である。次に、図6~9を参照して、スレッド切り替え関数とIOリクエスト書き込み関数とについてさらに説明する。
ここでは、アセンブラコードを用いて説明する。スレッド切り替え関数は、アセンブラで記述され、その内部でIOリクエスト書き込み関数を呼び出す。図6におけるアセンブラコード313は、一例であるスレッド切り替え関数の一部である。アセンブラコード313は、スレッド切り替え関数におけるリクエスト書き込み関数の呼び出し後、戻り命令であるretを呼び出す部分にあたる。IO待ちスレッド102は、アセンブラコード313を通常の関数実行と同様に実行する。
また、ここでは、リクエスト書き込み関数がパラメータを2つもつ場合で説明する。ただし、リクエスト書き込み関数のパラメータは、0以上でよい。パラメータが0個の場合は、パラメータを渡す際に用いるレジスタは0個であり、レジスタの退避復元は、考慮しなくてよい。リクエスト書き込み関数は、ABIにしたがうものであればよく、ここでは、C言語で記述されたものとする。
図6における状態301は、スレッド切り替え前の状態を表す。また、状態302は、スレッド切り替えが行われる直前の状態を表す。
スレッド切り替え前は、スケジューラスレッド111のコンテキスト構造体311は、ABI関連レジスタに状態301に示す情報を保持する。そして、コンテキスト構造体311が保持するスタックポインタspが、スケジューラスレッド111のスタック214に戻り番地として登録される。この戻り番地は、スケジューラスレッド111の再開位置を示す情報である。また、スタック214は、ABI関連レジスタを有する。
そして、スレッド切り替えの直前には、IO待ちスレッド102は、スレッド切り替え関数を実行する。アセンブラコード313におけるシンタックス314は、リクエスト書き込み関数の呼び出しパラメータをレジスタに設定する処理と、その処理で実行されるレジスタを事前に退避する処理を表す。これにより、状態302に示すように、プロセッサ11のレジスタセット312に、スケジューラスレッド111のコンテキスト構造体311の情報がコピーされる。レジスタセット312にコピーされたスタックポインタspにより、スケジューラスレッド111のスタック214が指定される。そして、スタック214には、スケジューラスレッド111のコンテキスト構造体311に登録されていた情報が退避される。さらに、スタック214には、IOリクエスト関数用のパラメータであるパラメータp1及びp2が格納される。そして、レジスタセット312におけるプログラムカウンタは、アセンブラコード313におけるリクエスト書き込み関数の呼び出しの行を指す。
次に、図7の状態303は、スレッド切り替え中の状態を表す。IO待ちスレッド102は、リクエスト書き込み関数を実行する。プロセッサ11のレジスタセット312のスタックポインタspは、スケジューラスレッド111のスタック214を指定する。さらに、レジスタセット312のプログラムカウンタは、リクエスト関数のアセンブラコード316を示す。スタック214の戻り番地は、アセンブラコード313におけるシンタックス315の先頭を示す。シンタックス315は、変更されたレジスタを復元する処理を表す。
図8の状態304は、スレッド切り替え中でIO待ちスレッド102が復帰命令を受ける前の状態を表す。プロセッサ11のレジスタセット312は、スタックポインタspは、スケジューラスレッド111のスタック214を指定する。また、レジスタセット312のプログラムカウンタは、戻り命令であるretの行を指す。
図9の状態305は、スレッド切り替えが完了してIO待ちスレッド102が処理の実行状態に復帰した後の状態を表す。この時、スケジューラスレッド111のスタック214に格納された情報がプロセッサ11のレジスタセット312にコピーされる。この場合のレジスタセット312のプログラムカウンタは、スケジューラスレッド111の再開位置を示す。
次に、図10を参照して本実施例に係る情報処理装置10におけるIO処理の流れについて説明する。図10は、実施例2に係る情報処理装置におけるIO処理のフローチャートである。
IO待ちスレッド102は、リクエスト待ちのリクエストfdを取得する(ステップS111)。
次に、IO待ちスレッド102は、取得したリクエストfdに対応するコンテキスト格納部104の領域に自己のコンテキストを退避させる(ステップS112)。
次に、IO待ちスレッド102は、ランニングスレッド121をスケジューラスレッド111に切り替える(ステップS113)。
次に、IO待ちスレッド102は、リクエストキュー131へリクエストを書き込む(ステップS114)。
IO完了通知スレッド103は、レスポンスキュー132に対するポーリングを常に行う(ステップS211)。
そして、IO完了通知スレッド103は、レスポンスキュー132からレスポンスを取得することでIO完了を受信してリクエスト待ちのリクエストfdを特定する(ステップS212)。
次に、IO完了通知スレッド103は、取得したリクエストfdを用いて、IO待ちスレッド102のコンテキストを取得する(ステップS213)。
次に、IO完了通知スレッド103は、取得したコンテキストを用いて、IO待ちスレッド102をウェイティングキュー113に挿入する(ステップS214)。
スレッドスケジューラ101によりウェイティングキュー113から取得されランニングスレッド121に遷移することで、IO待ちスレッド102は、処理実行の状態に復帰する(ステップS115)。
その後、IO待ちスレッド102は、リクエストfdをリリースする(ステップS116)。
以上に説明したように、本実施例に係る情報処理装置は、IO待ちスレッドが、リクエストの発行時に、コンテキストの退避、スレッドの切り替え、リクエストキュー131へのリクエストの書き込みの順で処理を実行する。この順番で処理を行っても、リクエストキューへのリクエストの書き込み時には、確実にIO待ちスレッドのコンテキストが退避されていることになり、同期のすれ違いによる異常発生を回避できる。すなわち、IO待ちスレッドを確実に処理実行の状態へ復帰させることができる。したがって、デッドロックなどの異常発生を軽減して信頼性を確保しつつ、カーネルバイパス技術を用いてIO処理の性能を向上させることが可能となる。
次に実施例3について説明する。本実施例に係る情報処理装置も、図1~3で表される。本実施例に係る情報処理装置10は、IOリクエスト書き込み処理を汎用化して差し替え可能にしたことが実施例1と異なる。以下の説明では、実施例1と同様の各部の動作については説明を省略する。
本実施例に係るIO待ちスレッド102は、Fd番号で示される領域に自己のコンテキストを退避する処理、間接関数の呼び出し処理及びスレッド切り替え処理をこの順番で実行する間接関数呼び出し機能付きスレッド切り替え関数を有する。
IO待ちスレッド102は、アプリケーション処理実行中にIO処理を高速IOデバイス100に実行させることを決定する。そして、IO待ちスレッド102は、リクエストの処理の実行待ち中のスレッドであることを表すリクエストfdを取得する。
次に、本実施例に係るIO待ちスレッド102は、関数オブジェクト用領域を確保して、関数オブジェクトに関数オブジェクトに、リクエスト書き込み関数、リクエストキュー131の名前やメモリアドレスといった識別情報、IOコマンド及びIOパラメータを設定する。この情報を用いて、間接関数を実行することで、リクエストキュー131へのリクエストの挿入が行われる。
次に、IO待ちスレッド102は、間接関数呼び出し機能付きスレッド切り替え関数を実行することで、以下の処理を実行する。IO待ちスレッド102は、コンテキスト格納部104におけるリクエストfdを表すFd番号に対応する領域に自己のコンテキストを退避させる。また、IO待ちスレッド102は、スレッドスケジューラ101のスケジューラスレッド専用のFd番号を自己のスタックに退避させる。次に、IO待ちスレッド102は、スレッドスケジューラ101に対して間接関数を呼び出し、関数オブジェクトを用いて間接関数を実行させることで、リクエストキュー131へのリクエストの書き込みを行う。その後、IO待ちスレッド102は、スレッドの切り替えをスレッドスケジューラ101に依頼する。
次に、図11を参照して本実施例に係る情報処理装置10におけるIO処理の流れについて説明する。図11は、実施例3に係る情報処理装置におけるIO処理のフローチャートである。
IO待ちスレッド102は、リクエスト待ちのリクエストfdを取得する(ステップS121)。
IO待ちスレッド102は、関数オブジェクト用領域を確保して、関数ポインタ及びパラメータを設定する(ステップS122)。
次に、IO待ちスレッド102は、取得したリクエストfdに対応するコンテキスト格納部104の領域に自己のコンテキストを退避させる(ステップS123)。
次に、IO待ちスレッド102は、間接関数を呼び出して、関数オブジェクトを用いて実行し、リクエストキュー131へリクエストを書き込む(ステップS124)。
次に、IO待ちスレッド102は、ランニングスレッド121をスケジューラスレッド111に切り替える(ステップS125)。
IO完了通知スレッド103は、レスポンスキュー132に対するポーリングを常に行う(ステップS221)。
そして、IO完了通知スレッド103は、レスポンスキュー132からレスポンスを取得することでIO完了を受信してリクエスト待ちのリクエストfdを特定する(ステップS222)。
次に、IO完了通知スレッド103は、取得したリクエストfdを用いて、IO待ちスレッド102のコンテキストを取得する(ステップS223)。
次に、IO完了通知スレッド103は、取得したコンテキストを用いて、IO待ちスレッド102をウェイティングキュー113に挿入する(ステップS224)。
スレッドスケジューラ101によりウェイティングキュー113から取得されランニングスレッド121に遷移することで、IO待ちスレッド102は、処理実行の状態に復帰する(ステップS126)。
その後、IO待ちスレッド102は、リクエストfdをリリースする(ステップS127)。
以上に説明したように、本実施例に係る情報処理装置は、間接関数を呼び出してリクエストキューへのリクエストの書き込みを行う。これにより、IO処理におけるコンテキストスイッチ全般に対して、リクエストキューへのリクエストのオーバーヘッドがかからず、コンテキストスイッチのオーバーヘッドに制限することができる。また、本実施例においても、情報処理装置は、IO待ちスレッドが、リクエストの発行時に、コンテキストの退避、リクエストキューへのリクエストの書き込み、スレッドの切り替えの順で処理を実行する。これにより、デッドロックなどの異常発生を軽減して信頼性を確保しつつ、カーネルバイパス技術を用いてIO処理の性能を向上させることが可能となる。
1 コンピュータシステム
2 ネットワークスイッチ
10 情報処理装置
11,12 プロセッサ
13 メモリ
14 ネットワークIOデバイス
15 ストレージIOデバイス
16 SSD
17 HDD
20 ドライブ装置
21 可搬型記憶媒体
30 表示装置
100 高速IOデバイス
101 スレッドスケジューラ
102 IO待ちスレッド
103 IO完了通知スレッド
104 コンテキスト格納部
110 スケジューラレイヤ
111 スケジューラスレッド
112 ランニングスレッド情報
113 ウェイティングキュー
120 ユーザスレッドレイヤ
121 ランニングスレッド
122 ウェイティングスレッド
123 サスペンデッドスレッド
131 リクエストキュー
132 レスポンスキュー
211~215 スタック
221~223,231~233 スレッド

Claims (9)

  1. IO処理のリクエストを格納するリクエストキューと、
    前記IO処理の完了を通知するレスポンスを格納するレスポンスキューと、
    前記リクエストキューから前記リクエストを取得して、取得した前記リクエストで指示された前記IO処理を実行し、前記IO処理の完了後に前記レスポンスを前記レスポンスキューに格納するIOデバイスと、
    自己の動作状態を表す情報であるコンテキストを退避させた後に、前記リクエストキューへのリクエストの書き込みを行う第1処理部と、
    前記レスポンスキューに対してポーリングを行い、前記レスポンスキューへの前記レスポンスの格納を検出し、前記レスポンスキューから前記レスポンスを取得して、前記第1処理部に前記IO処理の完了を通知する第2処理部と
    を備えたことを特徴とする情報処理装置。
  2. 前記第1処理部は、前記第2処理部が前記IO処理の完了の通知を出力すると、前記コンテキストを用いて動作を再開することを特徴とする請求項1に記載の情報処理装置。
  3. 前記第1処理部は、前記コンテキストを退避させて、前記リクエストキューへの前記リクエストの書き込みを行い、前記IO処理の完了を待機する状態に遷移することを特徴とする請求項1又は2に記載の情報処理装置。
  4. 前記第1処理部は、前記コンテキストを退避させて、前記IO処理の完了を待機する状態に遷移し、前記リクエストキューへの前記リクエストの書き込みを行うことを特徴とする請求項1又は2に記載の情報処理装置。
  5. 前記第1処理部は、前記コンテキストの退避処理、前記リクエストキューへの前記リクエストの書き込みを処理及び前記IO処理の完了を待機する状態に遷移する処理を実行する1つの関数を用いることを特徴とする請求項3又は4に記載の情報処理装置。
  6. 前記関数は、Application Binary Interface(ABI)規約にしたがった関数であることを特徴とする請求項5に記載の情報処理装置。
  7. 前記第1処理部は、前記レスポンスキューへの前記レスポンスの格納を行なう間接関数を呼び出して実行することを特徴とする請求項1~6のいずれか一つに記載の情報処理装置。
  8. IO処理のリクエストを格納するリクエストキューと、
    前記IO処理の完了を通知するレスポンスを格納するレスポンスキューと、
    前記リクエストキューから前記リクエストを取得して、取得した前記リクエストで指示された前記IO処理を実行し、前記IO処理の完了後に前記レスポンスを前記レスポンスキューに格納するIOデバイスとを有する情報処理装置の制御プログラムであって、
    自己の動作状態を表す情報であるコンテキストを退避させた後に、前記リクエストキューへのリクエストの書き込みを第1スレッドに行わせ、
    前記レスポンスキューに対してポーリングを行い、前記レスポンスキューへの前記レスポンスの格納を検出し、前記レスポンスキューから前記レスポンスを取得して、前記IO処理の完了を前記第1スレッドに通知する処理を第2スレッドに行わせる
    ことを特徴とする制御方法。
  9. IO処理のリクエストを格納するリクエストキューと、
    前記IO処理の完了を通知するレスポンスを格納するレスポンスキューと、
    前記リクエストキューから前記リクエストを取得して、取得した前記リクエストで指示された前記IO処理を実行し、前記IO処理の完了後に前記レスポンスを前記レスポンスキューに格納するIOデバイスとを有する情報処理装置の制御プログラムであって、
    自己の動作状態を表す情報であるコンテキストを退避させた後に、前記リクエストキューへのリクエストの書き込みを第1スレッドに行わせ、
    前記レスポンスキューに対してポーリングを行い、前記レスポンスキューへの前記レスポンスの格納を検出し、前記レスポンスキューから前記レスポンスを取得して、前記IO処理の完了を前記第1スレッドに通知する処理を第2スレッドに行わせる
    処理をコンピュータに実行させることを特徴とする制御プログラム。
JP2021002051A 2021-01-08 2021-01-08 情報処理装置、制御方法及び制御プログラム Pending JP2022107229A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2021002051A JP2022107229A (ja) 2021-01-08 2021-01-08 情報処理装置、制御方法及び制御プログラム
US17/480,172 US11640246B2 (en) 2021-01-08 2021-09-21 Information processing device, control method, and computer-readable recording medium storing control program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2021002051A JP2022107229A (ja) 2021-01-08 2021-01-08 情報処理装置、制御方法及び制御プログラム

Publications (1)

Publication Number Publication Date
JP2022107229A true JP2022107229A (ja) 2022-07-21

Family

ID=82322799

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2021002051A Pending JP2022107229A (ja) 2021-01-08 2021-01-08 情報処理装置、制御方法及び制御プログラム

Country Status (2)

Country Link
US (1) US11640246B2 (ja)
JP (1) JP2022107229A (ja)

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6754736B1 (en) 1999-06-23 2004-06-22 Fujitsu Limited Information processing apparatus, data inputting/outputting method, and program storage medium therefor
JP2001005767A (ja) 1999-06-23 2001-01-12 Fujitsu Ltd 非同期データ入出力処理方法,データ処理装置および非同期データ入出力処理のプログラム記録媒体
US20130024875A1 (en) * 2011-07-22 2013-01-24 Yilin Wang Event System And Methods For Using Same
KR102649324B1 (ko) * 2016-05-19 2024-03-20 삼성전자주식회사 적응 인터럽트 제어를 수행하는 컴퓨터 시스템 및 그것의 인터럽트 제어 방법
JP6458823B2 (ja) 2017-04-14 2019-01-30 富士通株式会社 情報処理装置、情報処理方法及び情報処理プログラム
US11144481B2 (en) * 2018-04-11 2021-10-12 Apple Inc. Techniques for dynamically adjusting the manner in which I/O requests are transmitted between a computing device and a storage device

Also Published As

Publication number Publication date
US11640246B2 (en) 2023-05-02
US20220221991A1 (en) 2022-07-14

Similar Documents

Publication Publication Date Title
US9798595B2 (en) Transparent user mode scheduling on traditional threading systems
US8544022B2 (en) Transactional memory preemption mechanism
US8370841B2 (en) Optimizing deterministic event record and replay operations
US9626187B2 (en) Transactional memory system supporting unbroken suspended execution
US6886081B2 (en) Method and tool for determining ownership of a multiple owner lock in multithreading environments
US20130160028A1 (en) Method and apparatus for low latency communication and synchronization for multi-thread applications
US9378069B2 (en) Lock spin wait operation for multi-threaded applications in a multi-core computing environment
CN107003896B (zh) 具有共享事务处理资源的装置和数据处理方法
JP2011227934A (ja) スレッドレベルの投機実行を拡張するためのプリミティブ
WO2006082657A1 (ja) マルチcpuコンピュータおよびシステム再起動方法
US9558152B2 (en) Synchronization method, multi-core processor system, and synchronization system
KR20100036279A (ko) 복수의 프로세서들을 포함하는 시스템 및 그 동작 방법
CN111459623B (zh) 应用程序恢复运行的方法、装置及计算机
TWI786181B (zh) 在例外遮罩更新指令之後允許未中止的交易處理
KR20090084881A (ko) 멀티프로세서 시스템 상에서 멀티스레드 프로그램으로부터의 메모리 액세스를 관리하기 위한 방법 및 시스템
JP2004288162A (ja) 同期タスクを利用したオペレーティングシステムアーキテクチャ
US10241829B2 (en) Information processing device, information processing method, recording medium, calculation processing device, calculation processing method
JP2019169081A (ja) 情報処理装置、情報処理方法、プログラム
US20080243887A1 (en) Exclusion control
US20120226849A1 (en) Virtual computer system, area management method, and program
US8495261B2 (en) Redispatching suspended tasks after completion of I/O operations absent I/O interrupts
WO2011104812A1 (ja) マルチコアプロセッサシステム、割込プログラム、および割込方法
JPH0827757B2 (ja) データ・ブロック転送制御方法
JP2022107229A (ja) 情報処理装置、制御方法及び制御プログラム
JPH1049373A (ja) パイプライン・デジタル・プロセッサにおいて多重で高精度の事象を操作する方法と装置