(57)【要約】【課題】  Ｌｉｎｕｘ・ＵＮＩＸ（登録商標）などのＯＳにより、プログラムの実行を行うコンピュータシステムおいて、プロセスを停止することなく、実行プログラムを更新させる。【解決手段】  実行対象プログラムに含まれる関数毎にその関数が格納されているメモリ上のアドレスを示すアドレス情報を保持するシンボルテーブル９と、呼び出し対象の関数にジャンプさせるためのインタフェース関数１２を呼び出して実行するインタフェース関数呼び出し手段と、シンボルテーブル９を参照して呼び出し対象の関数に対応するメモリ上のアドレスを検出し、その検出されたアドレスの関数を呼び出して実行する関数呼び出し手段と、修正対象の旧関数１３に対応する新関数１４をメモリ上にロードし、シンボルテーブル９の該当するアドレスを、新関数１４をロードしたアドレスに書き換えるテーブル更新手段とを備える。【選択図】  図１
2005284925.tif 000002
【特許請求の範囲】
【請求項１】
実行対象のプログラムに含まれるサブルーチン毎にそのサブルーチンが格納されているメモリ上の先頭アドレスを示すアドレス情報を保持するアドレス管理テーブルと、
呼び出し対象のサブルーチンにジャンプさせるためのインタフェースサブルーチンを呼び出して実行するインタフェースサブルーチン呼び出し手段と、
前記アドレス管理テーブルを参照して前記呼び出し対象のサブルーチンに対応するメモリ上の先頭アドレスを検出し、その検出された先頭アドレスのサブルーチンを呼び出して実行するサブルーチン呼び出し手段と、
更新対象のサブルーチンに対応する新たなサブルーチンをメモリ上にロードし、前記アドレス管理テーブルの該当するエントリアドレスを、前記新たなサブルーチンをロードした先頭アドレスに書き換えるテーブル更新手段と
を備えることを特徴とするコンピュータシステム。
【請求項２】
請求項１に記載のコンピュータシステムにおいて、
サブルーチンのライブラリからサブルーチンのシンボル名を取得し、該サブルーチンのメモリアドレスのオフセット値を設定し、前記ライブラリにある全てのサブルーチンを読み込むまで、前記インタフェースサブルーチンを作成する手段
を備えることを特徴とするコンピュータシステム。
【請求項３】
実行対象のプログラムに含まれる各サブルーチン毎にそのサブルーチンが格納されているメモリ上の先頭アドレスを示すアドレス情報をメモリ上に登録し、
前記実行対象のプログラムのサブルーチン呼び出し命令に応答して、呼び出し対象のサブルーチンにジャンプさせるためのインタフェースサブルーチンを呼び出して実行し、
前記アドレス情報を参照して前記呼び出し対象のサブルーチンに対応するメモリ上の先頭アドレスを検出し、
その検出された先頭アドレスのサブルーチンを呼び出して実行し、
更新対象のサブルーチンに対応する新たなサブルーチンをメモリ上にロードし、
前記アドレス情報の該当するエントリアドレスを、前記新たなサブルーチンをロードした先頭アドレスに書き換えること
を特徴とするプログラム更新方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｌｉｎｕｘ・ＵＮＩＸ（登録商標）などのマルチプロセス・マルチＣＰＵ（Central Processing Unit）のＯＳ（オペレーティングシステム）により、プログラムの実行を行うコンピュータシステムおいて、プロセスを停止することなく、実行プログラムを更新するプログラム更新方法に関するものである。
【背景技術】
【０００２】
一般に、Ｌｉｎｕｘ・ＵＮＩＸ（登録商標）をＯＳとするコンピュータシステムは、実行中のプログラムを更新するときに、以下の手順を取る。
１）新しいプログラムをハードディスクにインストールする。
２）実行中の古いプログラムを停止する。
３）新しいプログラムを起動する。
【０００３】
また、従来のプログラム更新方式として、特許文献「特開平７−３１９６８３号公報」に記載されるような方式がある。さらに特許文献「特開平７−１５２５５１号公報」に記載されるような方式がある。
従来のプログラム更新方式について図６〜図８を用いて説明する。図６は、従来技術によるコンピュータシステムの第１のプロセス内の構成を示す図である。図７は、従来技術によるコンピュータシステムの第２のプロセス内の構成を示す図である。図８は、従来技術によるコンピュータシステムの第３のプロセス内の構成を示す図である。図６〜図８に示されるプロセス内の構成は、スレッド１５Ａ、旧関数１３、新関数１４、関数追加スレッド１５Ｂである。
【０００４】
図６に示されるように、スレッド１５Ａにより呼び出される旧関数１３のアドレスｎｎｎ１にある旧関数を、関数追加スレッド１５Ｂにより呼び出される新関数１４のアドレスｍｍｍ１にある新関数に置き換えるとする。特開平７−３１９６８３号公報に記載されるような方式では、図７に示されるステップＳ１のように旧関数１３の上部の命令を、新関数１４へジャンプするように書き換えることで、関数の置換えを実現している。よって、これ以後、プロセス内の全スレッドは、旧関数１３のアドレスｎｎｎ２を読み込むと、新関数１４の先頭アドレスへジャンプし、新関数１４を呼び出すことになる。
【０００５】
ここで、従来方式では、旧関数１３の命令書き換え時に、レジスタに新関数１４のアドレスを蓄積する命令（図７の旧関数１３のアドレスｎｎｎ１に相当）、及びレジスタに登録されたアドレスへジャンプする命令（図７の旧関数１３のアドレスｎｎｎ２に相当）の２つの命令を書き換えなければならない。一般に、ＣＰＵが一度に処理できる命令は、３２ビットまたは６４ビットまでであるが、２つの命令を書き換えるには、６４ビット以上の命令が必要であり、同時に２つの命令を書き換えることはできない。そこで、マルチプロセッサ環境でプログラム更新を実施する場合、他プロセスが更新途中の関数を呼び出さないように、ロックする必要があり、図７に示されるステップＳ２のように更新途中の関数を呼び出そうとしてもロックされているため、サービス提供中のプロセスを停止させてしまう可能性がある。ＵＮＩＸ（登録商標）やＬｉｎｕｘをＯＳとするコンピュータシステムでは、コンテキストスイッチ（ＣＰＵが処理中のスレッドの処理をやめ、別のスレッドの処理を開始すること）の間隔は１０ｍｓｅｃであり、ロックさせられたプロセスは、１０ｍｓｅｃ以上待機させられることとなる。
【０００６】
また、他のプロセスが更新途中の関数を呼び出さないためのロックをしない場合、図８に示されるステップＳ３ように、スレッド１５Ａが更新途中の関数を読み込んでしまうことがある。するとアドレスｎｎｎ１とアドレスｎｎｎ２の内容が一致しないため、サービス提供中のプロセスがエラーとなる可能性がある。
【特許文献１】特開平７−３１９６８３号公報
【特許文献２】特開平７−１５２５５１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
上述のように、特開平７−３１９６８３号公報に記載されるような方式を用いた場合、プログラム関数更新時、関数更新を実施するプロセスが、他のプロセスが更新途中の関数を呼び出さないように更新対象関数をロックする必要があるため、サービス提供中のプロセスが更新対象関数へアクセスすると、更新完了まで停止させられてしまうという課題があった。
また、更新対象関数をロックせずに関数更新を実施すると、サービス提供中のプロセスがエラーとなるという課題があった。  
【０００８】
そこで、本発明では、インタフェース関数と関数シンボルのテーブルを用意し、関数更新時は、１つの命令のみを書き換えることで、サービス提供中のプロセスを停止せずに関数更新を実現する。
【課題を解決するための手段】
【０００９】
かかる課題を解決するため、本発明によるコンピュータシステムは、実行対象のプログラムに含まれるサブルーチン毎にそのサブルーチンが格納されているメモリ上の先頭アドレスを示すアドレス情報を保持するアドレス管理テーブルと、呼び出し対象のサブルーチンにジャンプさせるためのインタフェースサブルーチンを呼び出して実行するインタフェースサブルーチン呼び出し手段と、アドレス管理テーブルを参照して呼び出し対象のサブルーチンに対応するメモリ上の先頭アドレスを検出し、その検出された先頭アドレスのサブルーチンを呼び出しで実行するサブルーチン呼び出し手段と、更新対象のサブルーチンに対応する新たなサブルーチンをメモリ上にロードし、アドレス管理テーブルの該当するエントリアドレスを、新たなサブルーチンをロードした先頭アドレスに書き換えるテーブル更新手段とを備えることを特徴とする。
【００１０】
また本発明によるプログラム更新方法は、実行対象のプログラムに含まれる各サブルーチン毎にそのサブルーチンが格納されているメモリ上の先頭アドレスを示すアドレス情報をメモリ上に登録し、実行対象のプログラムのサブルーチン呼び出し命令に応答して、呼び出し対象のサブルーチンにジャンプさせるためのインタフェースサブルーチンを呼び出して実行し、アドレス情報を参照して呼び出し対象のサブルーチンに対応するメモリ上の先頭アドレスを検出し、その検出された先頭アドレスのサブルーチンを呼び出して実行し、更新対象のサブルーチンに対応する新たなサブルーチンをメモリ上にロードし、アドレス情報の該当するエントリアドレスを、新たなサブルーチンをロードした先頭アドレスに書き換えることを特徴とする。
【発明の効果】
【００１１】
発明の効果として、本発明のコンピュータシステムおよびプログラム更新方法によれば、サービス提供スレッドやプロセスを停止することなく、実行プログラムを更新することができ、プログラムの問題対処や機能変更・機能追加が可能となる。
【発明を実施するための最良の形態】
【００１２】
本発明によるＬｉｎｕｘ・ＵＮＩＸ（登録商標）をＯＳとするコンピュータシステムおよびプログラム更新方法は、インタフェース関数とシンボルテーブル（関数シンボルのテーブル）を備え、以下に記載される実施例１および実施例２を用いて説明される。  
【実施例１】
【００１３】
以下、本発明によるコンピュータシステムおよびプログラム更新方法の実施例１は、図１〜図３を用いて説明される。図１は本発明によるコンピュータシステムの構成を示す図である。図２は本発明によるコンピュータシステムのプロセス内の構成を示す図である。図３は本発明によるコンピュータシステムのプロセス動作を示すフローチャート図である。
【００１４】
まず、本発明によるコンピュータシステムの構成が、図１を用いて説明される。コンピュータシステムは、オンラインシステムを構築する複数のコンピュータシステムの１つであり、ネットワーク１を介して他のシステムと接続されている。
図１において、コンピュータシステムはＣＰＵ２、メインメモリ３、通信制御ユニット４、外部記憶装置としてハードディスク５が設けられており、これらはシステムバス６を介して相互接続されている。
【００１５】
ＣＰＵ２は、このコンピュータシステム全体を制御するためのものであり、メインメモリ３のＯＳ７や各種アプリケーションプログラムを実行する。メインメモリ３はＯＳ７、実行対象のアプリケーションプログラム８、シンボルテーブル９を格納する。
【００１６】
ＯＳ７は、システム管理のための各種プログラムから構成されており、ここには本発明のプログラム実行を実現するために必要なインタフェース関数管理プログラム１０と関数更新管理プログラム１１が組み込まれている。
【００１７】
インタフェース関数管理プログラム１０は、スレッドにより呼び出し対象の関数が呼び出されるときにインタフェース関数１２を呼び出し、メインメモリ３に格納されたシンボルテーブル９を読み込み、該当するエントリアドレスを取得し、そのアドレスにジャンプさせる。一般に関数はサブルーチンとも呼ばれる。関数更新管理プログラム１１は、新たな関数をハードディスク５またはネットワーク１からメインメモリ３の空き領域にロードして、シンボルテーブル９の該当するエントリアドレスを更新前の関数の先頭アドレスから新たな関数の先頭アドレスに変更する。
【００１８】
アプリケーションプログラム８においては、インタフェース関数１２は、呼び出し対象の関数を呼び出すものであるが、その呼び出し先の関数のエントリアドレスは、インタフェース関数１２には組み込まれておらず、そのエントリアドレスはシンボルテーブル９を参照することによって求められ、呼び出し対象の関数、例えば、旧関数１３や新関数１４へジャンプさせる。
【００１９】
シンボルテーブル９は、アプリケーションプログラム８に含まれる関数毎に、メインメモリ３のエントリアドレスを格納する。そのエントリアドレスはインタフェース関数１２が呼び出された時、どの関数へジャンプするかを知らせるための各呼び出し対象関数の先頭アドレスである。
【００２０】
通信制御ユニット４は、ネットワーク１を介して他のシステムとの通信を実行するためのものであり、例えば、新関数１４をネットワーク１からダウンロードするために用いられる。ハードディスク５は、コンピュータシステムの二次記憶装置として利用されるものであり、各種プログラムやファイルが格納されている。
【００２１】
次に、本発明によるコンピュータシステムのプロセス内の構成が、図２を用いて説明される。
図２において、本発明によるコンピュータシステムのプロセス内の構成は、シンボルテーブル９、１つ以上のインタフェース関数１２、旧関数１３や新関数１４などの関数、インタフェース関数管理プログラム１０が持つ通常のサービスを提供する１つ以上のスレッド１５、関数更新管理プログラム１１がもつ関数更新管理スレッド１６である。
【００２２】
インタフェース関数１２は、スレッド１５が呼び出し対象の関数を呼び出すときに、常に呼び出される関数である。各スレッド１５は、直接的に関数を呼び出すことはなく、最初にインタフェース関数１２を呼び出し、インタフェース関数１２の中の処理で、実際の呼び出し対象の関数へジャンプする。
【００２３】
シンボルテーブル９は、インタフェース関数１２が呼び出されたとき、どの関数へジャンプするかを知らせるための各関数の先頭アドレスが格納されている。例えば、図２に示されるように、更新前の関数である旧関数ｆｏｏ１３のエントリをシンボルテーブル９の１番目とする場合、シンボルテーブル９の１番目のエントリには関数ｆｏｏの先頭アドレスｘｘｘ１が入力される。
【００２４】
関数更新管理スレッド１６は、関数更新時に更新処理を実行するスレッドである。また各スレッド１５は、それぞれ非同期で処理を実行する。
【００２５】
よって、スレッドが呼び出し対象の関数を呼び出す際の動作概要は以下のようになる。
サービスを提供するスレッド１５は、まずインタフェース関数１２を呼び出し、インタフェース関数１２の中の処理で、実際の呼び出し対象の関数にジャンプする。インタフェース関数１２は、スレッド１５に呼び出されると、シンボルテーブル９を読み込み、該当するエントリアドレスを取得し、そのエントリアドレスへジャンプする。このとき、インタフェース関数１２が読み込む先のシンボルテーブル９のエントリは固定である。例えば、旧関数ｆｏｏ１３のインタフェース関数１２はシンボルテーブル９の１番目のエントリを常に読み込む。
【００２６】
また、旧関数ｆｏｏ１３から新関数ｆｏｏ１４への関数更新時の動作概要は、以下のようになる。
旧関数ｆｏｏ１３から新関数ｆｏｏ１４への関数更新時には、関数更新管理スレッド１６が新関数ｆｏｏ１４をメモリ上へロードする。次に、関数更新管理スレッド１６は、シンボルテーブルの１番目のエントリを、新関数ｆｏｏ１４の先頭アドレスｍｍｍ１へ変更する。以後、サービスを提供するスレッドは、関数ｆｏｏのインタフェース関数１２を呼び出すと、新関数ｆｏｏ１４へジャンプするようになる。
【００２７】
なお、一般にメモリ上の内容を書き換える場合、ＯＳ７やハードウェア側にて排他制御が提供されており、複数のスレッド１５が同時に同一のメモリへアクセスすることはない。例えば、図示はされていないが、サービスを提供するスレッド１５がインタフェース関数１２を介してシンボルテーブル９へアクセスする処理と、関数更新管理スレッドがシンボルテーブル９書き換える処理が同時に発生した場合、必ず片方が待機させられる。
【００２８】
以下、図３を用いて、本発明によるコンピュータシステムのプロセスの動作が説明される。
図３において、ステップＳ１０１〜Ｓ１０５はプロセスの起動処理である。ステップＳ１０１はプロセスの起動である。ステップＳ１０２は、各関数・インタフェース関数１２をメモリへロードする処理である。ステップＳ１０３は、ステップＳ１０２でロードした関数のアドレスをシンボルテーブル９に書き込む処理である。ステップＳ１０４は、関数更新管理スレッド１６を起動させる。ステップＳ１０５は、サービスを提供する各種スレッド１５を起動させる。
【００２９】
ステップＳ１０６は、プロセスの終了判定を行う。ステップＳ１０６でプロセスを終了すると判定された時、ステップＳ１１０以降の終了処理へ移る。ステップＳ１０６でプロセスを終了しないと判定された時、ステップＳ１０７へ移る。
【００３０】
ステップＳ１０７〜Ｓ１０９は、関数更新に関する処理である。ステップＳ１０７では、更新する関数があるかを判定する。ステップＳ１０７で更新する関数があると判定された時、ステップＳ１０８の関数更新処理へ移る。ステップ１０７で更新する関数がないと判定された時はステップＳ１０３へ戻る。ステップＳ１０８は、新関数をメモリへロードする処理である。ステップＳ１０９は、ステップＳ１０８でロードした関数の先頭アドレスを、シンボルテーブル９の所定のエントリへ入力する。
【００３１】
ステップＳ１１０以降は、プロセスの終了処理である。ステップＳ１１０はサービスを提供する各種スレッド１５を終了させる。ステップＳ１１１は、関数更新管理スレッド１６を終了させる。ステップＳ１１２はプロセス自身の終了である。
【００３２】
以上のように、本発明によるコンピュータシステムおよびプログラム更新方法を用いることにより、サービス提供スレッド１５やプロセスを停止することなく、実行プログラムを更新することができ、プログラムの問題対処や機能変更・機能追加が可能となる。
【実施例２】
【００３３】
以下、本発明によるコンピュータシステムおよびプログラム更新方法の実施例２は、図４および図５を用いて説明される。実施例１で説明されたコンピュータシステムおよびプログラム更新方法では、通常の関数に加え、図４に示すインタフェース関数１２を予め用意する必要があった。実施例２では、実施例１で説明されたコンピュータシステムおよびプログラム更新方法において、インタフェース関数１２を自動的に生成する機能および方法について説明される。図４は本発明によるコンピュータシステムのインタフェース関数とシンボルテーブルを示す図である。図５は本発明によるコンピュータシステムのインタフェース関数の自動生成動作を示すフローチャート図である。
【００３４】
まず、本発明によるコンピュータシステムのインタフェース関数とシンボルテーブルが、図４を用いて説明される。
図４に示されるインタフェース関数１２（アセンブラコード）は、インタフェース関数１２をアセンブラで表現したプログラムである。なお、このアセンブラは、米国インテル社製のｐｅｎｔｉｕｍ（登録商標）シリーズに用いられる、ｉ３８６系アーキテクチャのアセンブラコードである。図４に示すように、インタフェース関数１２は、シンボルテーブルのアドレスを解決するコードにより、シンボルテーブル９へのアドレスを解決し、シンボルテーブルのアドレス取得コードおよびシンボルテーブルの先頭からのオフセットで関数の先頭アドレス取得コードにより、シンボルテーブル９の所定のエントリへアクセスし、エントリから読み出したアドレスへジャンプする、といった処理となっている。
【００３５】
インタフェース関数１２は、図４の関数情報１７を除き、全て共通のコードとすることができる。また、関数情報１７は、関数のシンボル名、及びシンボルテーブル９の先頭アドレスから、所定の関数のエントリのアドレスまでのオフセット値である。例えば、本実施例では、関数のシンボル名がｆｏｏであり、シンボルテーブル９の先頭アドレスから、関数ｆｏｏのエントリのアドレスまでのオフセット値を「４」として説明する。
そこで、関数情報１７を自動的に取得することで、インタフェース関数１２を自動生成し、インタフェース関数を作成するための作業量を低減させる。
実施例２のプログラム運用中の動作、プログラム更新方法は、実施例１と同様である。ここでは、実施例１との差分である、インタフェース関数１２の自動生成方法について説明する。
【００３６】
以下、図５を用いて、本発明によるコンピュータシステムのインタフェース関数１２の自動生成の動作が説明される。
図５において、ステップＳ２０１はインタフェース関数１２の作成が開始されることを示す。ステップＳ２０２では、関数のライブラリから、関数シンボル名を取得する。ある特定の機能を持ったプログラムを、他のプログラムから利用できるように部品化し、複数のプログラム部品を一つのファイルにまとめたものである。ライブラリ自体は単独で実行することはできず、他のプログラムの一部として動作する。関数シンボル名は、例えばＬｉｎｕｘなどでは、ｎｍコマンドをスクリプトに組み込むことで取得できる。
【００３７】
次にステップＳ２０３でインタフェース関数１２のコードを出力するためのファイルをオープンする。ステップＳ２０４では、オフセット値Nを設定する。オフセット値とは、この関数のアドレスを入力したシンボルテーブル９のエントリが、シンボルテーブル９の最初のアドレスから何バイト目であるかを示す。なお、１エントリは４バイトである。例えば、図３のステップＳ１０３において、シンボルテーブル９の３番目のエントリにこの関数のアドレスが書き込まれる場合、オフセットは最初のエントリから２エントリ分ずれているので、２エントリ×４バイト=８となる。
【００３８】
図５のステップＳ２０５〜Ｓ２０７は、図４のアセンブラコードを生成する処理である。ステップＳ２０５は、読み込んでいない関数が存在するかどうかを判定する。読み込んでいない関数が存在しない場合、ステップＳ２０８以降の終了処理へ移る。読み込んでいない関数が存在する場合、ステップＳ２０６へ移る。ステップＳ２０６は、ライブラリから関数シンボルを読み込み、アセンブラコードを生成する。ステップＳ２０７は、オフセット値を加算する処理である。
【００３９】
ステップＳ２０８、Ｓ２０９はインタフェース関数生成を終了する処理である。ステップＳ２０８では、アセンブラコードを出力したファイルをクローズする。ステップＳ２０９は本処理を終えたことを示している。
【００４０】
実施例１で説明されたコンピュータシステムおよびプログラム更新方法の効果に加え、図５のような処理フローのプログラムを用意することで、以後、インタフェース関数１２を容易に生成することが可能となる。
【図面の簡単な説明】
【００４１】
【図１】本発明によるコンピュータシステムの構成を示す図
【図２】本発明によるコンピュータシステムのプロセス内の構成を示す図
【図３】本発明によるコンピュータシステムのプロセス動作を示すフローチャート図
【図４】本発明によるコンピュータシステムのインタフェース関数とシンボルテーブルを示す図
【図５】本発明によるコンピュータシステムのインタフェース関数の自動生成動作を示すフローチャート図
【図６】従来技術によるコンピュータシステムの第１のプロセス内の構成を示す図
【図７】従来技術によるコンピュータシステムの第２のプロセス内の構成を示す図
【図８】従来技術によるコンピュータシステムの第３のプロセス内の構成を示す図
【符号の説明】
【００４２】
２…ＣＰＵ、３メインメモリ、４…通信制御ユニット、５…ハードディスク、７…ＯＳ、８…アプリケーションプログラム、９…シンボルテーブル、１０…関数ロード管理プログラム、１１…関数更新管理プログラム、１２…インタフェース関数、１３…旧関数、１４…新関数、１５…スレッド、１６…更新管理スレッド
【図１】
2005284925.tif 000003
【図２】
2005284925.tif 000004
【図３】
2005284925.tif 000005
【図４】
2005284925.tif 000006
【図５】
2005284925.tif 000007
【図６】
2005284925.tif 000008
【図７】
2005284925.tif 000009
【図８】
2005284925.tif 000010