JP5505456B2 - デバイス制御システム及びプログラム - Google Patents
デバイス制御システム及びプログラム Download PDFInfo
- Publication number
- JP5505456B2 JP5505456B2 JP2012106901A JP2012106901A JP5505456B2 JP 5505456 B2 JP5505456 B2 JP 5505456B2 JP 2012106901 A JP2012106901 A JP 2012106901A JP 2012106901 A JP2012106901 A JP 2012106901A JP 5505456 B2 JP5505456 B2 JP 5505456B2
- Authority
- JP
- Japan
- Prior art keywords
- command
- computer
- daemon process
- information
- queue
- 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.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Description
本発明は、コンピュータ上で機能して、当該コンピュータに接続されたデバイスを制御するデバイス制御システムと、そのデバイス制御システムの一部を構成するためのプログラムに関する。
近年、USB(Universal Serial Bus)マスストレージデバイス、ICカードで知られているMMC(Multi Media Card)デバイス、SD(Secure Digital)メモリカードデバイスなどが広く普及している。また、これらのデバイスを、Linux(登録商標)が搭載されたコンピュータで制御することも行われている。例えば、下記特許文献1には、USBマスストレージデバイスをLinux搭載コンピュータで制御する技術が提案されている。また、MMCデバイスやSDメモリカードデバイスをLinux搭載コンピュータで制御する技術も存在する。なお、SDメモリカードは、規格上、MMCとの互換性が考慮された仕様になっているため、Linux搭載コンピュータではMMCの一種として認識される。そこで、以下の説明においては、MMCデバイスとSDメモリカードデバイスとを区別して説明をする必要がない限り、双方を総称してMMCデバイスと呼ぶことにする。すなわち、以下の説明でいうMMCデバイスは、SDメモリカードデバイスではないMMCデバイスとSDメモリカードデバイスの双方を含み、以下の説明でいうMMCは、SDメモリカードではないMMCとSDメモリカードの双方を含む。
ところで、Linuxが搭載されたコンピュータで、上述のような各種ストレージデバイス(USBマスストレージデバイス、MMCデバイス)を制御する際、コンピュータ上のカーネル空間では、デバイスドライバとデーモンプロセスが協働して必要な処理を実行している。以下、MMCデバイスの場合を例に説明を続ける。コンピュータ上のユーザ空間において作動するアプリケーションソフトウェアが、MMCデバイス上にあるファイルをオープンすると、その情報はファイルシステム経由でデバイスドライバ(MMCドライバ)へと伝達される。このとき、デバイスドライバでは、オープンされたファイルごとにハンドルが確保される。そして、アプリケーションソフトウェアからリードコマンド又はライトコマンドが発行されると、それらのコマンドがファイルシステム経由でデバイスドライバへと伝達される。このとき、デバイスドライバに伝達されたコマンド(以下、リクエストとも称する。)は、ハンドルごとの固有データとして確保されるリクエストキューに格納されることとなる。デーモンプロセスは、デバイスドライバによって確保された全てのハンドルを対象に、それら全てのハンドルに対応するリクエストキューの中に格納されたリクエストを、適当な順序で取り出して処理してゆく。その結果、それらのリクエストに対応するコマンドが、SDIOバスドライバ等によって構成される通信用インターフェース部を介してSDメモリカードデバイスへと伝達されることになる。
このような制御が行われる際、デバイスドライバは、リクエストがリクエストキューに格納された後、デーモンプロセスでの処理の完了を待たずに、呼び出し元のアプリケーションソフトウェアにリターンする。そのため、デーモンプロセスによって実行される処理は、アプリケーションソフトウェア側から見て、デバイスドライバからの応答よりも遅延したタイミングで実行される遅延処理となる。このような遅延処理が行われれば、デバイスドライバは、デーモンプロセスによって実行される実際の処理が完了するのを待つことなくアプリケーションに応答を返し、その後は、別の処理を実行可能ともなるので、デバイスドライバでの処理効率が向上する。
しかし、アプリケーションソフトウェアが、連続的に複数の処理を実行した際に、先に実行した処理で上述のような遅延処理が生じていると、それに起因して後から実行する処理でエラーが発生することがある。例えば、アプリケーションソフトウェアが、先にストレージデバイスのフォーマット処理を実行し、引き続いてフォーマット後のファイルシステムのマウント処理を連続的に行うと、上述のような遅延処理に起因した問題を招くおそれがある。
より詳しく説明すると、フォーマット処理での遅延書き込みが完了する前に、マウント処理が実行されると、管理領域データの書き込みが完了していないにもかかわらず、マウント処理において管理領域データが読み出されてしまう可能性がある。この場合、マウント処理では、フォーマット不正のストレージデバイスと認識されてしまうおそれがある。しかも、そのようなエラーが発生した直後に、フォーマット処理の遅延書き込みが完了して管理領域が正しい状態になると、フォーマット不正ではない状態に更新されてしまうので、エラーの発生原因を事後的に解析することが極めて難しいという問題がある。この他、例えば、アプリケーションソフトウェア側でコンピュータの電源を切る場合にも、ストレージデバイスへの遅延書き込みが完了する前に電源を切ってしまうと、遅延書き込み予定となっていたデータの損失を招くおそれがある。
こうした問題を解消するには、アプリケーションソフトウェアが、デーモンプロセスによる遅延処理の完了を確実に待ってから、次の処理要求をデバイスドライバやデーモンプロセスに伝達することが重要となる。
しかし、Linuxが搭載されたコンピュータでは、アプリケーションソフトウェア側からデーモンプロセスによる遅延処理が完了したか否かを確認できるような手段が用意されていない、という問題がある。そのため、現状では、アプリケーションソフトウェアによって上述のようなフォーマット処理やマウント処理、あるいは電源断処理を行うに当たっては、遅延書き込みの完了が期待できる程度まで十分に待ってから、次の処理を行ったり電源を切ったりする、といった対策を取らざるを得ないのが実情であった。また、このような対策を取ることならできるものの、どの程度待てば遅延書き込みが完了するのかは、単なる経験則に基づく想定に過ぎず、何ら保証される時間が規定されているわけではないので、非常に不確実な対策にしかなり得ないという問題があった。さらに、多くの場合は、ごく短時間(例えば1秒足らず)だけ待てば遅延書き込みが完了しており、遅延書き込みが完了するまでに長時間(例えば20秒程度)を要するのは、ごくまれなケースにすぎない。しかし、このようなまれなケースにも対処するためには、常に十分に長時間(例えば30秒程度)が経過してからしか、次の処理を行ったり電源を切ったりすることができないため、非常に効率が悪いという問題もあった。
本発明は、上記のような問題を解決するためになされたものであり、その目的は、デバイスドライバがデーモンプロセス経由でデバイスを制御するデバイス制御システムにおいて、デーモンプロセスでの処理が完了したか否かをアプリケーションソフトウェア側からでも確実に検知可能とすることにある。
以下、本発明において採用した構成について説明する。
本発明のデバイス制御システムは、オペレーティングシステムによって制御されるコンピュータ上のカーネル空間において作動するソフトウェアであり、前記コンピュータ上のユーザ空間において作動するコマンド発行元プロセスから、前記コンピュータに接続されたブロックデバイスに対するデータのリード又はライトを要求するコマンドが発行された場合に、前記コマンド発行元プロセスから前記コマンドが伝達されるとともに、当該コマンドが前記コンピュータに接続されたMMC(Multi Media Card)デバイスに対するデータのリード又はライトを要求するコマンドであった場合には、当該コマンドを所定のキューに格納するブロックデバイスアクセス用カーネルモジュールと、前記コンピュータ上のカーネル空間において作動するソフトウェアであり、前記ブロックデバイスアクセス用カーネルモジュールによって前記コマンドが前記キューに格納された場合に、当該キューから前記コマンドを取得するデーモンプロセスと、前記デーモンプロセスと前記デバイスとの間に介在するハードウェア及びソフトウェアによって構成され、前記デーモンプロセスが前記キューから前記コマンドを取得した場合に、当該コマンドを前記デーモンプロセスから前記デバイスへと伝送する通信用インターフェース部と、前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記キューに前記コマンドが格納されている可能性がある状態及び当該可能性がない状態、いずれの状態であるのかを示す情報が、前記デーモンプロセスによって書き込まれて当該情報を記憶する第一記憶手段と、前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記デーモンプロセスから前記通信用インターフェース部を介して前記デバイスへの前記コマンドの伝送が完了した際に、その旨を示す情報が前記デーモンプロセスによって書き込まれて当該情報を記憶する第二記憶手段と、前記第一記憶手段及び前記第二記憶手段に記憶された情報を、前記コンピュータ上のユーザ空間において作動するプロセスから読み取り可能とする情報公開用インターフェース部とを備え、前記コンピュータ上のユーザ空間において作動するプロセスが、前記情報公開用インターフェース部を介して前記第一記憶手段及び前記第二記憶手段それぞれに記憶された情報を読み取って、それらの情報に基づいて、前記デバイスへの前記コマンドの伝送が完了したか否かを判定可能とされていることを特徴とする。
本発明のデバイス制御システムは、オペレーティングシステムによって制御されるコンピュータ上のカーネル空間において作動するソフトウェアであり、前記コンピュータ上のユーザ空間において作動するコマンド発行元プロセスから、前記コンピュータに接続されたブロックデバイスに対するデータのリード又はライトを要求するコマンドが発行された場合に、前記コマンド発行元プロセスから前記コマンドが伝達されるとともに、当該コマンドが前記コンピュータに接続されたMMC(Multi Media Card)デバイスに対するデータのリード又はライトを要求するコマンドであった場合には、当該コマンドを所定のキューに格納するブロックデバイスアクセス用カーネルモジュールと、前記コンピュータ上のカーネル空間において作動するソフトウェアであり、前記ブロックデバイスアクセス用カーネルモジュールによって前記コマンドが前記キューに格納された場合に、当該キューから前記コマンドを取得するデーモンプロセスと、前記デーモンプロセスと前記デバイスとの間に介在するハードウェア及びソフトウェアによって構成され、前記デーモンプロセスが前記キューから前記コマンドを取得した場合に、当該コマンドを前記デーモンプロセスから前記デバイスへと伝送する通信用インターフェース部と、前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記キューに前記コマンドが格納されている可能性がある状態及び当該可能性がない状態、いずれの状態であるのかを示す情報が、前記デーモンプロセスによって書き込まれて当該情報を記憶する第一記憶手段と、前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記デーモンプロセスから前記通信用インターフェース部を介して前記デバイスへの前記コマンドの伝送が完了した際に、その旨を示す情報が前記デーモンプロセスによって書き込まれて当該情報を記憶する第二記憶手段と、前記第一記憶手段及び前記第二記憶手段に記憶された情報を、前記コンピュータ上のユーザ空間において作動するプロセスから読み取り可能とする情報公開用インターフェース部とを備え、前記コンピュータ上のユーザ空間において作動するプロセスが、前記情報公開用インターフェース部を介して前記第一記憶手段及び前記第二記憶手段それぞれに記憶された情報を読み取って、それらの情報に基づいて、前記デバイスへの前記コマンドの伝送が完了したか否かを判定可能とされていることを特徴とする。
このように構成されたデバイス制御システムによれば、ブロックデバイスアクセス用カーネルモジュールがコマンドをキューに格納するとともに、そのコマンドをデーモンプロセスへコマンドがキューから取得する。その際、キューにコマンドが格納されている可能性がある状態及び当該可能性がない状態、いずれの状態であるのかを示す情報が、デーモンプロセスによって第一記憶手段に書き込まれる。また、デーモンプロセスから通信用インターフェース部を介してデバイスへのコマンドの伝送が完了した際、その旨を示す情報が、デーモンプロセスによって第二記憶手段に書き込まれる。さらに、コンピュータには、これら第一記憶手段及び第二記憶手段に記憶された情報を、コンピュータ上のユーザ空間において作動するプロセスから読み取り可能とする情報公開用インターフェース部が設けられている。
そのため、コンピュータ上のユーザ空間において作動するプロセス(例えば、アプリケーションソフトウェアのプロセス)は、情報公開用インターフェース部を介して第一記憶手段及び第二記憶手段それぞれに記憶された情報を読み取ることができ、それら読み取った情報に基づいて、キューにコマンドが残っていないかどうか、デバイスへのコマンドの伝送が完了したか否かを判定することができる。
ところで、請求項2に記載の構成を備えていれば、第一カウンタ及び第二カウンタのカウンタ値の増減に基づいて、コマンドの伝送が行われたか否かを判断することができる。また、第一カウンタ及び第二カウンタのカウンタ値を比較し、両者が一致していればコマンドに対応する処理が完了していると判断することができる。
また、請求項3に記載の構成を備えていれば、スケジューラによってキューに対するアクセスが行われている場合には、コマンドが格納されている可能性がある状態を示す情報が、デーモンプロセスによって第一記憶手段に書き込まれる。したがって、スケジューラによる管理対象となっているコマンドが残っているか否かを判定することができる。
さらに、請求項4に記載のプログラムに基づいて、コンピュータを上記各手段として機能させるプロセスを作動させれば、当該プロセスが、情報公開用インターフェース部を介して第一記憶手段及び第二記憶手段それぞれに記憶された情報を読み取り、読み取った情報に基づいてデバイスへのコマンドの伝送が完了したか否かを判定し、その判定結果を、コンピュータ上のユーザ空間において作動する他のプロセスへ提供する。
したがって、このような判定結果を得るための処理を、他のプロセスが自ら実行できる仕組みを備えていなくても、他のプロセスは、上記判定結果を提供するプロセスを起動させて、そのプロセスから提供される判定結果を受け取ることができる。
そして、他のプロセスでは、受け取った判定結果に基づいて、デバイスへのコマンドの伝送が完了したことを確認した後、引き続いて次の処理を実行できるので、デバイスへのコマンドの伝送が完了していないにもかかわらず、次の処理を実行してしまうのを未然に防止することができる。
次に、本発明の実施形態について一例を挙げて説明する。
[デバイス制御システムの構成]
以下に例示するデバイス制御システムは、図1に示すように、コンピュータ1上で機能して、このコンピュータ1に接続されたMMCデバイス2を制御するシステムである。MMCデバイス2は、カードスロット2Aと、このカードスロット2Aに装填されるMMC/SDメモリカード2Bとで構成される。
[デバイス制御システムの構成]
以下に例示するデバイス制御システムは、図1に示すように、コンピュータ1上で機能して、このコンピュータ1に接続されたMMCデバイス2を制御するシステムである。MMCデバイス2は、カードスロット2Aと、このカードスロット2Aに装填されるMMC/SDメモリカード2Bとで構成される。
コンピュータ1は、OSとしてLinuxが搭載されたものであり、このOSの機能により、コンピュータ1上には、OSによって管理されるカーネル空間及びユーザ空間が構成されている。これらのうち、ユーザ空間では、アプリケーションA1〜A3、sfdisk,mkfsなどの特殊アプリケーションA4、動作完了確認ツールA5などが機能する。なお、詳しくは後述するが、動作完了確認ツールA5は、本実施形態で例示するデバイス制御システムに関連するデータとして、2個のカウンタ(r1,w1)を記憶領域上に確保する。
また、カーネル空間では、デバイス制御システムに関連するソフトウェアとして、ファイルシステム11、ブロックデバイスアクセス用カーネルモジュール13、MMC用デーモンプロセス15(以下、単にデーモンプロセス15と称する。)、SDIOバスドライバ17、及びI/Oスケジューラ18などが機能する。この他、コンピュータ1は、デバイス制御システムに関連するハードウェアとして、I/Fハードウェア19などを備えている。
ファイルシステム11は、OSの一部として提供されるシステムで、ストレージデバイスなどが備える記憶領域に格納されるデータをファイルとして管理するとともに、そのファイルに対するリードやライトを行うためのアプリケーションインターフェースを提供する。本実施形態において、ファイルシステム11は、FATやXFSなどの規格に対応したものとされている。アプリケーションA1などは、ファイルシステム11によって提供されるアプリケーションインターフェースを利用して、MMCデバイス2に格納されたファイルにアクセスすることができる。
ブロックデバイスアクセス用カーネルモジュール13は、各種ブロックデバイスを制御するために、OSが標準的に備えているソフトウェアである。デバイス制御システムに関連する機能としては、MMCデバイス2を制御するためのデバイスドライバも、上記ブロックデバイスアクセス用カーネルモジュール13を流用して構成されている。そのため、アプリケーションA1などからMMCデバイス2に対するデータのリード又はライトを要求するコマンドが発行された場合、そのコマンドはブロックデバイスアクセス用カーネルモジュール13へと伝達される。ブロックデバイスアクセス用カーネルモジュール13は、自身が制御対象としているデバイスに対応する記憶領域を確保し、その記憶領域にブロックデバイス汎用デバイス固有データ13Aを格納する。デバイス制御システムに関連するデータとしては、複数のデータを備えるデータ構造とされたgendisk構造体が、ブロックデバイス汎用デバイス固有データ13A内に確保される。このgendisk構造体の中には、構造体メンバとして、32バイト分の記憶領域であるディスクネーム記憶領域(disk_name[32])や、デバイス番号記憶領域(デバイスを示すメジャー番号及びマイナー番号が格納される記憶領域)が含まれている。また、ブロックデバイスアクセス用カーネルモジュール13は、ファイルやデバイスに対するオープンコマンドが伝達されると、それに対応付けてハンドルと呼ばれる記憶領域(図1ではハンドルH1,H2を例示。)を確保し、その記憶領域にハンドル固有データ(図1ではハンドル固有データ13B,13Cを例示。)を格納する。アプリケーションA1などからファイルシステム11に対してファイルのオープンコマンドが発行された場合、オープンされたファイルに対応するデバイスをオープンするコマンドは、ファイルシステム11からブロックデバイスアクセス用カーネルモジュール13へと伝達される。また、アプリケーションの中には、デバイスに対して直接オープンコマンドを発行する特殊アプリケーションA4(例えば、sfdisk,mkfs。)などもあり、このような特殊アプリケーションA4からはブロックデバイスアクセス用カーネルモジュール13へ直接コマンドが伝達される。ブロックデバイスアクセス用カーネルモジュール13は、アプリケーションA1等からコマンドが伝達されると、そのコマンド(リクエスト)を、ハンドルごとの固有データとして確保されるI/Oリクエストキューに格納する。なお、図1では、図を簡潔にする都合上、単一のブロックデバイスアクセス用カーネルモジュール13を図示してあるが、実際は、複数のデバイスがあれば、それら個々のデバイスそれぞれに対応する複数のデバイスドライバがコンピュータ1上で機能し、各デバイスドライバにおいてブロックデバイスアクセス用カーネルモジュール13が利用される。
デーモンプロセス15は、ブロックデバイスアクセス用カーネルモジュール13同様、OSの一部を構成するソフトウェアである。ブロックデバイスアクセス用カーネルモジュール13によってI/Oリクエストキューにコマンド(リクエスト)格納されると、そのコマンド(リクエスト)は、デーモンプロセス15へと伝達される。また、デーモンプロセス15は、自身で必要な記憶領域を確保し、その記憶領域にMMC用デバイス固有データ15Aを格納する。デバイス制御システムに関連するデータとしては、1個のフラグ(flag)、及び4個のカウンタ(r2,r3,w2,w3)が、MMC用デバイス固有データ15A内に確保される。
SDIOバスドライバ17及びI/Fハードウェア19は、デーモンプロセス15とMMCデバイス2との間に介在する通信用インターフェース部(本発明でいう通信用インターフェース部。)を構成している。デーモンプロセス15へコマンドが伝達された際には、そのコマンドがSDIOバスドライバ17及びI/Fハードウェア19を介してデーモンプロセス15からMMCデバイス2へと伝送される。
I/Oスケジューラ18は、I/Oリクエストキューに格納されたコマンド(リクエスト)を効率良く処理するために、OSが標準的に備えているソフトウェアである。I/Oスケジューラ18によるスケジューリングの方式には、いくつかの異なる方式が存在するが、その具体的な方式の違いは本発明の要部ではないので、ここでの説明は省略する。代表的なスケジューリングの一例としては、例えば、コマンドの処理順をソートしたり複数のコマンドをマージしたりすることで、ストレージデバイスにおけるシーク量を抑制するなどの効率化・最適化を図っている。
さらに、このコンピュータ1においては、上述の1個のフラグ(flag)、及び4個のカウンタ(r2,r3,w2,w3)に格納された値を、ユーザ空間で作動するプロセスから読み取り可能とするため、/procバイパスを利用した情報公開用インターフェース部(本発明でいう情報公開用インターフェース部に相当。)を設けてある。/procは、Linuxにおいて、OSの管理下にあるリソース関連の情報(例えば、カーネル空間に確保された記憶領域に格納された値)を、ファイルと同様の手順で読み出し可能とするために用意された仮想的なファイルシステムである。Linuxにおいて、MMCデバイス用の/procバイパスについては、OS標準での用意がないので、本実施形態では“/proc/driver/mmc-info”を新設して、上述の1個のフラグ及び4個のカウンタ値を読み出し可能としてある。なお、このような/procバイパスは、本実施形態では、動作完了確認ツールA5によって利用される。動作完了確認ツールA5の詳細については後述する。
[I/Oスケジューラにおいて実行される処理]
次に、I/Oスケジューラ18において実行される処理の一例について、図2(a)及び図2(b)のフローチャートに基づいて説明する。I/Oスケジューラ18において実際に実行されている処理の内容は、図2(a)及び図2(b)のフローチャートに例示したものよりも更に複雑かつ高度なものとされているが、I/Oスケジューラ18そのものは公知であり、その処理内容全てを説明しなくても本発明の特徴を理解することは可能なので、ここでは、I/Oスケジューラ18の処理の一部を抜粋して例示するにとどめる。
次に、I/Oスケジューラ18において実行される処理の一例について、図2(a)及び図2(b)のフローチャートに基づいて説明する。I/Oスケジューラ18において実際に実行されている処理の内容は、図2(a)及び図2(b)のフローチャートに例示したものよりも更に複雑かつ高度なものとされているが、I/Oスケジューラ18そのものは公知であり、その処理内容全てを説明しなくても本発明の特徴を理解することは可能なので、ここでは、I/Oスケジューラ18の処理の一部を抜粋して例示するにとどめる。
図2(a)に示す処理は、コンピュータ1の起動に伴ってI/Oスケジューラ18が稼働を開始すると実行され、その後は、コンピュータ1の作動が停止されるまでコンピュータ1に常駐する。図2(a)に示す処理を開始すると、I/Oスケジューラ18(正確には、I/Oスケジューラ18としての処理を実行するコンピュータ1;以下、単にI/Oスケジューラ18という。)は、まず、システムからI/Oリクエストキューを取得する(S105)。ここでは、システム上で何らかのファイルがオープンされ、そのファイルに対応するI/Oリクエストキューが生成されていれば、I/Oスケジューラ18は、I/Oリクエストキューの取得に成功する。
そこで、I/Oスケジューラ18は、I/Oリクエストキューを取得できたか否かを判断し(S110)、I/Oリクエストキューを取得できなかった場合は(S110:いいえ)、S105へと戻る。なお、この場合、I/Oスケジューラ18は、所定の待機時間が経過するのを待ってから、S105を再試行する。一方、S105を実行した結果、I/Oリクエストキューを取得できた場合は(S110:はい)、取得中のI/Oリクエストキューに対してI/Oスケジューリングを行う(S115)。なお、S115で実行されるI/Oスケジューリングの具体的処理は、既に述べた通り複雑な処理になるので、ここでは、図2(b)に処理の一部だけを例示して説明を続けることにする。
図2(b)に例示した処理を開始すると、I/Oスケジューラ18は、まず、I/Oリクエストキューを排他的に利用するため、I/Oリクエストキューを閉鎖する(S155)。これは、I/Oスケジューリングの最中に新たなリクエストがI/Oリクエストキューに格納されるのを防止するための措置である。そして、I/Oスケジューラ18は、I/Oリクエストキューの閉鎖に成功したか否かを判断し(S160)、I/Oリクエストキュー閉鎖に失敗した場合は(S160:いいえ)、図2(b)に示すI/Oスケジューリングを終了する。一方、I/Oリクエストキュー閉鎖に成功した場合(S160:はい)、I/Oスケジューラ18は、処理開始前のリクエストが2個以上か否かを判断する(S165)。
ここで、リクエストが2個以上ある場合は(S165:はい)、続いてマージ可能なリクエストがあるか否かを判断する(S170)。ここで、マージ可能なリクエストの一例を挙げれば、例えば、複数のリクエストのうち、連続したブロックへのアクセスを要求する2以上のリクエストが存在すれば、それら2以上のリクエストは、マージ可能なリクエストであると判断される。また、このような判断の際には、必要に応じてリクエストの処理順もマージを行う上で好適な順序に変更される。マージ可能なリクエストがある場合(S170:はい)、I/Oスケジューラ18は、2つのリクエストをマージして、1つのリクエストにする(S175)。そして、マージ可能なリクエストがまだあるか否かを判断し(S180)、まだある場合は(S180:はい)、S175へと戻る。これにより、マージ可能なリクエストがある間は、S175〜S180が繰り返されて、リクエストの総数が削減されるとともに、リクエストの処理順が最適化される。
S175を実行した結果、マージ可能なリクエストがなくなった場合(S180:いいえ)、I/Oスケジューラ18は、I/Oリクエストキューを解放して(S185)、図2(b)に示すI/Oスケジューリングを終了する。また、最初からリクエストが2個以上なかった場合(S165:いいえ)、又はマージ可能なリクエストがなかった場合も(S170:いいえ)、I/Oスケジューラ18は、I/Oリクエストキューを解放して(S185)、図2(b)に示すI/Oスケジューリングを終了する。
以上説明した通り、図2(a)及び図2(b)に示すI/Oスケジューラ18の処理では、I/Oリクエストキューに複数のリクエストが格納された場合に、可能であれば、リクエストの総数を削減するとともに、リクエストの処理順を最適化する。これにより、ストレージデバイス(本実施形態の場合はMMCデバイス2)に対して発行されるコマンド数を削減するとともに、無駄なシークの発生を抑制することができる。
[MMC用デーモンプロセス15において実行される処理]
次に、MMC用デーモンプロセス15(以下、単にデーモンプロセス15と称する。)において実行される処理について、図3のフローチャートに基づいて説明する。デーモンプロセス15は、MMCデバイス2の作動開始に伴って起動され、その後は、MMCデバイス2の作動が停止されるまでコンピュータ1に常駐する。図3に示す処理は、デーモンプロセス15が起動されたときに開始される。なお、以下、ディスクデバイスmmcblk0(/dev/mmcblk0)に対応するデーモンプロセス15を例に挙げて説明を続けるが、mmcblk0は単なる一例として例示するものであり、別のディスクデバイス(mmcblk1〜mmcblk31のいずれか)であっても同様の処理となるのはもちろんである。
次に、MMC用デーモンプロセス15(以下、単にデーモンプロセス15と称する。)において実行される処理について、図3のフローチャートに基づいて説明する。デーモンプロセス15は、MMCデバイス2の作動開始に伴って起動され、その後は、MMCデバイス2の作動が停止されるまでコンピュータ1に常駐する。図3に示す処理は、デーモンプロセス15が起動されたときに開始される。なお、以下、ディスクデバイスmmcblk0(/dev/mmcblk0)に対応するデーモンプロセス15を例に挙げて説明を続けるが、mmcblk0は単なる一例として例示するものであり、別のディスクデバイス(mmcblk1〜mmcblk31のいずれか)であっても同様の処理となるのはもちろんである。
図3に示す処理を開始すると、デーモンプロセス15(正確には、デーモンプロセス15としての処理を実行するコンピュータ1;以下、単にデーモンプロセス15という。)は、フラグflagの初期化(ゼロクリア)を行い(S203)、他のデバイスにも時間を与えるため、所定時間ウエイトする(S205)。そして、ディスクデバイスmmcblk0が取り外されたか否かを判断し(S210)、ディスクデバイスmmcblk0が取り外されている場合は(S210:はい)、フラグflagの初期化(ゼロクリア)を行って(S213)、デーモンプロセス15による処理を終了する。
一方、S210において、ディスクデバイスmmcblk0が取り外されていないと判断された場合(S210:いいえ)、デーモンプロセス15は、デバイス固有データから最初のオープン中ハンドルを取得する(S215)。そして、オープン中のハンドルがない場合は(S220:いいえ)、フラグflagのビット7−0をクリアして(S221)、S205へと戻る。一方、オープン中のハンドルがある場合(S220:いいえ)、デーモンプロセス15は、フラグflagのビット7をセットした後、フラグflagのビット6−0をクリアして(S222)、取得中ハンドルのI/Oリクエストキューが閉鎖中か否かを判断する(S223)。ここで、取得中ハンドルのI/Oリクエストキューが閉鎖中でなければ(S223:いいえ)、デーモンプロセス15は、取得中ハンドルのI/Oリクエストキューから1リクエストを取り出す(S225)。
続いて、デーモンプロセス15は、取り出したリクエストの種別を判断し(S230)、リクエストがリードであった場合(S230:リード)、フラグflagのビット4をセットし、カウンタr2をインクリメントする(S235)。なお、カウンタr2は、デーモンプロセス15の作動開始時にMMC用デバイス固有データ15A内に確保されて初期化(ゼロクリア)されており、その後は、S235が実行されるたびにインクリメントされることになる。
その後、デーモンプロセス15は、MMCデバイス2に対してMMC形式リードコマンドを発行して完了を待つ(S240)。S240において、完了を待つ間は他のデバイスに時間を解放する。そして、MMCデバイス2からの完了応答が返されたら、カウンタr3をインクリメントして(S245)、S270へ進む。なお、カウンタr3は、デーモンプロセス15の作動開始時にMMC用デバイス固有データ15A内に確保されて初期化(ゼロクリア)されており、その後は、S245が実行されるたびにインクリメントされることになる。
一方、S230において、リクエストがライトであった場合(S230:ライト)、デーモンプロセス15は、フラグflagのビット4をセットし、カウンタw2をインクリメントする(S250)。なお、カウンタw2は、デーモンプロセス15の作動開始時にMMC用デバイス固有データ15A内に確保されて初期化(ゼロクリア)されており、その後は、S250が実行されるたびにインクリメントされることになる。
その後、デーモンプロセス15は、MMCデバイス2に対してMMC形式ライトコマンドを発行し完了を待つ(S255)。S255において、完了を待つ間は他のデバイスに時間を解放する。MMCデバイス2からの完了応答が返されたら、カウンタw3をインクリメントして(S260)、S270へ進む。なお、カウンタw3は、デーモンプロセス15の作動開始時にMMC用デバイス固有データ15A内に確保されて初期化(ゼロクリア)されており、その後は、S260が実行されるたびにインクリメントされることになる。
さらに、S230において、リクエストがなかった場合は(S230:リクエスト無し)、そのままS270へ進む。また、S223において、取得中ハンドルのI/Oリクエストキューが閉鎖中であれば(S223:はい)、I/Oスケジューラ18がスケジューリング中である可能性があるので、その場合は、フラグflagのビット1をセットして(S265)、S270へ進む。
以上のようにしてS245,S260,S230:リクエスト無し,又はS265を終えたら、デーモンプロセス15は、MMC用デバイス固有データ15Aから次のオープン中ハンドルを取得する(S270)。そして、オープン中のハンドルがない場合は(S275:はい)、フラグflagのビット7をクリアして(S280)、S205へと戻る一方、オープン中のハンドルがある場合は(S275:いいえ)、S223へと戻る。
以上説明したように、図3に示した処理では、S240又はS255においてデバイスに対してリードコマンド又はライトコマンドが発行されることとなるたびに、その発行前後双方のタイミングとなるS235及びS245、若しくはS250及びS260において、カウンタr2及びカウンタr3、若しくはカウンタw2及びカウンタw3がインクリメントされる。したがって、これらのカウンタr2、r3、w2、w3には、デーモンプロセス15におけるリード又はライトのSCSIコマンドの発行回数が、発行直前及び発行後の待機完了直後双方のタイミングで蓄積・保持されることになる。
また、フラグflagのビット7は、オープン中のハンドルがあれば(S220:はい)、直ちにセットされる一方、オープン中のハンドルがなければ(S220:いいえ、又はS275:いいえ)、クリアされる。そして、MMCに対してリードコマンド又はライトコマンドが発行される場合は、フラグflagのビット4がセットされる一方、I/Oリクエストキューが閉鎖中の場合は(S223:はい)、フラグflagのビット1がセットされる。したがって、このフラグflagに基づいて、I/Oリクエストキューの状態を判断することができ、特にビット7−0が全てゼロクリアされているか否かに基づいて、現在処理中のリクエストが存在するか否かを判断することができる。
[/proc/driver/mmc-info処理]
次に、/proc/driver/mmc-info処理について、図8(a)のフローチャートに基づいて説明する。図8(a)に示すフローチャートは、“/proc/driver/mmc-info”に対するリードが行われた場合に実行される処理であり、この処理が実行されることで、図8(b)に示すような形式の情報がリード結果として出力されることになる。
次に、/proc/driver/mmc-info処理について、図8(a)のフローチャートに基づいて説明する。図8(a)に示すフローチャートは、“/proc/driver/mmc-info”に対するリードが行われた場合に実行される処理であり、この処理が実行されることで、図8(b)に示すような形式の情報がリード結果として出力されることになる。
より詳しく説明すると、/proc/driver/mmc-info処理を開始すると、コンピュータ1は、まず、図8(b)に示すような情報のうち、先頭1行にある情報「Info:〜」を出力する(S905)。そして、カウンタNに0(ゼロ)をセットして(S907)、N枚目のMMC(Nは0〜3の整数)があるか否かを判断する(S910)。本実施形態においては、“mmcblk0〜mmcblk3”までをサポートしており、そのためNは0〜3の整数とされているが、このカウンタNの最大値は3以上とされていてもよい。
S910において、N枚目のMMC(Nは0〜3の整数)があった場合(S910:ある)、コンピュータ1は、ブロックデバイス汎用デバイス固有データ13A中に含まれるgendisk構造体中の文字型配列disk_name[32]を参照し(S915)、MMCに対して割り当てられるディスクデバイス名“mmcblkN”を取得する。
続いて、コンピュータ1は、「cidN:〜」(Nは0〜3の整数)の行を出力し(S930)、「csdN:〜」(Nは0〜3の整数)の行を出力し(S935)、「FRWcN:〜」の行を出力する(S940)。そして、S940を終えるか、S910でN枚目のMMC(Nは0〜3の整数)がないと判断された場合は(S910:ない)、変数Nをインクリメントし(S950)、変数Nが3以下か否かを判断する(S960)。変数Nが3以下であれば(S960:はい)、S910へと戻る。これにより、S910以降の処理が繰り返され、N=0〜3の順にディスクデバイス“mmcblkN”に対応する処理が繰り返される。変数Nが3を超えたら(S960:いいえ)、/proc/driver/mmc-info処理を終了する。
以上のような/proc/driver/mmc-info処理により、図8(b)に例示するような情報が出力される。図8(b)に例示した情報の場合、N=0に対応する情報が3行分、N=1に対応する情報が3行分、それぞれ出力されている。S940で出力される行には、図8(b)に例示した通り、文字列「FRWcN:〜」に引き続いて、ディスクネーム、フラグflag、及び4個のカウンタ(r2,r3,w2,w3)の値が列挙される。
[動作完了確認ツールにおいて実行される処理]
次に、動作完了確認ツールA5において実行される処理について、図4のフローチャートに基づいて説明する。動作完了確認ツールA5は、コマンド発行元プロセスからブロックデバイスアクセス用カーネルモジュール13へと伝達されるコマンドが、MMCデバイス2へ実際に伝達されたかどうかをコマンド発行元プロセス側で確認可能とするためのツールである。
次に、動作完了確認ツールA5において実行される処理について、図4のフローチャートに基づいて説明する。動作完了確認ツールA5は、コマンド発行元プロセスからブロックデバイスアクセス用カーネルモジュール13へと伝達されるコマンドが、MMCデバイス2へ実際に伝達されたかどうかをコマンド発行元プロセス側で確認可能とするためのツールである。
この動作完了確認ツールA5はコマンド発行元プロセス側で必要なときに任意に起動され、その際、図4に示す処理が実行されることになる。なお、以下の説明では、説明を簡便にするため、MMCデバイス2がコンピュータ1においてディスクデバイス“mmcblk0”として認識されている場合を例に挙げて説明する。ただし、動作完了確認ツールA5は、“mmcblk0”以外のディスクデバイス(本実施形態であれば、mmcblk1〜mmcblk3のいずれか)を対象にして所期の処理を行うこともできる。
図4に示す処理を開始すると、動作完了確認ツールA5(正確には、動作完了確認ツールA5としての処理を実行するコンピュータ1;以下、単に動作完了確認ツールA5という。)は、“/proc/driver/mmc-info”ファイルをオープンする(S305)。ここで、“/proc/driver/mmc-info”ファイルをオープンできない場合(S310:いいえ)、動作完了確認ツールA5は、図4に示す処理を終了する(mmcblk0が見つからない エラー終了)。
一方、S310において、ファイルをオープンできた場合(S310:はい)、動作完了確認ツールA5がファイル“/proc/driver/mmc-info”からデータをリードすると、既に説明した/proc/driver/mmc-info処理(図8(a)参照。)が実行され、その結果、動作完了確認ツールA5は、図8(b)に示すような形式の情報を読み込むことができる。
そこで、動作完了確認ツールA5は、読み込んだ情報中からキーワード「FRWc」を含む、最初の行を検索する(S315)。図8(b)に例示する情報の場合、キーワード「FRWc」を含む、最初の行は「FRWc0: mmcblk0 07001000 0000008f 0000008f 00000002 00000002」という行であり、この行には、ディスク名“mmcblk0”と上述のフラグflag、及び4個のカウンタ(r2,r3,w2,w3)に格納された値が列挙されている。
ここで、「FRWc」の行が見つからなければ(S317:いいえ)、動作完了確認ツールA5は、図4に示す処理を終了する(mmcblk0が見つからない エラー終了)。一方、S317において、「FRWc」の行が見つかれば(S317:はい)、「FRWcN:」の次の文字列がディスク名disk_name[32]なので(S320)、ディスク名が“mmcblk0”であるか否かを判断する(S325)。
S325において、ディスク名が“mmcblk0”でない場合は(S325:いいえ)、図4に例示した処理の処理対象となるディスクデバイスではないので、その場合、動作完了確認ツールA5は、キーワード「FRWc」を含む、次の行を検索して(S330)、S317へと戻る。これにより、ディスク名が“mmcblk0”である行が見つかるまでキーワード「FRWc」の行が順に検索されることになり、該当する行が見つからない場合(S317:いいえ)、動作完了確認ツールA5は、図4に示す処理を終了することになる(mmcblk0が見つからない エラー終了)。
また、S325において、ディスク名が“mmcblk0”であった場合は(S325:はい)、“mmcblk0”が接続中であることが確認されたことになる(S340)。そこで、この場合、動作完了確認ツールA5は、タイムアウトのカウンタとして所定時間(例えば1分程度)を設定し(S345)、カウンタr2,w2の値を、それぞれカウンタr1,w1に保存する(S348)。そして、一定時間(例えば100ms)が経過するのを待って、タイムアウトのカウンタを上記一定時間分(上記例では100ms)減らして(S350)、タイムアウトか否かを判断する(S360)。ここで、タイムアウトであった場合(S360:はい)、動作完了確認ツールA5は、図4に示す処理を終了する(タイムアウトエラー終了)。
一方、S360において、タイムアウトではない場合(S360:いいえ)、動作完了確認ツールA5は、ファイル“/proc/driver/mmc-info”ファイルを再読み込みして、“FRWcN: mmcblk0 …”の行から情報取得を行う(S365)。そして、動作完了確認ツールA5は、フラグflagの下位8ビット(ビット7−0)が全てゼロか否かを判断する(S367)。ここで、フラグflagの下位8ビットが全てゼロとなるのは、デーモンプロセス15において、オープン中のハンドルがないと判断されている場合であり(S220:いいえ、又はS275:いいえ)、この場合、少なくともデーモンプロセス15は、MMCデバイス2に対するコマンドを発行しないことを意味する。逆に、フラグflagの下位8ビットが全てゼロでなければ、デーモンプロセス15は、MMCデバイス2に対するコマンドを発行する可能性がある。そこで、S367において、フラグflagの下位8ビットが全てゼロでない場合は(S367:いいえ)、S348へと戻る。これにより、S345で設定した時間が経過するまでは、S348〜S367が繰り返されることになる。
一方、S367において、フラグflagの下位8ビットが全てゼロであった場合(S367:はい)、動作完了確認ツールA5は、カウンタr1,r2,r3の値が全て一致するか否かを判断する(S370)。ここで、カウンタr1,r2,r3の値が全て一致するのは、S235及びS245が実行されてr2,r3の値が確定した後、S348でr2がr1に保存され、S350で少なくとも100ms待機した後、S365で再読み込みを行った結果、r2の値に変化がなかった、という場合に該当する。
これは、ブロックデバイスアクセス用カーネルモジュール13でリクエストキューに格納されたリクエスト(リードコマンド)が、デーモンプロセス15でもMMCデバイス2へと発行され、その応答がデバイスからデーモンプロセス15へ既に返っており、かつ、その後、少なくとも100msにわたって、デーモンプロセス15はコマンドを発行していないことを意味する。逆に、デーモンプロセス15からMMCデバイス2へコマンドが発行されたものの、その応答がデバイスからデーモンプロセス15へまだ返っていない場合や、100ms待機している間に、デーモンプロセス15からMMCデバイス2へ新たにコマンドを発行している場合、上記カウンタ値は一致しない。
そこで、S370において、カウンタr1,r2,r3の値が一致しない場合は(S370:いいえ)、S350へと戻る。これにより、S345で設定した時間が経過するまでは、S348〜S370が繰り返されることになる。一方、S370において、カウンタr1,r2,r3の値が全て一致した場合(S370:はい)、動作完了確認ツールA5は、カウンタw1,w2,w3が全て一致するか否かを判断する(S375)。ここで、カウンタw1,w2,w3の値が全て一致するのは、S250及びS260が実行されてw2,w3の値が確定した後、S348でw2がw1に保存され、S350で少なくとも100ms待機した後、S365で再読み込みを行った結果、w2の値に変化がなかった、という場合に該当する。
これは、ブロックデバイスアクセス用カーネルモジュール13でリクエストキューに格納されたリクエスト(ライトコマンド)が、デーモンプロセス15でもMMCデバイス2へと発行され、その応答がデバイスからデーモンプロセス15へ既に返っており、かつ、その後、少なくとも100msにわたって、デーモンプロセス15はコマンドを発行していないことを意味する。逆に、デーモンプロセス15からMMCデバイス2へコマンドが発行されたものの、その応答がデバイスからデーモンプロセス15へまだ返っていない場合や、100ms待機している間に、デーモンプロセス15からMMCデバイス2へ新たにコマンドを発行している場合、上記カウンタ値は一致しない。
そこで、S375において、カウンタw1,w2,w3の値が一致しない場合は(S370:いいえ)、S350へと戻る。これにより、S345で設定した時間が経過するまでは、S348〜S375が繰り返されることになる。したがって、リード又はライトいずれかのコマンドが完全にデバイスへと伝わって、その後、100ms待機しても新たなコマンドが発行されない、という状態にならない限り、S348〜S375が繰り返され、その繰り返しの中でタイムアウトとなった場合には(S360:はい)、タイムアウトでエラー終了となるのである。
一方、S367において、フラグflagの下位8ビットが全てゼロで、かつS370において、カウンタr1,r2,r3の値が全て一致し(S370:はい)、かつS375において、カウンタw1,w2,w3の値が全て一致した場合(S375:はい)、動作完了確認ツールA5は、図4に示す処理を正常終了する。
以上説明したように、動作完了確認ツールA5は、リードコマンド及びライトコマンドがブロックデバイスアクセス用カーネルモジュール13からデーモンプロセス15経由でMMCデバイス2へと伝達され、デバイスからの応答がデーモンプロセス15へ返っていて、その後、所定時間にわたってデーモンプロセス15からコマンドが発行されない状況下では正常終了し、そのような状況になければエラー終了する。正常終了したかエラー終了したかを示す情報は、動作完了確認ツールA5を起動した上位プロセス(例えば、アプリケーションなど)へと返される。したがって、上位プロセスでは、動作完了確認ツールA5を利用して、MMCデバイス2に対して発行したコマンドが、デーモンプロセス15において処理済みとなっているか否かを確認することができる。
[アプリケーションにおいて実行される処理の一例]
次に、上述のような動作完了確認ツールA5を利用するアプリケーションの一例を、図5〜図7のフローチャートに基づいて説明する。以下に説明するアプリケーションA1は、ディスクデバイス“mmcblk0”の再初期化を行ってから、引き続いてパーティションの切り直しを行い、更に引き続いてファイルシステム“mmcblk0p1”のマウントを行うものである。
次に、上述のような動作完了確認ツールA5を利用するアプリケーションの一例を、図5〜図7のフローチャートに基づいて説明する。以下に説明するアプリケーションA1は、ディスクデバイス“mmcblk0”の再初期化を行ってから、引き続いてパーティションの切り直しを行い、更に引き続いてファイルシステム“mmcblk0p1”のマウントを行うものである。
なお、以下の処理でも、説明を簡潔にするために、ディスクデバイス“mmcblk0”,ファイルシステム“mmcblk0p1”,マウントポイント“/mnt/mmc1”などの具体例を挙げながら説明を行うが、これらの具体例に限られないのはもちろんである。
図5に示すディスクの再初期化処理を開始すると、アプリケーションA1(正確には、アプリケーションA1としての処理を実行するコンピュータ1;以下、単にアプリケーションA1という。)は、“/dev/mmcblk0”を対象にしてディスク使用停止処理を実行する(S405)。このディスク使用停止処理は、詳しくは図6に示すような処理となる。
すなわち、図6に示す処理では、まず、アプリケーションA1からの指令により、全アプリケーションでマウントポイント“/mnt/mmc1”以下の全てのオープン中のファイルをクローズする(S505)。なお、この例は、“/dev/mmcblk0p1”が“/mnt/mmc1”にマウント中であることを想定している例であり、マウントポイントの具体的パス名は任意である。続いて、アプリケーションA1は、syncコマンドを実行して、ディスクキャッシュ11Aに保持されているデータをMMCデバイス2へ書き出す(S510)。そして、“/mnt/mmc1”をアンマウントして、“/dev/mmcblk0p1”のマウントを解除する(S515)。これにより、“/dev/mmcblk0p1”に対しては、少なくともファイルシステム11経由でのアクセスが行われない状態になる。
次に、アプリケーションA1は、ディスクデバイス“mmcblk0”のフラッシュデバイス(flushdevice)処理を行い、ブロックデバイスアクセス用カーネルモジュール13の動作完了待ちになる(S520)。このフラッシュデバイス処理は、ブロックデバイスアクセス用カーネルモジュール13が内部的に保持(キャッシュ)しているデータをデバイス側へ掃き出させるために行われる処理であり、Linux搭載コンピュータでは既に行われている周知の処理である。具体的には、フラッシュデバイス処理は、図7(a)に示すような処理となり、アプリケーションA1は、“/dev/mmcblk0”をオープンしてハンドルをファイルディスクリプタfdに格納し(S605)、システムコール“ioctl(fd,BLKFLSBUF,0)”を実行する(S610)。これにより、ブロックデバイスアクセス用カーネルモジュール13は、リクエストキュー内に未処理のコマンドが残されていたとしても、それらを全てリクエストキューへ積み、これにより、それらのデータをデーモンプロセス15へ引き渡す準備を完了する。S610を終えたら、アプリケーションA1は、fdのクローズ(“/dev/mmcblk0”のクローズ)を行って(S615)、図7(a)に示すを完了する。
さて、こうしてフラッシュデバイス処理を完了したら、再び図6に戻って、アプリケーションA1は、動作完了確認ツールA5を起動して“mmcblk0”の動作完了待ちになる(S525)。先に説明した通り、動作完了確認ツールA5は、デーモンプロセス15がデバイスからの応答を受け取ったことを検出したときに正常終了するので、S525では、デーモンプロセス15の動作完了待ちを行うことになる。ここで、動作完了確認ツールA5が正常終了すれば、デーモンプロセス15が保持していたデータ全てがデバイスに掃き出されたことを意味するので、これにて図6に示すディスクの使用停止処理を完了する。なお、動作完了確認ツールA5がエラー終了した場合は、エラーメッセージを表示して処理を中止するなどの対処を行えばよいが、この種のエラー処理自体は一般的なものなので、これ以上の詳細な説明は省略する。
図6に示すディスクの使用停止処理を完了したら、図5のS405を終えたことになるので、続いて、アプリケーションA1は、“sfdisk”コマンドを実行し、パーティションの切り直しを行う(S410)。そして、“mmcblk0”のフラッシュデバイス処理を行って、ブロックデバイスアクセス用カーネルモジュール13の動作完了待ちになり(S415)、続いて、動作完了確認ツールA5で“mmcblk0”の動作完了待ち、すなわち、デーモンプロセス15の動作完了待ちになる(S420)。
S415,S420は、先に説明したS520,S525と同等な処理であり、これらの処理により、ブロックデバイスアクセス用カーネルモジュール13の保持するデータ、デーモンプロセス15の保持するデータが、それぞれデバイス側へ確実に掃き出されるのを待つことになる。そして、S420を終えたら、“sfdisk”コマンドの実行に伴ってMMCデバイス2へ書き込まれるべきデータが、確実にデバイスに書き込まれたことになる。
そこで、アプリケーションA1は、mkfsコマンドを実行し、パーティションのフォーマットを行う(S425)。そして、“mmcblk0”のフラッシュデバイス処理を行って、ブロックデバイスアクセス用カーネルモジュール13の動作完了待ちとなり(S430)、続いて、動作完了確認ツールA5で“mmcblk0”の動作完了待ち、すなわち、デーモンプロセス15の動作完了待ちになる(S435)。S430,S435も、先に説明したS520,S525,S415,S420と同等な主旨で実行する処理である。
S435を終えたら、“mkfs”コマンドの実行に伴ってMMCデバイス2へ書き込まれるべきデータが、確実にデバイスに書き込まれたことになるので、アプリケーションA1は、ディスクデバイス“/dev/mmcblk0”の使用再開処理を行う(S440)。なお、S440は、詳しくは図7(b)に示すような処理となる。すなわち、アプリケーションA1は、“/dev/mmcblk0p1”を“/mnt/mmc1”にマウントする(S705)。なお、この例は、“/dev/mmcblk0p1”が“/mnt/mmc1”にマウントされることを想定している例であり、マウントポイントの具体的パス名は任意である。このようなマウントが行われると、以降は、全アプリケーションで“/mnt/mmc1”以下のファイルが使用可能になり(S710)、図7(b)に示すディスクの使用再開処理が完了する。そして、図7(b)に示すディスクの使用再開処理が完了すると、図5のS440が完了するので、これにて図5に示すディスクの再初期化処理全てが完了する。
以上説明したように、上記のようなアプリケーションA1では、“sfdisk”の実行後、フラッシュデバイス処理を行ってブロックデバイスアクセス用カーネルモジュール13の管理下にあるデータをデーモンプロセス15へと引き渡している。しかも、動作完了確認ツールA5でデーモンプロセス15の管理下にあるデータが、全てデバイスに書き込まれたことを確認してから、“mkfs”を実行している。
したがって、このような確認をすることなく“sfdisk”や“mkfs”を連続的に実行するものや、“sfdisk”の実行後にフラッシュデバイス処理は行うものの、デーモンプロセス15の動作状況を確認することなく“mkfs”を実行するものなどとは異なり、ディスク上に生じた不整合なデータが残っているうちに、新たなコマンドが実行されてしまうことがなく、また、それを防止するために、経験則に基づく不確実な様子見を過剰に長時間にわたって行う必要もない。
ちなみに、上記実施形態においては、フラグflagが、本発明でいう第一記憶手段に相当する。また、カウンタr3,w3が、それぞれ本発明でいう第二記憶手段に相当する。
以上、本発明の実施形態について説明したが、本発明は上記の具体的な一実施形態に限定されず、この他にも種々の形態で実施することができる。
以上、本発明の実施形態について説明したが、本発明は上記の具体的な一実施形態に限定されず、この他にも種々の形態で実施することができる。
1・・・コンピュータ、2・・・MMCデバイス、11・・・ファイルシステム、13・・・ブロックデバイスアクセス用カーネルモジュール、15・・・MMC用デーモンプロセス、17・・・SDIOバスドライバ、18・・・I/Oスケジューラ、19・・・I/Fハードウェア、A1〜A3・・・アプリケーション、A4・・・特殊アプリケーション、A5・・・動作完了確認ツール。
Claims (4)
- オペレーティングシステムによって制御されるコンピュータ上のカーネル空間において作動するソフトウェアであり、前記コンピュータ上のユーザ空間において作動するコマンド発行元プロセスから、前記コンピュータに接続されたブロックデバイスに対するデータのリード又はライトを要求するコマンドが発行された場合に、前記コマンド発行元プロセスから前記コマンドが伝達されるとともに、当該コマンドが前記コンピュータに接続されたMMC(Multi Media Card)デバイスに対するデータのリード又はライトを要求するコマンドであった場合には、当該コマンドを所定のキューに格納するブロックデバイスアクセス用カーネルモジュールと、
前記コンピュータ上のカーネル空間において作動するソフトウェアであり、前記ブロックデバイスアクセス用カーネルモジュールによって前記コマンドが前記キューに格納された場合に、当該キューから前記コマンドを取得するデーモンプロセスと、
前記デーモンプロセスと前記デバイスとの間に介在するハードウェア及びソフトウェアによって構成され、前記デーモンプロセスが前記キューから前記コマンドを取得した場合に、当該コマンドを前記デーモンプロセスから前記デバイスへと伝送する通信用インターフェース部と、
前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記キューに前記コマンドが格納されている可能性がある状態及び当該可能性がない状態、いずれの状態であるのかを示す情報が、前記デーモンプロセスによって書き込まれて当該情報を記憶する第一記憶手段と、
前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記デーモンプロセスから前記通信用インターフェース部を介して前記デバイスへの前記コマンドの伝送が完了した際に、その旨を示す情報が前記デーモンプロセスによって書き込まれて当該情報を記憶する第二記憶手段と、
前記第一記憶手段及び前記第二記憶手段に記憶された情報を、前記コンピュータ上のユーザ空間において作動するプロセスから読み取り可能とする情報公開用インターフェース部と
を備え、
前記コンピュータ上のユーザ空間において作動するプロセスが、前記情報公開用インターフェース部を介して前記第一記憶手段及び前記第二記憶手段それぞれに記憶された情報を読み取って、それらの情報に基づいて、前記デバイスへの前記コマンドの伝送が完了したか否かを判定可能とされている
ことを特徴とするデバイス制御システム。 - 前記第二記憶手段は、
前記通信用インターフェース部を介して前記デーモンプロセスから前記デバイスへ前記コマンドを伝送する直前に、所定値を加算又は減算した値に更新されるカウンタ値が、前記デーモンプロセスによって書き込まれる第一カウンタと、
前記通信用インターフェース部を介して前記デーモンプロセスから前記デバイスへ前記コマンドを伝送した後、当該コマンドに対応する処理が完了した直後に、所定値を加算又は減算した値に更新されるカウンタ値が、前記デーモンプロセスによって書き込まれる第二カウンタと
を備えることを特徴とする請求項1に記載のデバイス制御システム。 - 前記コンピュータ上のカーネル空間において作動するソフトウェアであり、前記キューに格納された前記コマンドの処理順を管理、最適化するスケジューラを備えており、
前記第一記憶手段には、前記スケジューラによって前記キューに対するアクセスが行われている場合に、前記コマンドが格納されている可能性がある状態を示す情報が、前記デーモンプロセスによって書き込まれる
ことを特徴とする請求項1又は請求項2に記載のデバイス制御システム。 - オペレーティングシステムによって制御されるコンピュータ上のカーネル空間において作動するソフトウェアであり、前記コンピュータ上のユーザ空間において作動するコマンド発行元プロセスから、前記コンピュータに接続されたブロックデバイスに対するデータのリード又はライトを要求するコマンドが発行された場合に、前記コマンド発行元プロセスから前記コマンドが伝達されるとともに、当該コマンドが前記コンピュータに接続されたMMC(Multi Media Card)デバイスに対するデータのリード又はライトを要求するコマンドであった場合には、当該コマンドを所定のキューに格納するブロックデバイスアクセス用カーネルモジュールと、
前記コンピュータ上のカーネル空間において作動するソフトウェアであり、前記ブロックデバイスアクセス用カーネルモジュールによって前記コマンドが前記キューに格納された場合に、当該キューから前記コマンドを取得するデーモンプロセスと、
前記デーモンプロセスと前記デバイスとの間に介在するハードウェア及びソフトウェアによって構成され、前記デーモンプロセスが前記キューから前記コマンドを取得した場合に、当該コマンドを前記デーモンプロセスから前記デバイスへと伝送する通信用インターフェース部と、
前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記キューに前記コマンドが格納されている可能性がある状態及び当該可能性がない状態、いずれの状態であるのかを示す情報が、前記デーモンプロセスによって書き込まれて当該情報を記憶する第一記憶手段と、
前記コンピュータ上のカーネル空間に確保される記憶手段であり、前記デーモンプロセスから前記通信用インターフェース部を介して前記デバイスへの前記コマンドの伝送が完了した際に、その旨を示す情報が前記デーモンプロセスによって書き込まれて当該情報を記憶する第二記憶手段と、
前記第一記憶手段及び前記第二記憶手段に記憶された情報を、前記コンピュータ上のユーザ空間において作動するプロセスから読み取り可能とする情報公開用インターフェース部と
を備えるデバイス制御システムが機能する前記コンピュータを、さらに、前記コンピュータ上のユーザ空間において作動するプロセスとして機能させるプログラムであって、
前記コンピュータを、
前記情報公開用インターフェース部を介して前記第一記憶手段及び前記第二記憶手段それぞれに記憶された情報を読み取る読取手段、
前記読取手段によって読み取った情報に基づいて、前記デバイスへの前記コマンドの伝送が完了したか否かを判定する判定手段、及び
前記判定手段による判定結果を、前記コンピュータ上のユーザ空間において作動する他のプロセスへ提供する情報提供手段
として機能させることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012106901A JP5505456B2 (ja) | 2012-05-08 | 2012-05-08 | デバイス制御システム及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012106901A JP5505456B2 (ja) | 2012-05-08 | 2012-05-08 | デバイス制御システム及びプログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2013235384A JP2013235384A (ja) | 2013-11-21 |
JP5505456B2 true JP5505456B2 (ja) | 2014-05-28 |
Family
ID=49761470
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012106901A Active JP5505456B2 (ja) | 2012-05-08 | 2012-05-08 | デバイス制御システム及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5505456B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9519440B2 (en) * | 2013-09-10 | 2016-12-13 | Qualcomm Incorporated | Providing command queuing in embedded memories |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH05274242A (ja) * | 1992-03-27 | 1993-10-22 | Nec Corp | 非同期入出力デーモン処理方式 |
JPH11212900A (ja) * | 1998-01-22 | 1999-08-06 | Fujitsu Ltd | システム制御装置 |
JP2001060147A (ja) * | 1999-08-24 | 2001-03-06 | Hitachi Ltd | 遅延ライトの障害制御方法 |
-
2012
- 2012-05-08 JP JP2012106901A patent/JP5505456B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
JP2013235384A (ja) | 2013-11-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
WO2021238267A1 (zh) | 基于集群文件系统的数据备份方法、装置及可读存储介质 | |
CN102541475B (zh) | 数据存储方法和数据存储装置 | |
KR101491626B1 (ko) | 메모리 저장 장치, 데이터베이스를 위한 트랜잭션 기능을 지원하는 방법 및 메모리 시스템 | |
JP4186602B2 (ja) | ジャーナルログを利用した更新データ書込方法 | |
JP6181860B2 (ja) | ストレージ装置とそのデータ処理方法及びストレージシステム | |
EP3608790B1 (en) | Modifying nvme physical region page list pointers and data pointers to facilitate routing of pcie memory requests | |
US11010094B2 (en) | Task management method and host for electronic storage device | |
CN102667714B (zh) | 支持访问由操作系统环境外的资源提供的功能的方法和系统 | |
CN110457261B (zh) | 数据访问方法、装置及服务器 | |
US11868780B2 (en) | Central processor-coprocessor synchronization | |
US8180930B2 (en) | Information processing device, and device initialization method in the information processing device | |
WO2017157145A1 (zh) | 一种数据预取方法以及装置 | |
KR101529651B1 (ko) | 메모리 저장 장치, 데이터베이스를 위한 트랜잭션 기능을 지원하는 방법 및 메모리 시스템 | |
JP5932947B2 (ja) | ホスト及びシステム | |
KR101636878B1 (ko) | 가상화 환경에서의 데이터 처리 방법 및 드라이버 | |
US9507657B2 (en) | Investigation program, information processing apparatus, and information processing method | |
JP5505456B2 (ja) | デバイス制御システム及びプログラム | |
CN117873568A (zh) | 一种ssd控制器、固态硬盘及数据处理方法 | |
TW434491B (en) | Increasing I/O performance through storage of packetized operational information in local memory | |
CN112433669A (zh) | 一种分布式存储卷在线迁移的方法、系统、设备及介质 | |
JP5287938B2 (ja) | デバイス制御システム及びプログラム | |
JP5699665B2 (ja) | サーバ装置、処理実行方法およびプログラム | |
JP5310770B2 (ja) | デバイス制御システム、及びプログラム | |
JP4140750B2 (ja) | Icカード内メモリアクセス制御方法および装置並びにプログラム記憶媒体 | |
WO2011119151A1 (en) | Communication between a computer and a data storage device |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20140131 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20140218 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20140303 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 5505456 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |