(57)【要約】  計算機システムは、実行プログラムを主記憶上に読込んで実行するプログラム実行手段（プログラム実行部１１）を有し、実行プログラムを作成する際に、共有ライブラリのうちの、実行プログラムのオブジェクトファイルが必要とするデータ領域及びＧＯＴ領域とを実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて実行プログラムに出力し、実行プログラムを実行する際に、実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを主記憶上に読込み、さらに共有ライブラリのテキスト領域のみを主記憶上に読込んで動的リンクする。
2011048731.tif 000002
【特許請求の範囲】
【請求項１】
主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも含み、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行手段を有し、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力し、
前記実行プログラムを実行する際に、前記プログラム実行手段にて、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込み、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクすることを特徴とする計算機システム。
【請求項２】
前記共有ライブラリは、１以上のプロセスから前記主記憶上で共有されることを特徴とする請求項１に記載の計算機システム。
【請求項３】
前記ＧＯＴ領域を前記共有ライブラリのテキスト領域が参照する場合に、前記共有ライブラリ毎に対応するＧＯＴ領域のアドレスを、前記共有ライブラリ毎に予め決められたアドレスに記録しておいて参照することを特徴とする請求項２に記載の計算機システム。
【請求項４】
主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも含み、
プログラム実行手段が、前記実行プログラムを前記主記憶上に読込んで実行する処理を実行し、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力し、
前記実行プログラムを実行する際に、前記プログラム実行手段にて実行される処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込み、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクすることを特徴とするリンク方法。
【請求項５】
前記共有ライブラリが、１以上のプロセスから前記主記憶上で共有されることを特徴とする請求項４に記載のリンク方法。
【請求項６】
前記ＧＯＴ領域を前記共有ライブラリのテキスト領域が参照する場合に、前記共有ライブラリ毎に対応するＧＯＴ領域のアドレスを、前記共有ライブラリ毎に予め決められたアドレスに記録しておいて参照することを特徴とする請求項５に記載のリンク方法。
【請求項７】
主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも保持させる処理と、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行処理と、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力させる処理と、
前記実行プログラムを実行する際に、前記プログラム実行処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込ませ、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクさせる処理と、をコンピュータに実行させるためのプログラムが格納された非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は計算機システム及びそれに用いるリンク方法並びにそのプログラムが格納された非一時的なコンピュータ可読媒体に関し、特にプログラムの実行時にメモリを節約するためのリンク方法に関する。
【背景技術】
【０００２】
コンピュータシステム上で実行されるプログラムの作成方法としては、ライブラリを利用する方法がある。このプログラムの作成方法においては、複数のプログラムから頻繁に利用される関数（ルーチン）をライブラリという形でまとめておき、プログラムをコンパイルしてできたオブジェクトファイルと結合（リンク）してプログラムの実行ファイルを作成する。【０００３】
また、上記のプログラムの作成方法においては、プログラムでの変数参照や関数呼び出しのために変数または関数のアドレスが必要となるが、このアドレスの決定（シンボル解決）もリンク時に行われる。リンクの仕方には、静的リンク（スタティックリンク）及び動的リンク（ダイナミックリンク）の２種類がある。【０００４】
静的リンクは、実行ファイルを作成する時に、ライブラリの中から必要なオブジェクトファイルを引き出してプログラムとリンクする仕組みである。したがって、プログラムが必要としない関数や変数はリンクされない。実行プログラムの実行時は、作成された実行ファイルを主記憶上に読込んで実行するため、実行時にはライブラリを必要としない。尚、静的リンクにおいて、ライブラリはオブジェクトファイルの集合である。【０００５】
一方、動的リンクは、プログラムの実行時（起動時）にライブラリのファイルを主記憶上に読込んでリンク処理を行い、関数を呼び出す。したがって、プログラム実行の際にもライブラリは必要となる。プログラムのコンパイル時には、作成したプログラム内で定義している関数や変数のシンボル解決は行うが、ライブラリの関数や変数のシンボル解決は行わない。ライブラリの関数や変数のシンボル解決は実行プログラムの起動時もしくは実行中に行われる。【０００６】
また、後述するように、動的リンクの場合は、実行時のライブラリの主記憶上の共有が可能となるので、動的リンク用ライブラリは特に共有ライブラリと呼ばれる。さらに、ライブラリのＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）等が変更されない限りは、共有ライブラリのファイルを置き換えることで、プログラムから呼び出す関数の置換え（バージョンアップ等）を実現することができる。【０００７】
一般に、実行プログラムや共有ライブラリは、テキスト領域とデータ領域とに分けられる。また、その他に、読込み専用データ領域や、共有ライブラリの実行のために使用するシンボル領域等があることもある。【０００８】
テキスト領域は、プログラムの実行命令列がある領域であり、主記憶へ読込まれた後に書換えられることはない。データ領域は、変数等のデータを保持する領域であり、主記憶へ読込まれた後には読み書きが行われる。【０００９】
本発明に関連する静的リンクは、下記の非特許文献１の１１０頁（図４．８）に示されている。静的リンクでは、リンカが、作成したプログラム及びライブラリの各々のオブジェクトファイル内のテキスト領域を集めて実行プログラムのテキスト領域を作成し、同様にオブジェクトファイル内のデータ領域を集めて実行プログラムのデータ領域を作成する。このため、プログラムの実行時には、実行ファイルの１つのテキスト領域と１つのデータ領域とが主記憶上に読込まれて実行されることになる。【００１０】
動的リンクの場合は、実行プログラムの他に、必要な共有ライブラリの全てを主記憶上に読込む必要がある。このとき、実行プログラムにも、共有ライブラリにもそれぞれ１つのテキスト領域と１つのデータ領域とが存在する。【００１１】
主記憶には、リード（読込み）、ライト（書出し）、エグゼキュート（実行）等の保護属性がそれぞれ独立して設定可能であるので、プログラムや共有ライブラリをメモリに読込む時に保護属性を適切に設定すると、例えばプログラムにバグがあった場合に適切な対処が可能となる。【００１２】
したがって、データ領域が主記憶に読込まれる時には、読込み可能かつ書込み可能な保護属性が設定される。テキスト領域が主記憶に読込まれる時は、読込み可能かつ実行可能な保護属性が設定される。このとき、テキスト領域は書込み不可なので、あるプログラムが実行されている最中に同じ共有ライブラリのテキスト領域を別のプログラムと主記憶上で共有することができる。一方、データ領域は、プログラム毎に異なる値に書換えられるので、主記憶上で共有することはできない。【００１３】
テキスト領域の共有は、つまり、多重仮想記憶方式における共有である。多重仮想記憶方式とは、計算機システム全体で１つの仮想記憶域が存在し、その仮想記憶域を区画に分けて使用する方式の単一仮想記憶方式と違い、プログラム毎に独立の仮想記憶を割り当てる方式のことである。多重仮想記憶方式では、主記憶アクセスの際に保護の属性を確認することによって、プログラム相互間で記憶保護を保つことができる。【００１４】
最近のアーキテクチャでは、主記憶管理の効率の関係上、保護属性はブロック単位で設定される。ブロックの単位としては４０９６バイト（４キロバイト）等がある。【００１５】
このように、共有ライブラリのデータ領域は、テキスト領域と保護属性を変える必要があるため、テキスト領域を配置するブロックとは別のブロックに配置する。このとき、ファイル構成の都合上、データ領域の先頭アドレスが、ブロックの先頭アドレスからテキスト領域のサイズに等しいオフセット分だけずらした位置から始まる領域に配置している（例えば、非特許文献１の６９頁参照）。【００１６】
共有ライブラリを主記憶上に読込む時に、その配置アドレスに制約がないものをＰＩＣ（Ｐｏｓｉｔｉｏｎ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｄｅ）形式という。共有ライブラリを含む実行プログラムのフォーマットの一つであるＥＬＦ（Ｅｘｅｃｕｔａｂｌｅ  ａｎｄ  Ｌｉｎｋｉｎｇ  Ｆｏｒｍａｔ）形式では、共有ライブラリの配置アドレスを起動時に決定した後に、共有ライブラリの関数呼び出しや変数参照等を行う時に、ＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域及びＰＬＴ（Ｐｒｏｃｅｄｕｒｅ  Ｌｉｎｋａｇｅ  Ｔａｂｌｅ）領域という領域を利用する。【００１７】
ＧＯＴ領域は、各シンボルのアドレスを保持するテーブルであり、対象シンボルが変数等のデータ領域の場合、テキスト領域にあるプログラム命令列から参照される。対象シンボルが関数等のテキスト領域の場合は、ＰＬＴ領域から参照される。ＰＬＴ領域は、通常、ＧＯＴ領域に書込まれている関数アドレスを間接呼び出しする。シンボル未解決の場合には、シンボル解決ルーチンを呼び出すことになる。ＰＬＴ領域の詳細な説明については、非特許文献１の２０７頁に記載されている。【００１８】
本発明に関連する、自由配置可能な共有ライブラリの構成が、下記の特許文献１に開示されている。特許文献１では、共有ライブラリや実行プログラムの主記憶上の配置をランダムにできる。この方式を用いると、テキスト領域とデータ領域とを任意の場所に配置することができ、テキスト領域だけでなく、データ領域の配置も自由にすることによって、自由度の高い配置を可能としている。【００１９】
特許文献１の方式では、プログラムや共有ライブラリが、コード領域（テキスト領域）とデータ領域とＰＬＴ領域とＧＯＴ領域とＧＯＴ２領域とによって構成され、ＧＯＴ領域の機能を変数参照用と関数呼び出し用との２つに分けている。前者の変数参照用は、ＧＯＴ領域を上記の方法と同様に用い、後者の関数呼び出し用のためにＧＯＴ２領域が定義されている。ＧＯＴ２領域に書込まれた関数アドレスは、ＰＬＴ領域から参照されて、その関数が呼び出される。
【先行技術文献】
【特許文献】
【００２０】
【特許文献１】特開２００３−３９１４６２号公報
【非特許文献】
【００２１】
【非特許文献１】「Ｌｉｎｋｅｒｓ  ａｎｄ  Ｌｏａｄｅｒｓ」、Ｊｏｈｎ  Ｒ．Ｌｅｖｉｎｅ著、出版社：Ｍｏｒｇａｎ  Ｋａｕｆｍａｎｎ、１ｓｔ  ｅｄｉｔｉｏｎ  ｐｐ６９，１１０，２０７
【発明の概要】
【発明が解決しようとする課題】
【００２２】
本発明に関連するプログラムの作成方法の課題は、プログラムの実行時、主記憶上に未使用領域が多く存在することである。その理由は、動的リンクの場合、共有ライブラリのデータ領域のサイズが、必ずしも主記憶のブロックサイズと同じではなく、このためにブロック内で使い切れない領域の問題が発生するからである（この問題は、内部フラグメンテーションと呼ばれている）。【００２３】
特許文献１に記載の手法の場合は、ＰＬＴ領域にＧＯＴ２領域の固定アドレスが記載されるので、ＰＬＴ領域を含むアダプトプログラムセクションが主記憶上でプロセス間共有できず、やはり、ブロック内に未使用領域が発生するからである。【００２４】
例えば、２つの共有ライブラリＡ，Ｂがあり、それぞれのテキスト領域をａ，ｂ、データ領域をａ'，ｂ'とする。また、ブロックの大きさを４キロバイト、共有ライブラリＡ，Ｂのテキスト領域及びデータ領域のサイズを４キロバイト以下とし、これら２つの共有ライブラリＡ，Ｂを配置すると、例えば図１４に示すようになる。【００２５】
図１４において、ブロック内のハッチングを施していない領域と、データ領域ａ'，ｂ'の前方に位置するオフセット領域とが未使用領域になる。未使用領域の個数は、共有ライブラリの個数に比例して発生するので、特に動的リンクする共有ライブラリの数が増えた場合に主記憶の使用効率が悪い。これは特許文献１のコード領域とＰＬＴ領域とに関しても同様である。【００２６】
そこで、本発明の目的は上記の問題点を解消し、実行プログラムの主記憶使用量を少なくすることができる計算機システム及びそれに用いるリンク方法並びにそのプログラムが格納された非一時的なコンピュータ可読媒体を提供することにある。
【課題を解決するための手段】
【００２７】
本発明による計算機システムは、主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも含み、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行手段を有し、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力し、
前記実行プログラムを実行する際に、前記プログラム実行手段にて、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込み、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクする。【００２８】
本発明によるリンク方法は、  主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも含み、
プログラム実行手段が、前記実行プログラムを前記主記憶上に読込んで実行する処理を実行し、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力し、
前記実行プログラムを実行する際に、前記プログラム実行手段にて実行される処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込み、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクする。【００２９】
本発明によるプログラムが格納された非一時的なコンピュータ可読媒体は、主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも保持させる処理と、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行処理と、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力させる処理と、
前記実行プログラムを実行する際に、前記プログラム実行処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込ませ、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクさせる処理と、をコンピュータに実行させるためのプログラムが格納されたものである。
【発明の効果】
【００３０】
本発明は、上記のような構成及び動作とすることで、実行プログラムの主記憶使用量を少なくすることができるという効果が得られる。
【図面の簡単な説明】
【００３１】
【図１】本発明の第１の実施の形態による計算機システムの構成例を示すブロック図である。
【図２】本発明の第１の実施例における実行プログラムのリンク時における実行プログラムと共有ライブラリの構成を示す図である。
【図３】本発明の第１の実施の形態による計算機システムにおける実行プログラムのリンク時の動作を示すフローチャートである。
【図４Ａ】本発明の第１の実施の形態における実行プログラム及び共有ライブラリの実行時の構成を示す図である。
【図４Ｂ】本発明の第１の実施の形態における実行プログラム及び共有ライブラリの実行時の構成を示す図である。
【図５】本発明の第１の実施の形態による計算機システムにおける実行プログラムの 実行時の動作を示すフローチャートである。
【図６Ａ】本発明の第１の実施の形態におけるリンク時の実行プログラムの構成及び共有ライブラリのそれぞれの関数と変数との構成を示す図である。
【図６Ｂ】本発明の第１の実施の形態におけるリンク時の実行プログラムの構成及び共有ライブラリのそれぞれの関数と変数との構成を示す図である。
【図６Ｃ】本発明の第１の実施の形態におけるリンク時の実行プログラムの構成及び共有ライブラリのそれぞれの関数と変数との構成を示す図である。
【図６Ｄ】本発明の第１の実施の形態におけるリンク時の実行プログラムの構成及び共有ライブラリのそれぞれの関数と変数との構成を示す図である。
【図７】本発明の第１の実施の形態において作成される実行ファイルの構成を示す図である。
【図８】本発明の第２の実施の形態において実行プログラムのリンク時における実行プログラムと共有ライブラリの構成を示す図である。
【図９】本発明の第２の実施の形態に係わる計算機システムにおける実行プログラムのリンク時の動作を示すフローチャートである。
【図１０Ａ】本発明の第２の実施の形態における実行プログラム及び共有ライブラリのファイルシステム上の構成を示す図である。
【図１０Ｂ】本発明の第２の実施の形態における実行プログラム及び共有ライブラリのファイルシステム上の構成を示す図である。
【図１１Ａ】本発明の第２の実施の形態における実行プログラム及び共有ライブラリの実行時の主記憶上の構成を示す図である。
【図１１Ｂ】本発明の第２の実施の形態における実行プログラム及び共有ライブラリの実行時の主記憶上の構成を示す図である。
【図１２】本発明の第２の実施の形態における実行プログラムの実行時の動作を示すフローチャートである。
【図１３】本発明の第２の実施の形態において作成される実行ファイルの構成を示す図である。
【図１４】本発明に関連する共有ライブラリの配置例を示す図である。
【発明を実施するための形態】
【００３２】
次に、本発明の実施の形態について図面を参照して説明する。まず、本発明によるリンク方法の概略について説明する。本発明によるリンク方法は、主記憶上に配置して実行される実行プログラムと共有ライブラリとを処理するために、実行プログラムを作成する際に、共有ライブラリのうちの、実行プログラムのオブジェクトファイルが必要とするデータ領域とＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域とを、実行プログラムのオブジェクトファイルのＧＯＴ領域とデータ領域とを静的リンクして１つにまとめて実行プログラムに出力している。
【００３３】
また、本発明によるリンク方法は、実行プログラムを実行する際に、実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを主記憶上に読込み、さらに共有ライブラリのテキスト領域のみを主記憶上に読込んで動的リンクしている。
【００３４】
このように、本発明は、データ領域の内部フラグメンテーションを小さく抑えることによって、実行プログラムの実行時に使用する主記憶を小さくし、かつテキスト領域を主記憶上でプロセス間共有することによって、主記憶の使用効率を上げるリンク方法を実現することができる。
【００３５】
つまり、本発明は、データ領域やＧＯＴ領域をまとめることで内部フラグメンテーションを削減し、そのときに実行プログラムや共有ライブラリのテキスト領域を主記憶上でプロセス間共有することで、実行プログラムの主記憶使用量を少なくすることができる。
【００３６】
図１は本発明の第１の実施の形態による計算機システムの構成例を示すブロック図である。図１において、本発明の第１の実施の形態による計算機システムは、少なくとも、プログラム制御により動作するデータ処理装置１と、主記憶装置２と、外部記憶装置３とによって構成されている。
【００３７】
外部記憶装置３は、ファイルシステム部３１を含んで構成されている。ファイルシステム部３１は、データ処理装置１の実行に必要な実行プログラムや共有ライブラリ３１１、及びその他のファイルを格納している。ファイルシステム部３１を構成する例としては、ＨＤＤ（ｈａｒｄ  ｄｉｓｋ  ｄｒｉｖｅ）等が挙げられる。
【００３８】
共有ライブラリ３１１は、１以上のプログラムにより共通に利用される１以上のライブラリ関数を含んでいる。本実施の形態では、外部記憶装置３を、ファイルを読込む用途で使用しているが、外部記憶装置３の使用方法はそれに限定されない。
【００３９】
データ処理装置１は、プログラム実行部１１を含んで構成されている。プログラム実行部１１は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）やプロセスを実行する主体である。
【００４０】
主記憶装置２は、少なくとも主記憶部２１によって構成されている。主記憶装置２を構成する記憶素子は、ランダムアクセス可能なものならなんでもよく、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）やＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）等が主に使われる。
【００４１】
主記憶部２１には、ファイルシステム部３１から実行プログラムや共有ライブラリが読込まれ、プログラム等の制御にしたがってデータ処理装置１が主記憶部２１上のデータの読み書きを行う。
【００４２】
プロセスは、実行プログラムを実行している時の主記憶部２１上の実体であり、実行にともなって変化するデータの状態を保持している。異なる実行プログラムを実行している時はもちろん、同じ実行プログラムを複数動かす時も別々のプロセスとなる。
【００４３】
プログラム実行部１１は、実行プログラムが起動される時にその前処理を行う処理、プログラムの実行中に動的にシンボル解決を行う処理等を行う。前処理では、プロセスを作成して実行プログラムのファイルをファイルシステム部３１から読出したり、実行プログラムが必要する共有ライブラリ３１１を動的リンクする処理を行う。
【００４４】
以下、特に明記しない限り、テキスト領域、ＧＯＴ領域、ＰＬＴ（Ｐｒｏｃｅｄｕｒｅ  Ｌｉｎｋａｇｅ  Ｔａｂｌｅ）領域、データ領域等のそれぞれの機能は、上述した本発明に関連するプログラムの作成方法と同じであるとする。また、リンク処理等は、ＥＬＦ（Ｅｘｅｃｕｔａｂｌｅ  ａｎｄ  Ｌｉｎｋｉｎｇ  Ｆｏｒｍａｔ）形式等の標準方式にしたがうものとするが、本発明はこれに限定されない。
【００４５】
図２は本発明の第１の実施例における実行プログラムのリンク時における実行プログラムと共有ライブラリの構成を示す図である。図２では、実行プログラムのオブジェクトファイル４０も、共有ライブラリ３１１もいずれも１つずつしか記載されていないが、それぞれが複数ある場合もありうる。以下、図２を参照して、リンク時の実行プログラム及び共有ライブラリの構成について説明する。
【００４６】
リンク時における共有ライブラリ３１１は、テキスト領域３１１１とＧＯＴ領域３１１２とデータ領域３１１３とによって構成されている。但し、テキスト領域３１１１は、アドレス計算等のために参照されるだけにとどまるため、作成された実行プログラム５０のテキスト領域５０１には含まれない。
【００４７】
リンク時における実行プログラムは、オブジェクトファイル４０の段階において、テキスト領域４０１とデータ領域４０２とによって構成されている。尚、作成するプログラムによっては、データ領域がない場合もある。
【００４８】
リンク時に最終的に作成された実行プログラム５０は、テキスト領域５０１とデータ領域５０４とＧＯＴ領域５０３とＰＧＯＴ領域５０２とによって構成される。尚、作成するプログラムによっては、データ領域、ＧＯＴ領域、ＰＧＯＴ領域のいずれかもしくは全てがない場合もある。
【００４９】
作成された実行プログラム５０のテキスト領域５０１は、オブジェクトファイル４０のテキスト領域４０１そのものである。オブジェクトファイル４０が複数あった場合は、それらのテキスト領域４０１をまとめたものである。上述したように、共有ライブラリ３１１のテキスト領域３１１１は含まれない。
【００５０】
作成された実行プログラム５０のデータ領域５０４は、オブジェクトファイル４０のデータ領域４０２と、実行プログラムがリンクする共有ライブラリ３１１のデータ領域３１１３とをまとめたものである。
【００５１】
作成された実行プログラム５０のＧＯＴ領域５０３は、実行プログラムがリンクする共有ライブラリ３１１の全てのＧＯＴ領域３１１２をまとめたものに、さらにオブジェクトファイル４０のテキスト領域４０１から共有ライブラリ３１１の関数を呼び出す場合に必要なＧＯＴ領域を新たに追加したものである。
【００５２】
作成された実行プログラム５０のＰＧＯＴ領域５０２は、リンクする共有ライブラリ３１１の各ＧＯＴ領域３１１２の先頭アドレスを保持している。ＰＧＯＴ領域５０２のアドレスは、共有ライブラリ３１１を作成する時に、共有ライブラリ３１１毎に固有に決められ、各ＰＧＯＴ領域５０２のアドレスは、システム内で重複することができない。
【００５３】
共有ライブラリ３１１は、ＧＯＴ領域３１１２のアドレスを得るために、ＰＧＯＴ領域５０２を参照するように作成される。そのため、ＰＧＯＴ領域５０２のアドレスは、共有ライブラリ３１１の作成時に決められたアドレスである必要がある。図２では、主記憶節約のために、ＰＧＯＴ領域５０２の各エントリがまとめられて配置されているが、本発明はこの形態に限定されない。
【００５４】
実行プログラム及び実行プログラムから呼び出されるライブラリの関数から参照されない変数が共有ライブラリ３１１にあった場合は、当該変数が占めるデータ領域３１１３を削除することも可能である。これによって、本実施の形態では、使用する主記憶量を減らすことができる。
【００５５】
但し、共有ライブラリ３１１のＧＯＴ領域３１１２に関しては、たとえ変数を参照しなかったとしても、その領域を無くすことはできない。その理由は、共有ライブラリ３１１のテキスト領域３１１１をプロセス間で共有するので、ＧＯＴ領域３１１２の構成をプロセス毎に変えることができないからである。
【００５６】
作成された実行プログラム５０のテキスト領域５０１は、ＰＬＴ領域を含んでおり、読込み及び実行可能の属性で主記憶上に読込まれる。作成された実行プログラム５０のデータ領域５０４は、読み書き可能な属性で主記憶上に読込まれる。
【００５７】
作成された実行プログラム５０のＧＯＴ領域５０３のシンボル解決やＰＧＯＴ領域５０２の各エントリは、リンク時に決定されるが、ＧＯＴ領域５０３のエントリのうち、関数呼び出しに関するシンボル解決は実行プログラムの起動時に行われてもよい。
【００５８】
同じ実行プログラムを同時に複数起動することがあれば、テキスト領域５０１は、各起動プロセス間で共有することができるので、使用する主記憶量を節約することができるが、データ領域５０４は共有することができない。
【００５９】
このように、ＧＯＴ領域５０３のアドレスをＰＧＯＴ領域５０２経由で間接参照するようにしたことによって、ＧＯＴ領域５０３を任意の場所に配置することができるようになる。つまり、ＰＬＴ領域がＧＯＴ２のアドレスを含む特許文献１のような構成にはならない。したがって、ＰＬＴ領域は、プロセス間で共有可能となり、各共有ライブラリ３１１のテキスト領域３１１１に含めることができる。
【００６０】
データ領域３１１３及びＧＯＴ領域３１１２は読み書き可能な属性で、主記憶上に読込まれる。ＧＯＴ領域３１１２及びデータ領域３１１３は同じ属性で読込まれるので、これらを隣接して配置することができる。
【００６１】
図３は本発明の第１の実施の形態による計算機システムにおける実行プログラムのリンク時の動作を示すフローチャートである。以下、図１〜図３を参照して、実行プログラムのリンク時の動作について説明する。尚、図３に示す処理動作は、データ処理装置１のプログラム実行部１１がプログラムを実行することで実現される。
【００６２】
まず、リンカ（ｌｉｎｋｅｒ）は、実行プログラムのデータ領域４０２と、実行プログラムが必要とする共有ライブラリ３１１のデータ領域３１１３と、ＧＯＴ領域３１１２とを集めて各々の領域毎に並べて配置するアドレスを決定する（図３ステップＳ１，Ｓ２）。ここで、リンカは、リンケージエディタや連携編集プログラムとも呼ばれ、機械語のプログラムの断片を結合して実行可能なプログラムを作成するプログラムである。つまり、プログラム実行部１１がリンカを実行することで、以下の処理が行われる。
【００６３】
このとき、実行プログラム及び実行プログラムから呼び出される関数群から参照されない変数が共有ライブラリ３１１にあった場合は、データ領域３１１３にあるその変数のエントリを削除してもよい。こうすることによって、本実施の形態では、使用する主記憶量をさらに減らすことができる。
【００６４】
次に、リンカは、決まったアドレス配置から、各ＧＯＴ領域３１１２から参照する変数（共有ライブラリのデータ領域に含まれる）のアドレスを調べ（図３ステップＳ３）、各ＧＯＴエントリにアドレスを書込んでいく（図３ステップＳ４）。
【００６５】
また、関数呼び出しのアドレスをリンクの時点で決定して対応するＧＯＴ領域に書込むことも可能である。この場合は、実行時の共有ライブラリ３１１の配置が既知である必要がある。
【００６６】
続いて、リンカは、各ＧＯＴ領域３１１２のアドレスを各ＰＧＯＴ領域５０２に書込む（図３ステップＳ５）。
【００６７】
リンカは、以上の処理によって作成された実行プログラム５０のテキスト領域５０１、データ領域５０４、ＧＯＴ領域５０３をファイルの形式で外部記憶装置３に出力する。
【００６８】
本実施の形態では、リンク時にＧＯＴエントリの解決をしておくことで、起動時のオーバヘッドを減らして起動を高速化することができる利点もある。
【００６９】
図４は本発明の第１の実施の形態における実行プログラム及び共有ライブラリの実行時の構成を示す図である。図４Ａは実行プログラム６０の構成を示し、図４Ｂは共有ライブラリ３１１の構成を示している。
【００７０】
実行時の実行プログラム６０の構成は、図４Ｂに示すように、リンク時に作成された実行プログラム５０の構成（図２参照）と同じである。実行時の共有ライブラリ３１１は、テキスト領域３１１１によって構成される。
【００７１】
共有ライブラリ３１１のテキスト領域３１１１は、実行プログラムのリンク時（図２）にある共有ライブラリ３１１のテキスト領域３１１１と同じものである。リンク時には、共有ライブラリ３１１のテキスト領域３１１１は、実行プログラム６０のテキスト領域６０１に加えられず、実行時に読込まれて関数等が呼び出される。
【００７２】
テキスト領域３１１１は、ＰＬＴ領域を含んでおり、読込み及び実行可能の属性で主記憶上に読込まれる。仮に同じ共有ライブラリ３１１を複数の実行プログラムからリンクして同時に起動されることがあった場合、テキスト領域３１１１は、各起動プロセス間で共有することができるため、使用する主記憶量を節約することができる。
【００７３】
図５は本発明の第１の実施の形態による計算機システムにおける実行プログラムの実行時の動作を示すフローチャートである。以下、図１と図４と図５とを参照して、実行プログラムの実行時の動作について説明する。尚、図５に示す処理動作は、データ処理装置１のプログラム実行部１１がプログラムを実行することで実現される。
【００７４】
まず、プログラムの実行が開始されると、プログラム実行部１１は、実行するプログラムのファイルを外部記憶装置３から主記憶部２１に読込む（図５ステップＳ１１）。このとき、テキスト領域が既に他のプロセスで使用されているならば、新たに主記憶部２１上に読込むことなく、そのプロセスと共有することができ、主記憶の節約となる。
【００７５】
次に、プログラム実行部１１は、実行プログラム６０が必要とする共有ライブラリ３１１のテキスト領域３１１１を主記憶部２１上に読込む（図５ステップＳ１２）。このとき、当該共有ライブラリ３１１のテキスト領域３１１１が他のプロセスによって使用されているならば、新たに主記憶部２１上に読込むことなく、そのプロセスと共有することができ、主記憶の節約となる。
【００７６】
これらの前処理が終わった後、プログラム実行部１１は、プログラムの本来の実行を開始する（図５ステップＳ１３）。
【００７７】
ＥＬＦ形式の場合、共有ライブラリ３１１の関数のシンボル解決（図５ステップＳ１４）を、前処理時（共有ライブラリ３１１の読込み時）に行うか、関数を最初に呼び出した時に行うかのいずれかを選択することができる。これはＬａｚｙ  Ｂｉｎｄｉｎｇと言われ、環境変数（"ＬＤ＿ＢＩＮＤ＿ＮＯＷ"等）でも設定することができる。
【００７８】
Ｌａｚｙ  Ｂｉｎｄｉｎｇが設定されていなかった場合、前処理時に読込んだ共有ライブラリ３１１のアドレスを用いて、必要とする共有ライブラリ３１１の関数のアドレスを解決し、対応するＧＯＴ領域６０３にそのアドレスを書込む処理を行う。Ｌａｚｙ  Ｂｉｎｄｉｎｇが設定されている場合は、関数を最初に呼び出した時にシンボル解決を行う。
【００７９】
アドレス未解決の関数を実行プログラム６０のテキスト領域６０１が呼び出した場合、実行プログラム６０のテキスト領域６０１に含まれるＰＬＴ領域がＧＯＴ領域６０３を参照すると、ＧＯＴ領域６０３にはシンボル解決関数のアドレスが書かれているため、シンボル解決関数が呼び出される。シンボル解決関数は関数のアドレスを既存の手法で解決し、そのアドレスを対応するＧＯＴ領域６０３に書込む。そして、当該関数を呼び出して処理を行った後、実行プログラム６０のテキスト領域６０１に復帰する。
【００８０】
アドレス未解決の関数を共有ライブラリ３１１のテキスト領域３１１１が呼び出した場合、共有ライブラリ３１１のテキスト領域３１１１に含まれるＰＬＴ領域はまず、その共有ライブラリに決められたＰＧＯＴ領域６０２を参照し、ＧＯＴ領域６０３のアドレスを得る。
【００８１】
ＧＯＴ領域６０３を参照すると、ＧＯＴ領域６０３にはシンボル解決関数のアドレスが書かれているため、シンボル解決関数が呼び出される。シンボル解決関数は、関数のアドレスを既存の手法で解決し、そのアドレスを対応するＧＯＴ領域６０３に書込む。そして、当該関数を呼び出して処理を行った後、共有ライブラリ３１１のテキスト領域３１１１に復帰する。
【００８２】
実行プログラム６０のテキスト領域６０１であれ、共有ライブラリ３１１のテキスト領域３１１１であれ、ＧＯＴ領域６０３でアドレスが解決された関数の呼び出しに関しては、最早、シンボル解決関数を呼び出すことはなく、ＰＬＴ領域からＧＯＴ領域６０３を参照して、直接、当該関数を呼び出して処理をする。
【００８３】
本実施の形態では、ＰＧＯＴ領域６０２が実行プログラム６０に含まれている形態を示したが、起動時にプログラム実行部１１が独自に主記憶部２１上に確保しても構わない。この場合、各共有ライブラリ３１１のテキスト領域３１１１に書かれたＰＧＯＴ領域６０２のアドレスと同じアドレスに確保する。
【００８４】
このように、本実施の形態では、データ領域３１１３やＧＯＴ領域３１１２をまとめることで、内部フラグメンテーションを削減することができ、このとき、実行プログラム５０や共有ライブラリ３１１のテキスト領域５０１，３１１１を主記憶部２１上でプロセス間共有することで、実行プログラム５０の主記憶使用量を少なくすることができる。
【００８５】
次に、本実施の形態について一実施例を挙げて、より詳細に説明する。図６は本発明の第１の実施の形態におけるリンク時の実行プログラムの構成及び共有ライブラリＡ，Ｂ，Ｃのそれぞれの関数と変数との構成を示す図である。図６において、実行プログラムからは関数ｆｕｎＡ１（）と関数ｆｕｎＢ（）と関数ｆｕｎＣ（）とを呼び出すものとする。
【００８６】
共有ライブラリＡには、ｆｕｎＡ１（）とｆｕｎＡ２（）との２つの関数があり、ｆｕｎＡ１（）からは変数ｖａｒ０とｖａｒ１とが参照され、ｆｕｎＡ２（）からは変数ｖａｒＮが参照されるものとする。
【００８７】
同様に、共有ライブラリＢには、変数ｖａｒ２を参照する関数ｆｕｎＢ（）があり、共有ライブラリＣには変数ｖａｒ３を参照する関数ｆｕｎＣ（）が実装されているものとする。また、関数ｆｕｎＡ２（）は、共有ライブラリＡには定義されていない大域変数ｖａｒ３を参照する。
【００８８】
本実施の形態において、この実行プログラムをリンクすると、図７に示すような実行ファイルができ上がる。本実施の形態では、共有ライブラリＡの関数ｆｕｎＡ２（）は実行プログラムから呼び出されないので、関数ｆｕｎＡ２（）が参照するｖａｒＮは実行プログラムのデータ領域に含まれていない。
【００８９】
このように、本実施の形態では、データ領域を静的リンクすると、読み書き可能属性の領域が一ヶ所に集まるので、内部フラグメンテーションを小さく抑えることができ、実行時の主記憶使用量を減らすことができる。
【００９０】
また、本実施の形態では、実行プログラムから呼び出さない関数が参照する変数の領域がデータ領域に含まれないので、このような変数領域が多くの共有ライブラリに含まれている場合は、実行時の主記憶使用量を減らすことができる。
【００９１】
さらに、本実施の形態では、共有ライブラリのテキスト領域にＰＬＴ領域を含め、プロセス間で共有することができるため、主記憶使用量を節約することができる。
【００９２】
上記の本発明の第１の実施の形態では、リンク時（コンパイル時）にデータ領域及びＧＯＴ領域の内部フラグメンテーションの削減を行っているが、本発明の第２の実施の形態では、実行プログラムの実行時にデータ領域の配置を工夫することで、内部フラグメンテーションの削減を行っている。尚、本発明の第２の実施の形態を実現する計算機システムは、図１に示す本発明の第１の実施の形態による計算機システムと同じ構成である。
【００９３】
図８は本発明の第２の実施の形態において実行プログラムのリンク時における実行プログラムと共有ライブラリの構成を示す図である。図８においては、実行プログラムのオブジェクトファイル４０も、共有ライブラリ３１１も、いずれも１つずつしか記載していないが、それぞれが複数ある場合もありうる。
【００９４】
図８によると、リンク時における共有ライブラリ３１１はテキスト領域３１１１とＧＯＴ領域３１１２とデータ領域３１１３とによって構成されている。但し、いずれの領域もアドレス計算等のために参照されるだけにとどまるため、作成された実行プログラム５０のテキスト領域５０１、ＧＯＴ領域５０３、データ領域５０４には含まれない。
【００９５】
また、図８によると、リンク時における実行プログラムは、オブジェクトファイル４０の段階ではテキスト領域４０１とデータ領域４０２とによって構成されている。尚、作成するプログラムによっては、データ領域がない場合もある。
【００９６】
さらに、図８によると、リンク時に最終的に作成された実行プログラム５０は、テキスト領域５０１とデータ領域５０４とＧＯＴ領域５０３とＰＧＯＴ領域５０２とによって構成されている。尚、作成するプログラムによっては、データ領域、ＧＯＴ領域、ＰＧＯＴ領域のいずれかもしくは全てがない場合もある。
【００９７】
作成された実行プログラム５０のテキスト領域５０１は、オブジェクトファイル４０のテキスト領域４０１のものである。オブジェクトファイル４０が複数あった場合は、それらのテキスト領域４０１をまとめたものである。上述したように、共有ライブラリ３１１のテキスト領域３１１１は含まれない。
【００９８】
作成された実行プログラム５０のデータ領域５０４は、オブジェクトファイル４０のデータ領域４０２のものである。オブジェクトファイル４０が複数あった場合は、それらのデータ領域４０２をまとめたものである。上述したように、共有ライブラリ３１１のデータ領域３１１３は含まれない。
【００９９】
作成された実行プログラム５０のＧＯＴ領域５０３は、オブジェクトファイル４０のテキスト領域４０１から共有ライブラリ３１１の関数を呼び出す場合に必要なＧＯＴ領域を作成したものである。
【０１００】
作成された実行プログラム５０のＰＧＯＴ領域５０２は、リンクする共有ライブラリ３１１の各ＧＯＴ領域３１１２の先頭アドレスを保持している。ＰＧＯＴ領域５０２を配置するアドレスは、共有ライブラリ３１１を作成する時に共有ライブラリ３１１毎に固有に決められ、各ＰＧＯＴ領域５０２の配置アドレスはシステム内で重複できない。
【０１０１】
共有ライブラリ３１１は、ＧＯＴ領域３１１２のアドレスを得るためにＰＧＯＴ領域５０２を参照するように作成される。したがって、ＰＧＯＴ領域５０２のアドレスは、共有ライブラリ３１１の作成時に決められたアドレスである必要がある。図８では、主記憶節約のためにＰＧＯＴ領域５０２の各エントリがまとめられて配置されているが、本発明はこの形態に限定されない。
【０１０２】
テキスト領域５０１は、ＰＬＴ領域を含んでおり、読込み及び実行可能の属性で主記憶上に読込まれる。データ領域５０４は、読み書き可能な属性で主記憶上に読込まれる。
【０１０３】
ＧＯＴ領域５０３のシンボル解決やＰＧＯＴ領域５０２の各エントリは、リンク時に決定されるが、ＧＯＴ領域５０３のうち、関数呼び出しに関するシンボル解決は実行プログラムの起動時に行われてもよい。
【０１０４】
同じ実行プログラムを同時に複数起動することがあれば、テキスト領域５０１は各起動プロセス間で共有することができるので、使用する主記憶量を節約することができるが、データ領域５０４は共有することができない。
【０１０５】
このように、ＧＯＴ領域５０３のアドレスをＰＧＯＴ領域５０２経由で間接参照するようにしたことで、ＧＯＴ領域５０３を任意の場所に配置することができるようになる。よって、ＰＬＴ領域がＧＯＴ２のアドレスを含む特許文献１のような構成にはならない。したがって、ＰＬＴ領域は、プロセス間で共有可能となり、各共有ライブラリ３１１のテキスト領域３１１１に含めることができる。
【０１０６】
データ領域５０４とＧＯＴ領域５０３とは、読み書き可能な属性で主記憶上に読込まれる。ＧＯＴ領域５０３とデータ領域５０４とは、同じ属性で読込まれるので、これらの間に内部フラグメンテーションを発生させずに、隣接して配置することができる。
【０１０７】
図９は本発明の第２の実施の形態に係わる計算機システムにおける実行プログラムのリンク時の動作を示すフローチャートである。以下、図１と図８と図９とを参照して、本実施の形態における実行プログラムのリンクの動作について説明する。尚、図９に示す処理動作は、データ処理装置１のプログラム実行部１１がプログラムを実行することで実現される。また、プログラム実行部１１がリンカを実行することで、以下の処理が行われる。
【０１０８】
まず、リンカは、オブジェクトファイル４０のテキスト領域４０１を集め、配置するアドレスを決定する（図９ステップＳ２１）。次に、リンカは、オブジェクトファイル４０のデータ領域４０２を集め、配置するアドレスを決定する（図９ステップＳ２２）。
【０１０９】
リンカは、共有ライブラリ３１１の呼び出しのためのＰＧＯＴ領域５０２及びＧＯＴ領域５０３を確保し（図９ステップＳ２３）、以上の処理によって作成された実行プログラム５０のテキスト領域５０１、データ領域５０４を、ファイルの形式で外部記憶装置３に出力する（図９ステップＳ２４）。
【０１１０】
図１０は本発明の第２の実施の形態における実行プログラム及び共有ライブラリのファイルシステム上の構成を示す図である。図１０Ａはファイルシステム上の実行プログラム７０の構成を示し、図１０Ｂはファイルシステム上の共有ライブラリ８０の構成を示している。
【０１１１】
作成された実行プログラム７０は、図８を参照して説明したように、ファイルシステム上で、テキスト領域７０１とＰＧＯＴ領域７０２とＧＯＴ領域７０３とデータ領域７０４とによって構成される。また、共有ライブラリ８０は、ファイルシステム上で、テキスト領域８０１とＧＯＴ領域８０２とデータ領域８０３とによって構成される。
【０１１２】
図１１は本発明の第２の実施の形態における実行プログラム及び共有ライブラリの実行時の主記憶上の構成を示す図である。図１１Ａは主記憶上の実行プログラム９０の構成を示し、図１１Ｂは主記憶上の共有ライブラリ１００の構成を示している。
【０１１３】
ある実行プログラムに対して複数の共有ライブラリがリンクされていることがある。実行時の主記憶上の実行プログラム９０は、リンク時に作成された実行プログラムの構成であるテキスト領域９０１とＰＧＯＴ領域９０２とＧＯＴ領域９０３とデータ領域９０４とに加えて、ＧＯＴ領域（Ａ）９０５とデータ領域（Ａ）９０６とから構成されている。
【０１１４】
ＧＯＴ領域（Ａ）９０５及びデータ領域（Ａ）９０６は、実行プログラム９０がリンクする共有ライブラリのＧＯＴ領域及びデータ領域のものを、主記憶上に読込んだ時に実行プログラム９０のデータ領域９０４に隣接する箇所に配置したものである。そのため、リンクする共有ライブラリが複数ある時は、この組が複数存在することになる。
【０１１５】
実行プログラム９０及び実行プログラム９０から呼び出される共有ライブラリ１００の関数から参照されない変数が共有ライブラリ１００にあった場合、当該変数が占めるデータ領域を削除することも可能である。これによって、本実施の形態では、使用する主記憶量を減らすことができる。但し、共有ライブラリ１００のＧＯＴ領域に関しては、例え変数を参照しなかったとしてもその領域を無くすことはできない。
【０１１６】
実行時の主記憶上の共有ライブラリ１００は、テキスト領域１００１によって構成される。共有ライブラリ１００のテキスト領域１００１は、ファイルシステム上の共有ライブラリ８０（図１０）のテキスト領域８０１と同じものである。
【０１１７】
テキスト領域８０１は、ＰＬＴ領域を含んでおり、読込み及び実行可能の属性で主記憶上に読込まれる。仮に同じ共有ライブラリ８０を複数の実行プログラム７０からリンクして同時に起動されることがあった場合、テキスト領域８０１は、各起動プロセス間で共有することができるため、使用する主記憶量を節約することができる。
【０１１８】
図１２は本実施の形態に係わる計算機システムにおける実行プログラムの実行時の動作を示すフローチャートである。以下、図１と図１１と図１２とを参照しながら、プログラムの実行時の動作について説明する。尚、図１２に示す処理動作は、データ処理装置１のプログラム実行部１１がプログラムを実行することで実現される。
【０１１９】
まず、プログラムの実行が開始されると、プログラム実行部１１は、実行するプログラム９０のファイル（テキスト領域９０１、ＰＧＯＴ領域９０２、ＧＯＴ領域９０３、データ領域９０４）を外部記憶装置３から主記憶部２１に読込む（図１２ステップＳ３１）。このとき、テキスト領域９０１が既に他のプロセスで使用されているならば、新たに主記憶部２１上に読込むことなく、そのプロセスと共有することができ、主記憶の節約となる。
【０１２０】
次に、プログラム実行部１１は、実行プログラム９０が必要とする共有ライブラリ１００のテキスト領域１００１を主記憶部２１上に読込む（図１２ステップＳ３２）。このとき、当該共有ライブラリ１００のテキスト領域１００１が他のプロセスによって使用されているならば、新たに主記憶部２１上に読込むことなく、そのプロセスと共有することができ、主記憶の節約となる。
【０１２１】
さらに、プログラム実行部１１は、共有ライブラリのＧＯＴ領域及びデータ領域を主記憶部２１上に読込む（図１２ステップＳ３３）。このとき、配置するアドレスは、実行プログラム９０のデータ領域９０４に隣接するアドレスとする。このように配置することによって、本実施の形態では、データ領域等の読み書き可能な領域が複数存在する時の内部フラグメンテーションを削減することができ、主記憶の節約となる。
【０１２２】
続いて、プログラム実行部１１は、各ＧＯＴ領域が参照する変数のシンボルのアドレスを、配置した共有ライブラリのデータ領域のアドレスから解決して（図１２ステップＳ３４）、ＧＯＴ領域の各エントリにアドレスを書込んでいく（図１２ステップＳ３５）。また、プログラム実行部１１は、関数のシンボルのアドレスをこの時点で決定し、対応するＧＯＴ領域のエントリに書込むことも可能である。
【０１２３】
次に、プログラム実行部１１は、各ＧＯＴ領域９０３のアドレスを各ＰＧＯＴ領域９０２に書込む（図１２ステップＳ３６）。これらの前処理が終わった後、プログラム実行部１１は、プログラムの本来の実行を開始する（図１２ステップＳ３７）。
【０１２４】
Ｌａｚｙ  Ｂｉｎｄｉｎｇ設定やプログラム実行時の関数シンボルの解決に関しては、上述した本発明の第１の実施の形態と同じである。
【０１２５】
本実施の形態では、ＰＧＯＴ領域９０２が実行プログラム９０に含まれている形態を示したが、起動時にプログラム実行部１１が独自に主記憶部２１上に確保しても構わない。この場合、各共有ライブラリ１００のテキスト領域１００１に書かれたＰＧＯＴ領域９０２のアドレスと同じアドレスに確保する。
【０１２６】
本実施の形態の場合、図６に示す例の共有ライブラリ構成でリンクした場合、図１３に示すような主記憶上の構成となる。ここで、共有ライブラリＡからのＧＯＴ領域及びデータ領域が隣接しており、同様に、共有ライブラリＢからのＧＯＴ領域及びデータ領域、共有ライブラリＣからのＧＯＴ領域及びデータ領域が並ぶことになる。
【０１２７】
このように、本発明では、データ領域やＧＯＴ領域をまとめることで内部フラグメンテーションを削減することができ、このとき、実行プログラムや共有ライブラリのテキスト領域を主記憶上でプロセス間共有することで、実行プログラムの主記憶使用量を少なくすることができる。
【０１２８】
上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（random access memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【０１２９】
以上、実施の形態を参照して本願発明を説明したが、本願発明は上記によって限定されるものではない。本願発明の構成や詳細には、発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【０１３０】
この出願は、２００９年１０月２１日に出願された日本出願特願２００９−２４１９３６を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【産業上の利用可能性】
【０１３１】
本発明は、プログラム処理が可能な任意のコンピュータ、装置において利用することが可能である。
【符号の説明】
【０１３２】
１  データ処理装置
２  主記憶装置
３  外部記憶装置
１１  プログラム実行部
２１  主記憶部
３１  ファイルシステム部
４０  実行プログラムのオブジェクトファイル
５０，７０  作成された実行プログラム
６０，９０  実行プログラム
８０，１００，３１１  共有ライブラリ
４０１  テキスト領域
４０２  データ領域
５０１，６０１，
７０１，９０１  テキスト領域
５０２，６０２，
７０２，９０２  ＰＧＯＴ領域
５０３，６０３，
７０３，９０３  ＧＯＴ領域
５０４，６０４，
７０４，９０４  データ領域
８０１，１００１，
３１１１  テキスト領域
８０２，３１１２  ＧＯＴ領域
８０３，３１１３  データ領域
９０５  ＧＯＴ領域（Ａ）
９０６  データ領域（Ａ）
【図１】
2011048731.tif 000003
【図２】
2011048731.tif 000004
【図３】
2011048731.tif 000005
【図４Ａ】
2011048731.tif 000006
【図４Ｂ】
2011048731.tif 000007
【図５】
2011048731.tif 000008
【図６Ａ】
2011048731.tif 000009
【図６Ｂ】
2011048731.tif 000010
【図６Ｃ】
2011048731.tif 000011
【図６Ｄ】
2011048731.tif 000012
【図７】
2011048731.tif 000013
【図８】
2011048731.tif 000014
【図９】
2011048731.tif 000015
【図１０Ａ】
2011048731.tif 000016
【図１０Ｂ】
2011048731.tif 000017
【図１１Ａ】
2011048731.tif 000018
【図１１Ｂ】
2011048731.tif 000019
【図１２】
2011048731.tif 000020
【図１３】
2011048731.tif 000021
【図１４】
2011048731.tif 000022
【手続補正書】
【提出日】平成24年4月12日(2012.4.12)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも含み、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行手段を有し、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力し、
前記実行プログラムを実行する際に、前記プログラム実行手段にて、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込み、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクすることを特徴とする計算機システム。
【請求項２】
前記共有ライブラリは、１以上のプロセスから前記主記憶上で共有されることを特徴とする請求項１に記載の計算機システム。
【請求項３】
前記ＧＯＴ領域を前記共有ライブラリのテキスト領域が参照する場合に、前記共有ライブラリ毎に対応するＧＯＴ領域のアドレスを、前記共有ライブラリ毎に予め決められたアドレスに記録しておいて参照することを特徴とする請求項２に記載の計算機システム。
【請求項４】
主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも含み、
プログラム実行手段が、前記実行プログラムを前記主記憶上に読込んで実行する処理を実行し、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力し、
前記実行プログラムを実行する際に、前記プログラム実行手段にて実行される処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込み、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクすることを特徴とするリンク方法。
【請求項５】
前記共有ライブラリが、１以上のプロセスから前記主記憶上で共有されることを特徴とする請求項４に記載のリンク方法。
【請求項６】
前記ＧＯＴ領域を前記共有ライブラリのテキスト領域が参照する場合に、前記共有ライブラリ毎に対応するＧＯＴ領域のアドレスを、前記共有ライブラリ毎に予め決められたアドレスに記録しておいて参照することを特徴とする請求項５に記載のリンク方法。
【請求項７】
主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも保持させる処理と、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行処理と、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力させる処理と、
前記実行プログラムを実行する際に、前記プログラム実行処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込ませ、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクさせる処理と、をコンピュータに実行させるためのプログラム。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】０００１
【補正方法】変更
【補正の内容】
【０００１】
本発明は計算機システム及びそれに用いるリンク方法並びにそのプログラムに関し、特にプログラムの実行時にメモリを節約するためのリンク方法に関する。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００２６
【補正方法】変更
【補正の内容】
【００２６】
そこで、本発明の目的は上記の問題点を解消し、実行プログラムの主記憶使用量を少なくすることができる計算機システム及びそれに用いるリンク方法並びにそのプログラムを提供することにある。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】００２９
【補正方法】変更
【補正の内容】
【００２９】
本発明によるプログラムは、主記憶上に配置して実行される実行プログラムが必要とする関数及び変数の少なくとも一方を含む共有ライブラリに、前記関数の呼び出し及び前記変数の参照を行う際に利用されるＧＯＴ（Ｇｌｏｂａｌ  Ｏｆｆｓｅｔ  Ｔａｂｌｅ）領域と、データ領域とを少なくとも保持させる処理と、
前記実行プログラムを前記主記憶上に読込んで実行するプログラム実行処理と、
前記実行プログラムを作成する際に、前記共有ライブラリのうちの、前記実行プログラムのオブジェクトファイルが必要とする前記データ領域及び前記ＧＯＴ領域とを前記実行プログラムのオブジェクトファイルのＧＯＴ領域及びデータ領域に静的リンクして１つにまとめて前記実行プログラムに出力させる処理と、
前記実行プログラムを実行する際に、前記プログラム実行処理において、前記実行プログラムのテキスト領域とデータ領域とＧＯＴ領域とを前記主記憶上に読込ませ、さらに前記共有ライブラリのテキスト領域のみを前記主記憶上に読込んで動的リンクさせる処理と、をコンピュータに実行させるためのものである。
【国際調査報告】
2011048731.tif 000023
2011048731.tif 000024