JP2009252107A - 記録装置、ファイルディスクリプタ生成方法、プログラム - Google Patents

記録装置、ファイルディスクリプタ生成方法、プログラム Download PDF

Info

Publication number
JP2009252107A
JP2009252107A JP2008101722A JP2008101722A JP2009252107A JP 2009252107 A JP2009252107 A JP 2009252107A JP 2008101722 A JP2008101722 A JP 2008101722A JP 2008101722 A JP2008101722 A JP 2008101722A JP 2009252107 A JP2009252107 A JP 2009252107A
Authority
JP
Japan
Prior art keywords
virtual device
file descriptor
file
socket
kernel
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.)
Granted
Application number
JP2008101722A
Other languages
English (en)
Other versions
JP4518177B2 (ja
Inventor
Yoshinori Honjo
良規 本庄
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.)
Sony Corp
Original Assignee
Sony Corp
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 Sony Corp filed Critical Sony Corp
Priority to JP2008101722A priority Critical patent/JP4518177B2/ja
Priority to US12/418,680 priority patent/US8073885B2/en
Publication of JP2009252107A publication Critical patent/JP2009252107A/ja
Application granted granted Critical
Publication of JP4518177B2 publication Critical patent/JP4518177B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

【課題】 プロセス間でファイルディスクリプタを受け渡すことなく、クライアント内の複数のプロセスが1つのソケットを共有してサーバと通信を行うことのできる記録装置を提供する。
【解決手段】 クライアントの仮想デバイスがあるプロセスによって既にオープンされているときに、別のプロセスからその仮想デバイスをオープンする場合に、そのプロセスのファイルディスクリプタを既存のカーネルファイル表をもとに再生成するsock_remap_fd()関数を実行する。すなわち、そのプロセスのプロセス表から未使用の番号のファイルディスクリプタを探し出し、プロセス表にそのファイルディスクリプタと、カーネルファイル表のソケット構造体(sock)へのインデックスが登録されたエントリへのインデックスとを結び付けて登録する。
【選択図】 図4

Description

本発明は、記録装置、ファイルディスクリプタ生成方法、プログラムに関するものである。
UNIX(登録商標)、LINUX(登録商標)などのカーネルにおいては、プロセスやスレッドがファイルやソケットなどのオブジェクトを操作するための機構としてファイルディスクリプタを採用している。ファイルディスクリプタは、プロセス毎のプロセス表で管理され、その実体はカーネルによって順番に割り当てられた単なる番号である。プロセス表には、そのファイルディスクリプタと対応付けて、カーネルファイル表のエントリへのインデックスが登録されている。カーネルファイル表の各インデックスに対応するエントリには、ファイル、ソケットなどのオブジェクトのデータ構造体へのインデックスがそれぞれ登録されている。
特許文献1には、ファイルディスクリプタを利用したクライアントとサーバとの間の通信処理が記載されている。サーバ側のプロセスは、socketシステムコールにより作成したソケットに、bindシステムコールを使用してファイルディスクリプタを割り当てた後、listenシステムコールを実行して接続準備状態を設定する。一方、クライアント側のプロセスは、socketシステムコールでソケットを作成し、connectシステムコールを使用してサーバ側ソケットとの通信路を確立する。サーバ側のプロセスは、acceptシステムコールを実行し、クライアント側のプロセスからの要求を受け入れる。接続完了後に、ソケット対応のファイルディスクリプタに対する書き込み処理としてのwriteシステムコールと、読み取り処理としてのreadシステムコールを利用して、メッセージ送受信を実現する。
特開2006−127461(段落0084)
クライアントの複数のプロセスやスレッドからサーバに対して頻繁にサービスを要求する場合、要求ごとに新たにソケットを生成せずに,仮想的な1つの双方向FIFO通信路(ストリーム指向ソケット,TCPソケットなど)を共有できるようにしたい場合がある.そのため従来はプロセス間でファイルディスクリプタの受け渡しを行っていた。しかしながら、プロセス間でファイルディスクリプタを受け渡すには、受け渡しのためのソケット通信路を確立して,sendmsgシステムコールやrecvmsgシステムコールを利用してファイルディスクリプタそのものを送受信するなど、煩雑な手順が必要であった。
また、クライアントの複数のプロセスやスレッドからサーバに対してサービスを要求し、サーバは各プロセスからの要求に対するサービスを順次実行するという運用においては、複数のプロセスから同時に要求が発生した場合に、一方のプロセスからの要求に対するサーバ側の処理が終了してから別のプロセスからの要求を処理するといった相互排除が必要である。そのため,従来は,サーバ側において,相互排除を行う必要があった。
本発明は、かかる実情に鑑み、プロセス間でファイルディスクリプタを受け渡すことなく、クライアント内の複数のプロセスやスレッドが1つのソケットを共有してサーバと通信を行うことのできる記録装置、ファイルディスクリプタ生成方法、プログラムを提供しようとするものである。
上記の課題を解決するために、本発明の記録装置は、記憶媒体へのアクセスをサービスとして実行するサーバと、前記サービスを必要とするプロセスを有するクライアントと、前記サーバと前記クライアントとの間でソケットを用いて通信を行うための仮想デバイスと、前記クライアント内のプロセスが前記仮想デバイスをオープンするとき、前記仮想デバイスが既にオープンされているかどうかを判定する判定手段と、前記仮想デバイスが既にオープンされている場合、既存のカーネルファイル表をもとに、前記ソケットを参照する前記プロセス用のファイルディスクリプタを再生成する再生成手段とを具備する。
本発明の記録装置において、前記生成手段は、前記プロセスのプロセス表において未使用の番号のファイルディスクリプタを探し出し、前記プロセス表に、前記ファイルディスクリプタと、前記カーネルファイル表にて前記仮想デバイスを既にオープンしているプロセスが参照する前記ソケットのデータ構造体へのインデックスが登録されたエントリへのインデックスとを結び付けて登録するものであってもよい。
本発明の記録装置は、前記プロセスが前記仮想デバイスをオープンするとき、カーネルのセマフォを操作して、他のプロセスからの前記仮想デバイスのオープンの許可制限を設定する手段をさらに具備するものであってよい。
仮想デバイスを既にオープンしているプロセスとは、仮想デバイスをオープンしようとしているプロセスと同じプロセスまたは別のプロセスである。
本発明の別の観点に基づくファイルディスクリプタ生成方法は、サービスを実行するサーバと、前記サービスを必要とするプロセスを有するクライアントとの間でソケットを用いて通信を行う仮想デバイスを、前記クライアント内のプロセスがオープンするとき、前記仮想デバイスが既にオープンされているかどうかを判定手段により判定し、前記仮想デバイスが既にオープンされている場合、既存のカーネルファイル表をもとに、前記ソケットを参照する前記プロセス用のファイルディスクリプタを再生成手段により再生成する。
本発明の別の観点に基づくプログラムは、記憶媒体へのアクセスをサービスとして実行するサーバと、前記サービスを必要とするプロセスを有するクライアントとの間でソケットを用いて通信を行うための仮想デバイスを、前記クライアント内のプロセスがオープンするとき、前記仮想デバイスが既にオープンされているかどうかを判定する判定手段と、前記仮想デバイスが既にオープンされている場合、既存のカーネルファイル表をもとに、前記ソケットを参照する前記プロセス用のファイルディスクリプタを再生成する再生成手段としてコンピュータを動作させる。
本発明によれば、プロセス間でファイルディスクリプタを受け渡すことなく、クライアントの複数のプロセスが1つのソケットを共有してサーバとの通信を行うことができる。
以下、本発明の実施形態を図面を参照して説明する。
図1は本発明を採用した実施形態である記録装置のハードウェアの構成を示す図である。
同図に示すように、CPU(Central Processing Unit)101には、システムバス102を介して、ROM(Read Only Memory)103と、RAM(Random Access Memory)104と、入力操作部105と、AVインタフェース106と、HDD(Hard Disk Drive)107と、ディスクドライブ108と、ネットワークインタフェース109が接続されている。
CPU101は、ROM103に格納されたプログラムやデータなどのソフトウェアに基づいて演算処理を実行する。ROM103には、記録装置100を動作させるために必要なOS(オペレーティングシステム)、このOS上で動作するアプリケーションなどのプログラムやデータなどのソフトウェアが格納されている。RAM104は、CPU101の作業領域や各種の情報の保持領域などとして用いられる。
入力操作部105は、各種のキーなどを備え、ユーザからの各種の指令の入力を処理する。入力操作部105より入力された指令はシステムバス102を通じてCPU101に供給される。
AVインタフェース106は、テレビジョンなどの外部AV機器4とのインタフェースをとるものである。
HDD107は、コンテンツや、このコンテンツのメタデータなどのユーザデータやその他のデータを保存する記憶媒体である。
ディスクドライブ108は、記憶媒体であるブルーレイディスク、DVD(Digital Versatile Disk)などのリムーバブルメディア2の装着が可能とされ、このリムーバブルメディア2に対するデータの書き込み、読み出しを行う。
ネットワークインタフェース109は、例えば家庭内のLAN(Local Area Network)などのネットワーク1との接続をとる。本記録装置100には、ネットワーク1を通じて、コンテンツ受信STB(Set top box)3、リモートユーザインタフェース5などの外部機器が接続可能とされている。
コンテンツ受信STB3は、例えば、地上アナログテレビジョン放送、地上デジタルテレビジョン放送、CSデジタル放送、BSデジタル放送などの放送波に乗って送信される放送コンテンツ、さらには、インターネットなどのネットワークを通じて配信されるネット配信コンテンツなどを受信し、記録装置100にネットワーク1を通じて送信することが可能な機器である。
リモートユーザインタフェース5は、本記録装置100をネットワーク1を介して遠隔で操作することのできる機器であり、例えば、携帯電話、PCなどである。
次に、図2を用いて記録装置100のソフトウェアの構成を説明する。
記録装置100のソフトウェアは、NFE(Network Front End)210、IOP(Input Output Processor)220、AVDEC(Audio Visual DECorder)230に大別される。
NFE210は、主にネットワークに関する機能を担う。IOP220は、HDD107およびディスクドライブ108に装着されたリムーバブルメディア2などの記憶媒体に対する書き込みおよび読み出しなどのアクセス、メタデータの管理などを行う。CPU101の処理負荷を適正に分散させるために、NFE210とIOP220はethernet(登録商標)などの高速リンクにより粗結合している。NFE210とIOP220にはそれぞれ、仮想デバイス212,212,213,222,223,224を導入するカーネルモード・ドライバモジュール211,221がローダブルモジュールとしてインストールされている。ローダブルモジュールとは、オペレーティングシステムの基本コンポーネントであるカーネルそのものには変更を加えずに機能を追加するためのモジュールである。
カーネルモード・ドライバモジュールによって提供される仮想デバイス212,212,213,222,223,224はソケットを用いてNFE210とIOP220との間で通信を行うためのデバイスである。ここでは3つの仮想デバイス、すなわち、NFE210をクライアントとし、IOP220をサーバとして通信を行う第1の仮想デバイス212,222と、並列通信を行う第2の仮想デバイス213,223と、NFE210をサーバとし、IOP220をクライアントとして通信を行う第3の仮想デバイス214,224とが導入されている。以下、NFE210がクライアントとなり、IOP220がサーバとなる第1の仮想デバイス212,222に絞って説明を進めることとする。
NFE210(クライアント)にはIOP220(サーバ)が提供するサービスを必要とする複数のプロセス(スレッドを含む)P1−Pnが存在し、IOP220(サーバ)にはNFE210(クライアント)の複数のプロセス(スレッドを含む)P1−Pnからの要求により順次的にサービスを処理するプロセスS1が存在する。したがって、クライアントとサーバとの間での通信はN:1となる。なお、IOP220(サーバ)には、プロセスS1以外のプロセスS2が存在してもよい。
NFE210(クライアント)とIOP220(サーバ)はそれぞれ、ソケットを用いた通信に先立ち、仮想デバイス212,222をオープンして通信路を確保する。通信に先立つタイミングとしては、例えば記録装置100の起動時などが挙げられる。通信に先立つタイミングであれば、起動時以後の任意のタイミングでもよい。
次に、NFE210(クライアント)とIOP220(サーバ)の仮想デバイス212,222をオープンする処理について説明する。
(クライアントの仮想デバイスのオープン処理)
図3はクライアントの仮想デバイスのオープン処理に関するフローチャートである。
NFE210は、IOP220(サーバ)のサービスを必要とするプロセス(仮に「プロセスP1」とする。)を生成し、起動する。プロセスP1はソケットを用いて通信を行うために仮想デバイス212のオープンを要求する。NFE210は、プロセスP1からの仮想デバイス212のオープンの要求が発生すると、システムコールによってカーネルの(down(&sem_0))関数を呼び出し、セマフォに対するdown操作を行うことで、セマフォの値を"0"にする(ステップS101)。これにより、後から仮想デバイス212をオープンしようとする別のプロセスは、セマフォの値が"0"であることによってスリーブ状態になる。
次に、NFE210は、仮想デバイス212に対応付けられたオープンカウント(open count)をインクリメントする(ステップS102)。オープンカウント(open count)とは、仮想デバイス毎にオープンインスタンス数を管理する変数であり、初期値は"0"である。オープンカウント(open count)は仮想デバイス212がリリースされる毎にデクリメントされる。オープンとリリースの対応関係はカーネルによって管理される。
次に、NFE210は、システムコールによりvmalloc()関数を実行して、プロセスP1の仮想アドレス空間内にメモリを確保する(ステップS103)。
次に、NFE210は、オープンカウントの値が"1"であるかどうかを判定する(ステップS104)。当該仮想デバイス212が最初にオープンされたときにはオープンカウントの値は"1"であり、オープンカウントの値が"2"以上であれば当該仮想デバイス212が既にいずれかのプロセスやスレッドによってオープンされていることを示す。ここで、いずれかのプロセスとは、仮想デバイス212をオープンしようとしているプロセスと同じプロセスまたは別のプロセスである。
ここではまず、仮想デバイス212が最初にオープンされた場合を想定し、オープンカウントの値が"1"である場合の動作から説明する。
NFE210は、システムコールによりsocket()関数を実行し、その返り値としてファイルディスクリプタ(psockfd)を得る(ステップS105)。これに伴い、NFE210は、カーネルファイル表にソケット構造体(sock)へのインデックスを登録する。さらに、NFE210は、当該プロセスP1のプロセス表に、当該ファイルディスクリプタ(psockfd)と、カーネルファイル表のソケット構造体(sock)へのインデックスが登録されたエントリへのインデックスとを結び付けて登録する。
続いて、NFE210は、システムコールにより、ファイルディスクリプタ(psockfd)を引き数としてconnect()関数を実行することによって、サーバ側の仮想デバイス222のポートとのコネクションを確立する(ステップS106)。
次に、NFE210は、システムコールによりファイルディスクリプタ(psockfd)を引き数としてsockfd lookup()関数を実行することによってソケット構造体(sock)を変数p_socketの値として得て、カーネル内の仮想メモリに保存する(ステップS107)。このソケット構造体(sock)の変数p_socketは、後で説明するsock_remap_fd()関数を実行する際の引き数として用いられる。
続いて、NFE210は、仮想デバイスのオープンインスタンスごとのプライベート変数であるfile->private_dataにファイルディスクリプタ(psockfd)を代入する。これにより以後、カーネルは、プロセスP1からのリード(read)、ライト(write)などの要求が発生したとき、file->private_dataとして格納されたファイルディスクリプタ(psockfd)を用いてソケット構造体の操作を行うことができる。
最後に、NFE210は、システムコールにより(up(&sem_0))関数を呼び出し、セマフォに対するup操作を行うことで、セマフォの値を"1"に戻す。これによりセマフォによるオープン処理の許可制限が解除される(ステップS109)。
ここで、ファイルディスクリプタ、プロセス表、カーネルファイル表、ソケット構造体の関係について説明を行う。
ファイルディスクリプタは、ソケット、デバイス、ファイルなどのオブジェクトがプロセスからオープンされることによって、そのオブジェクトに対してカーネルから所定の値から順番に割り当てられる番号である。プロセス表は、プロセス毎にオープンしたオブジェクトを参照するファイルディスクリプタを管理するための表である。プロセス表には、ファイルディスクリプタと、プロセスが参照するオブジェクトへのインデックスが登録されたカーネルファイル表のエントリへのインデックスとが結び付けて登録される。カーネルファイル表には、オープンしているオブジェクトの実体を管理するデータ構造体へのインデックスが登録される。
図7はプロセス、ファイルディスクリプタ、プロセス表、カーネルファイル表、ソケット構造体の関係の例を示す図である。この例では、プロセスP1にのプロセス表PT1にファイルディスクリプタとして1から3の番号が登録されている。それぞれのファイルディスクリプタには、プロセスP1が参照するソケット構造体などのオブジェクトへのインデックスが登録されたカーネルファイル表12のエントリへのインデックスが結び付けて登録されている。一方、プロセスP2のプロセス表PT2にはファイルディスクリプタとして1から4の番号が格納され、それぞれのファイルディスクリプタには、プロセスP2が参照するソケット構造体などのオブジェクトへのインデックスが登録されたカーネルファイル表12のエントリへのインデックスとが結び付けて登録される。ここで、プロセスP1のプロセス表PT1のファイルディスクリプタ(=1)とプロセスP2のプロセス表PT2のファイルディスクリプタ(=3)はそれぞれ、カーネルファイル表12の同じエントリと結び付けられ、共通のソケット構造体13を参照する。
次に、ステップS104の判定で、オープンカウントの値が"1"以外つまり"2"以上である場合の以後の動作を説明する。オープンカウントの値が"2"以上であるなら、既に仮想デバイス212が、いずれかのプロセスやスレッドによって既にオープンされていることを示している。したがって、そのプロセスのプロセス表には、既に、ファイルディスクリプタ(psockfd)とソケット構造体へのインデックスが登録されたカーネルファイル表のエントリへのインデックスとが結び付けて登録されている。
この場合、NFE210は、プロセスP1用のファイルディスクリプタ(psockfd)を既存のカーネルファイル表をもとに再生成するsock_remap_fd()関数をソケット構造体(sock)の変数p_socketの値を引き数として実行する。
図4はsock_remap_fd()関数のフローチャートである。
NFE210は、まず、変数p_socketの値であるソケット構造体(sock)がカーネル内に存在するかどうかの確認を行う(ステップS111)。該当するソケット構造体(sock)が何らの障害によりカーネル内に存在しない場合にはエラーとして終了する(ステップS112)。
該当するソケット構造体(sock)が存在することを確認した場合、次にNFE210は、そのソケット構造体(sock)へのインデックスを登録したカーネルファイル表のエントリ(sock->file)が存在するかどうかの確認を行う(ステップS113)。カーネルファイル表に該当するエントリ(sock->file)が何らかの障害等により存在しない場合には、システムコールによりソケット構造体(sock)を引き数としてsock_map_fd()関数を実行する。これにより、ソケット構造体(sock)を参照するファイルディスクリプタ(psockfd)が生成される。これに伴いNFE210は、カーネルファイル表にソケット構造体(sock)へのインデックスを登録する。さらに、NFE210は、プロセスP1のプロセス表に、当該ファイルディスクリプタ(psockfd)と、カーネルファイル表のソケット構造体(sock)へのインデックスが登録されたエントリへのインデックスとを結び付けて登録する。この後、ファイルディスクリプタ(psockfd)がsock_remap_fd()関数の返り値として出力される(ステップS117)。
図3に戻って、この後、NFE210は、仮想デバイスのオープンインスタンスごとのプライベート変数であるfile->private_dataにファイルディスクリプタ(psockfd)を代入する。これにより以後、カーネルは、プロセスP1からのリード(read)、ライト(write)などの要求が発生したとき、file->private_dataとして格納されたファイルディスクリプタ(psockfd)を用いてソケット構造体の操作を行うことができる。
最後に、NFE210は、システムコールにより(up(&sem_0))関数を呼び出し、セマフォに対するup操作を行うことで、セマフォの値を"1"に戻す。これによりセマフォによるオープン処理の許可制限が解除される(ステップS109)。
また、図4のステップS113の判定で、該当するカーネルファイル表のエントリ(sock->file)が存在することが判定された場合、NFE210は、プロセスP1のプロセス表から未使用の番号のファイルディスクリプタ(psockfd)を探し出す(ステップS115)。続いて、NFE210は、プロセスP1のプロセス表に、そのファイルディスクリプタ(psockfd)と、カーネルファイル表のソケット構造体(sock)へのインデックスが登録されたエントリへのインデックスとを結び付けて登録する(ステップS116)。この後、NFE210は、当該ファイルディスクリプタ(psockfd)をsock_remap_fd()関数の返り値として出力する(ステップS117)。
図3に戻って、この後、NFE210は、上記と同様に、仮想デバイスのオープンインスタンスごとのプライベート変数であるfile->private_dataにsock_remap_fd()関数の返り値として得られたファイルディスクリプタ(psockfd)を代入する。これにより以後、カーネルは、プロセスP1からのリード(read)、ライト(write)などの要求が発生したとき、file->private_dataとして格納されたファイルディスクリプタ(psockfd)を用いてソケット構造体の操作を行うことができる。
上記のsock_remap_fd()関数はサーバの仮想デバイスのオープン処理に採用してもよい。
(サーバの仮想デバイスのオープン処理)
図5はサーバの仮想デバイスのオープン処理にsock_remap_fd()関数を採用した場合のフローチャートである。
IOP220は、サービスを処理するためのプロセス(仮に「プロセスS1」とする。)を生成し、起動する。プロセスS1はソケットを用いて通信を行うために仮想デバイス222のオープンを要求する。IOP220は、プロセスS1からの仮想デバイス222のオープンの要求が発生すると、システムコールによりカーネルの(down(&sem_0))関数を呼び出し、セマフォに対するdown操作を行うことで、セマフォの値を"0"にする(ステップS210)。これにより、後から仮想デバイス222をオープンしようとする別のプロセスは、そのセマフォの値が"0"であることによってスリーブ状態になる。
次に、IOP220は、仮想デバイスに対応付けられたオープンカウント(open count)をインクリメントする(ステップS220)。このオープンカウント(open count)の初期値は"0"である。このオープンカウント(open count)は仮想デバイス222がリリースされる毎にデクリメントされる。オープンとリリースの対応関係はカーネルによって管理される。
次に、IOP220は、システムコールによりvmalloc()関数を実行して、プロセスS1の仮想アドレス空間内にメモリを確保する(ステップS203)。
次に、IOP220は、オープンカウントの値が"1"であるかどうかを判定する(ステップS204)。当該仮想デバイス222が最初にオープンされたときにはオープンカウントの値は"1"であり、オープンカウントの値が"2"以上であれば当該仮想デバイス222が既にいずれかのプロセスやスレッドによってオープンされていることを示す。ここで、いずれかのプロセスとは、仮想デバイス222をオープンしようとしているプロセスと同じプロセスまたは別のプロセスである。
ここではまず、仮想デバイス222が最初にオープンされた場合を想定し、オープンカウントの値が"1"である場合の動作から説明する。
IOP220は、システムコールによりsocket()関数を実行し、その返り値としてファイルディスクリプタ(listenfd)を得る(ステップS205)。
次に、IOP220は、システムコールによりsetsockopt()関数を実行して、ソケットのオプションを設定する(ステップS206)。ソケットのオプションには、サーバ側が一旦使用したListenポート用アドレスが完全に開放されなくてもすぐに再利用できるようにすることを指定するSO_REUSEADDR、バッファサイズの設定であるSO_RCVBUF SO_SNDBUFなどがある。
次に、IOP220は、システムコールによりbind()関数を実行して、「socket()関数により作成したソケット」と「自分のIPアドレスとポート番号」を対応づける。続いてIOP220は、システムコールによりlisten()関数を実行して、クライアントからソケットへの接続に待機することをカーネルを指示する(ステップS207)。
次に、IOP220は、システムコールによりaccept()関数を実行する(ステップS208)。これにより、IOP220は、クライアントからソケットへの接続要求を受けた時、当該プロセスS1のプロセス表に新たなファイルディスクリプタ(psockfd)を登録し、ファイルディスクリプタ(listenfd)と結び付けて登録されているカーネルファイル表へのインデックスを、上記の新たなファイルディスクリプタ(psockfd)と結び付けてプロセス表に登録する。
次に、IOP220は、システムコールによりファイルディスクリプタ(listenfd)を引き数としてshutdown()関数を実行することにより、ファイルディスクリプタ(listenfd)が割り当てられたソケットとクライアントとの接続を無効にする(ステップS209)。これにより、ファイルディスクリプタ(listenfd)をつかってクライアントの仮想デバイス212からの次の接続要求は拒否される。
次に、IOP220は、システムコールによりファイルディスクリプタ(psockfd)を引き数としてsockfd lookup()関数を実行して、ソケット構造体を変数p_socketの値として得て、カーネル内の仮想メモリに保存する(ステップS210)。
続いて、IOP220は、仮想デバイスのオープンインスタンスごとのプライベート変数であるfile->private_dataにファイルディスクリプタ(psockfd)を代入する(ステップS211)。これにより以後、カーネルは、プロセスS1からの次の要求が発生したとき、file->private_dataとして格納されたファイルディスクリプタ(psockfd)を用いてソケット構造体の操作を行うことができる。
最後に、IOP220は、システムコールによりカーネルの(up(&sem_0))関数を呼び出し、セマフォに対するup操作を行うことで、セマフォの値を"1"に戻す。これによりセマフォによるオープン処理の許可制限が解除される(ステップS212)。
次に、ステップS204の判定で、オープンカウントの値が"1"以外つまり"2"以上である場合の以後の動作を説明する。オープンカウントの値が"2"以上であるなら、既にサーバの仮想デバイス222が、いずれかのプロセスまたはスレッドによって既にオープンされていることを示している。先にオープンしたプロセスのプロセス表には、既に、ファイルディスクリプタ(psockfd)と、ソケット構造体へのインデックスが登録されたカーネルファイル表のエントリへのインデックスとが結び付けて登録されている。
この場合、IOP220は、プロセスS1用のファイルディスクリプタ(psockfd)を既存のカーネルファイル表をもとに再生成するsock_remap_fd()関数を変数p_socketの値を引き数として実行する(ステップS213)。sock_remap_fd()関数のフローは、前述のクライアントに対応する仮想デバイスのオープン処理時のそれと同じであるので、ここでの重複する説明は省く。
sock_remap_fd()関数の実行により、プロセスS1用のファイルディスクリプタ(psockfd)が得られた後、IOP220は、仮想デバイスのオープンインスタンスごとのプライベート変数であるfile->private_dataにそのファイルディスクリプタ(psockfd)を代入する(ステップS211)。これにより以後、カーネルは、プロセスS1からの次の要求が発生したとき、file->private_dataとして格納されたファイルディスクリプタ(psockfd)を用いてソケット操作を行うことができる。
最後に、IOP220は、 システムコールにより(up(&sem_0))関数を呼び出し、セマフォに対するup操作を行うことで、セマフォの値を"1"に戻す。これによりセマフォによるオープン処理の許可制限が解除される(ステップS212)。
(仮想デバイスのクローズ処理)
次に、クライアントの仮想デバイスのクローズ処理について説明するが、このクローズ処理はサーバの仮想デバイスをクローズする場合も同様である。
図6はこの仮想デバイスのクローズ処理に関するフローチャートである。
NFE210は、システムコールによりカーネルの(down(&sem_0))関数を呼び出し、セマフォに対するdown操作を行うことで、セマフォの値を"0"にする(ステップS301)。
次に、NFE210は、システムコール元がユーザであるかユーザ以外であるかを判定する(ステップS302)。システムコール元がユーザである場合、NFE210は、仮想メモリにプロセスP1のプライベートデータとして保存されているファイルディスクリプタ(psockfd)を取り出す(ステップS303)。
次に、NFE210は、オープンカウントの値が"1"であるかどうかを判定する(ステップS304)。オープンカウントの値が"1"の場合は、ファイルディスクリプタ(psockfd)が参照するソケットを利用しているプロセスの数(正確にはオープンインスタンス数)は1つであり、このソケットを用いた通信を無効にしても他のプロセスへの影響はない。したがって、この場合、NFE210は、システムコールによりファイルディスクリプタ(psockfd)を引き数としてshutdown()関数を実行することによって、そのファイルディスクリプタ(psockfd)が参照するソケットを利用した通信を無効にする(ステップS305)。
次に、NFE210は、システムコールによりソケット構造体(p_socket)を引き数としてsockfd_put()関数を実行することによって、ソケット構造体の参照数をデクリメントする(ステップS306)。
この後、NFE210は、システムコールによりファイルディスクリプタ(psockfd)を引き数としてclose()関数を実行することにより、ファイルディスクリプタ(psockfd)が参照するソケットを利用しているプロセスP1のプロセス表からそのファイルディスクリプタ(psockfd)のエントリを削除する(ステップS307)。
一方、オープンカウントの値が"2以上"の場合、ファイルディスクリプタ(psockfd)が参照するソケットを利用しているプロセスが2以上であるから、ソケットを用いた通信を無効にすることはできない。この場合、NFE210は、shutdown()関数の実行、sockfd_put()関数の実行をそれぞれスキップしてシステムコールによりclose()関数を実行する(ステップS307)。これにより、そのファイルディスクリプタ(psockfd)が参照するソケットを利用した通信を有効のまま、プロセスP1のプロセス表のエントリとして保存されているファイルディスクリプタ(psockfd)を削除する。
この後、NFE210は、システムコールによりオープンインスタンスごとのプライベートデータを引き数としてvfree関数を実行することによって、オープンインスタンスごとのプライベートデータを保存するために割り当てられた仮想メモリ内の空間を解放する(ステップS308)。続いて、NFE210は、オープンカウントの値をデクリメントする(ステップS309)。最後にNFE210は、 システムコールにより(up(&sem_0))関数を呼び出し、セマフォに対するup操作を行うことで、セマフォの値を"1"に戻す。これによりセマフォによる許可制限が解除される(ステップS310)。
また、ステップS302で、システムコール元がユーザ以外、例えば、遅延release処理,シグナル処理ルーチン,異常終了処理ルーチンなどのカーネルルーチンであることが判定された場合、NFE210は、オープンカウントの値が"1"であるかどうかを判定する(ステップS311)。オープンカウントの値が"1"ならば、NFE210は、システムコールによりp_socket->ops->shutdown()関数を実行することにより、当該プロセスP1のプロセス表のファイルディスクリプタ(psockfd)を使わずにソケットを利用した通信を無効にする(ステップS312)。この後、NFE210は、前述のステップS308以降を実行する。オープンカウントの値が"2"以上の場合には、ソケットを用いた通信を無効にできないのでステップSをスキップしてステップS308以降を実行する。
以上説明したように、本実施形態では、クライアントの仮想デバイスがいずれかのプロセスまたはスレッドによって既にオープンされているときに、任意のプロセスまたはスレッドからその仮想デバイスをオープンする場合に、sock_remap_fd()関数を実行し、そのプロセスのファイルディスクリプタを再生成することが行われる。これにより、プロセス間でファイルディスクリプタを受け渡すことなく、クライアントの複数のプロセスが1つの仮想デバイスおよび仮想デバイスが使用するソケットを共有してサーバとの通信を行うことができる。
一般的には、プロセス間でファイルディスクリプタを介して同じオブジェクトを指定できるようにするには、ファイルディスクリプタをプロセス間で受け渡していた。そのためには、ファイルディスクリプタの受け渡しのためのソケット通信路を確立してから、sendmsgシステムコールやrecvmsgシステムコールなどを利用してファイルディスクリプタの記述子そのものを送受信していた。これに対して本実施形態によれば、ファイルディスクリプタの受け渡しのためのソケット通信路を確立する必要がないため、リソースの利用効率が改善される。
また、本実施形態によれば、クライアントの複数のプロセスからサーバに対してサービスを要求し、サーバは各プロセスからの要求に対するサービスを順次実行するという運用において、複数のプロセスから同時に要求が発生した場合の相互排除を、オープン処理の最初にカーネルがもつ(down(&sem_0))関数を用いて実現している。このため、相互排除のための機能を新たに追加することなくクライアント側での相互排除を実現することができる。
さらに、本実施形態において採用されたカーネルモード・ドライバモジュール211,221は、カーネルそのものを変更せずに、カーネルの関数をシステムコールにより呼び出すことによって特定の機能をカーネルに追加するローダブルモジュールとしてインストールされたものである。このため、GPL(GNU Public License)によるカーネル保護の規約に違反しない。
以上はプロセスがファイルディスクリプタを指定してソケットに対する操作を行う場合について説明したが、ファイルディスクリプタを指定して、ファイルなど、ソケット以外のオブジェクトに対する操作を行う場合にも本発明は同様に適用できる。
その他、本発明は、上述の実施形態にのみ限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々更新を加え得ることは勿論である。
本発明の実施形態である記録装置のハードウェアの構成を示す図である。 図1の記録装置のソフトウェアの構成を示す図である。 クライアントの仮想デバイスのオープン処理に関するフローチャートである。 sock_remap_fd()関数のフローチャートである。 サーバの仮想デバイスのオープン処理に関するフローチャートである。 仮想デバイスのクローズ処理に関するフローチャートである。 プロセス、ファイルディスクリプタ、プロセス表、カーネルファイル表、ソケット構造体の関係の例を示す図である。
符号の説明
P1,S1…プロセス
PT1,PT2…プロセス表
1…ネットワーク
2…リムーバブルメディア
3…コンテンツ受信STB
4…外部AV機器
5…リモートユーザインタフェース
12…カーネルファイル表
13…ソケット構造体
100…記録装置
101…CPU
102…システムバス
103…ROM
104…RAM
105…入力操作部
106…AVインタフェース
107…HDD
108…ディスクドライブ
109…ネットワークインタフェース
210…NFE
220…IOP
211,221…カーネルモード・ドライバモジュール
212,222…第1の仮想デバイス
213.223…第2の仮想デバイス
214.224…第3の仮想デバイス
230…AVDEC

Claims (8)

  1. 記憶媒体へのアクセスをサービスとして実行するサーバと、
    前記サービスを必要とするプロセスを有するクライアントと、
    前記サーバと前記クライアントとの間でソケットを用いて通信を行うための仮想デバイスと、
    前記クライアント内のプロセスが前記仮想デバイスをオープンするとき、前記仮想デバイスが既にオープンされているかどうかを判定する判定手段と、
    前記仮想デバイスが既にオープンされている場合、既存のカーネルファイル表をもとに、前記ソケットを参照する前記プロセス用のファイルディスクリプタを再生成する再生成手段と
    を具備する記録装置。
  2. 請求項1に記載の記録装置であって、
    前記再生成手段は、前記プロセスのプロセス表において未使用の番号のファイルディスクリプタを探し出し、前記プロセス表に、前記ファイルディスクリプタと、前記カーネルファイル表にて前記仮想デバイスを既にオープンしているプロセスが参照する前記ソケットのデータ構造体へのインデックスが登録されたエントリへのインデックスとを結び付けて登録する記録装置。
  3. 請求項1または2に記載の記録装置であって、
    前記プロセスが前記仮想デバイスをオープンするとき、カーネルのセマフォを操作して、他のプロセスからの前記仮想デバイスのオープンの許可制限を設定する手段を
    さらに具備する記録装置。
  4. 請求項1または2に記載の記録装置であって、
    前記仮想デバイスを既にオープンしているプロセスが、前記仮想デバイスをオープンしようとしているプロセスと同じプロセスまたは別のプロセスである記録装置。
  5. サービスを実行するサーバと、前記サービスを必要とするプロセスを有するクライアントとの間でソケットを用いて通信を行う仮想デバイスを、前記クライアント内のプロセスがオープンするとき、前記仮想デバイスが既にオープンされているかどうかを判定手段により判定し、
    前記仮想デバイスが既にオープンされている場合、既存のカーネルファイル表をもとに、前記ソケットを参照する前記プロセス用のファイルディスクリプタを再生成手段により再生成する
    ファイルディスクリプタ生成方法。
  6. 請求項5に記載のファイルディスクリプタ生成方法であって、
    前記プロセス用のファイルディスクリプタを再生成するステップは、前記プロセスのプロセス表において未使用の番号のファイルディスクリプタを探し出し、前記プロセス表に、前記ファイルディスクリプタと、前記カーネルファイル表にて前記仮想デバイスを既にオープンしているプロセスが参照する前記ソケットのデータ構造体へのインデックスが登録されたエントリへのインデックスとを結び付けて登録する
    ファイルディスクリプタ生成方法。
  7. 請求項5または6に記載のファイルディスクリプタ生成方法であって、
    前記プロセスが仮想デバイスをオープンするとき、カーネルのセマフォを操作して、他のプロセスからの前記仮想デバイスのオープンの許可制限を設定する
    ファイルディスクリプタ生成方法。
  8. 記憶媒体へのアクセスをサービスとして実行するサーバと、前記サービスを必要とするプロセスを有するクライアントとの間でソケットを用いて通信を行うための仮想デバイスを、前記クライアント内のプロセスがオープンするとき、前記仮想デバイスが既にオープンされているかどうかを判定する判定手段と、
    前記仮想デバイスが既にオープンされている場合、既存のカーネルファイル表をもとに、前記ソケットを参照する前記プロセス用のファイルディスクリプタを再生成する再生成手段
    としてコンピュータを動作させるプログラム。
JP2008101722A 2008-04-09 2008-04-09 記録装置、ファイルディスクリプタ生成方法、プログラム Expired - Fee Related JP4518177B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2008101722A JP4518177B2 (ja) 2008-04-09 2008-04-09 記録装置、ファイルディスクリプタ生成方法、プログラム
US12/418,680 US8073885B2 (en) 2008-04-09 2009-04-06 Recording apparatus, file descriptor generation method, and program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008101722A JP4518177B2 (ja) 2008-04-09 2008-04-09 記録装置、ファイルディスクリプタ生成方法、プログラム

Publications (2)

Publication Number Publication Date
JP2009252107A true JP2009252107A (ja) 2009-10-29
JP4518177B2 JP4518177B2 (ja) 2010-08-04

Family

ID=41164811

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008101722A Expired - Fee Related JP4518177B2 (ja) 2008-04-09 2008-04-09 記録装置、ファイルディスクリプタ生成方法、プログラム

Country Status (2)

Country Link
US (1) US8073885B2 (ja)
JP (1) JP4518177B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101948227B1 (ko) * 2017-02-07 2019-02-15 주식회사 시큐아이 파일 디스크립터를 이용한 서비스 정보 제공방법

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4518177B2 (ja) * 2008-04-09 2010-08-04 ソニー株式会社 記録装置、ファイルディスクリプタ生成方法、プログラム
US9292373B2 (en) 2013-03-15 2016-03-22 International Business Machines Corporation Query rewrites for data-intensive applications in presence of run-time errors
CN106776063B (zh) * 2016-11-29 2020-12-01 北京元心科技有限公司 移动终端、容器电话通讯功能实现方法及跨容器通信方法
US11843610B2 (en) * 2020-01-09 2023-12-12 Cisco Technology, Inc. Providing multiple namespaces

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0887477A (ja) * 1994-09-14 1996-04-02 Nippon Telegr & Teleph Corp <Ntt> サービス要求依頼方法
JPH10320220A (ja) * 1997-03-28 1998-12-04 Internatl Business Mach Corp <Ibm> 記述子を転送する方法および装置
JP2000020328A (ja) * 1998-06-26 2000-01-21 Digital Vision Laboratories:Kk 通信方法、分散処理装置とその方法、ネットワークシステムおよびノード装置
JP2003519872A (ja) * 2000-01-13 2003-06-24 エクスィジェント インターナショナル インコーポレイテッド データ・マルチキャスト・チャネル
JP2006127461A (ja) * 2004-09-29 2006-05-18 Sony Corp 情報処理装置、通信処理方法、並びにコンピュータ・プログラム

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5335323A (en) * 1987-01-05 1994-08-02 Motorola, Inc. Computer human interface with multiapplication display
US20020178176A1 (en) * 1999-07-15 2002-11-28 Tomoki Sekiguchi File prefetch contorol method for computer system
US6766471B2 (en) * 2000-12-28 2004-07-20 International Business Machines Corporation User-level checkpoint and restart for groups of processes
US6961941B1 (en) * 2001-06-08 2005-11-01 Vmware, Inc. Computer configuration for resource management in systems including a virtual machine
US20070233880A1 (en) * 2005-10-20 2007-10-04 The Trustees Of Columbia University In The City Of New York Methods, media and systems for enabling a consistent web browsing session on different digital processing devices
US7523344B2 (en) * 2006-05-08 2009-04-21 Sun Microsystems, Inc. Method and apparatus for facilitating process migration
US7797576B2 (en) * 2007-04-27 2010-09-14 International Business Machines Corporation Checkpoint of applications using UNIX® domain sockets
US7685172B2 (en) * 2007-04-27 2010-03-23 International Business Machines Corporation In-flight file descriptors checkpoint
US7792983B2 (en) * 2007-07-31 2010-09-07 International Business Machines Corporation Method and apparatus for checkpoint and restart of pseudo terminals
JP4518177B2 (ja) * 2008-04-09 2010-08-04 ソニー株式会社 記録装置、ファイルディスクリプタ生成方法、プログラム

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0887477A (ja) * 1994-09-14 1996-04-02 Nippon Telegr & Teleph Corp <Ntt> サービス要求依頼方法
JPH10320220A (ja) * 1997-03-28 1998-12-04 Internatl Business Mach Corp <Ibm> 記述子を転送する方法および装置
JP2000020328A (ja) * 1998-06-26 2000-01-21 Digital Vision Laboratories:Kk 通信方法、分散処理装置とその方法、ネットワークシステムおよびノード装置
JP2003519872A (ja) * 2000-01-13 2003-06-24 エクスィジェント インターナショナル インコーポレイテッド データ・マルチキャスト・チャネル
JP2006127461A (ja) * 2004-09-29 2006-05-18 Sony Corp 情報処理装置、通信処理方法、並びにコンピュータ・プログラム

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101948227B1 (ko) * 2017-02-07 2019-02-15 주식회사 시큐아이 파일 디스크립터를 이용한 서비스 정보 제공방법

Also Published As

Publication number Publication date
US8073885B2 (en) 2011-12-06
JP4518177B2 (ja) 2010-08-04
US20090259634A1 (en) 2009-10-15

Similar Documents

Publication Publication Date Title
US10735329B2 (en) Container communication method and system for parallel applications
US11232160B2 (en) Extensible and elastic data management services engine external to a storage domain
JP3344345B2 (ja) 共有メモリ型ベクトル処理システムとその制御方法及びベクトル処理の制御プログラムを格納する記憶媒体
TWI430102B (zh) 網路卡資源配置方法、儲存媒體、及電腦
TWI486878B (zh) 用以經由處理程序間通訊共享資源之方法、裝置與電腦程式產品
US20110125949A1 (en) Routing packet from first virtual machine to second virtual machine of a computing device
US20150370582A1 (en) At least one user space resident interface between at least one user space resident virtual appliance and at least one virtual data plane
JP2004078979A (ja) プロセッサでのデータ処理方法及びデータ処理システム
JP2006127461A (ja) 情報処理装置、通信処理方法、並びにコンピュータ・プログラム
US11792272B2 (en) Establishment of socket connection in user space
JP4518177B2 (ja) 記録装置、ファイルディスクリプタ生成方法、プログラム
WO2009097776A1 (zh) 一种实现业务升级的系统、装置及方法
US11880725B2 (en) Establishment of queue between threads in user space
US9069592B2 (en) Generic transport layer mechanism for firmware communication
WO2000073902A1 (en) Single logical clipboard for multiple computers
WO2022271223A1 (en) Dynamic microservices allocation mechanism
CN109783245B (zh) 基于双系统共享内存的数据交互方法及系统
JP4183712B2 (ja) マルチプロセッサシステムにおいてプロセッサタスクを移動するデータ処理方法、システムおよび装置
US20170041402A1 (en) Method for transparently connecting augmented network socket operations
JP2005209206A (ja) マルチプロセッサシステムにおけるデータ転送方法、マルチプロセッサシステム、及び、この方法を実施するプロセッサ
US20070288568A1 (en) Message handling by a wrapper connected between a kernel and a core
Faraji et al. Design considerations for GPU‐aware collective communications in MPI
US11252457B2 (en) Multimedia streaming and routing apparatus and operation method of the same
US20100169271A1 (en) File sharing method, computer system, and job scheduler
US11818173B2 (en) Reducing memory footprint after TLS connection establishment

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100120

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100209

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100405

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: 20100427

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100510

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130528

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees