システムプログラム練習問題#3

練習問題(301)

(1) ライブラリを用いてファイルコピーを行うプログラム,(2) これを fgets, fputs を用いるように変更したもの,(3) fread, fwrite を用いるように変更したもの,(4) システムコールを用いてファイルコピーを行うプログラムのそれぞれで,コピー元のファイルをサイズが大きなものに変更し,バッファサイズをいろいろ (最低1バイトという小さいものから,最大128MB程度の大きなものまで,ログスケールにのるような間隔で少なくとも8つ以上) 変えて実行時間がどのように変化するか実験せよ. 計測には,同じパラメータで何度か実行,計測し,その平均値をとること.

それぞれの結果はどのようになっただろうか? 違いについて比較し考察せよ.

プログラムの実行時間は time コマンドを用いて計測することができる. 以下の実行例では,ユーザ空間での実行に 1.05 秒,カーネルでの実行に 5.87秒,待ち時間も入れて合計で 6.96 秒かかったという結果である.

% time ./a.out [←]
1.050u 5.870s 0:06.96 99.4%     0+0k 0+0io 77pf+0w
%

実験後は,コピーした大きなファイルは消去すること!!

練習問題(302)

システムコールを用いてファイルをコピーするプログラムを1文字単位ではなく,BUFSIZ 単位で読み書きするように変更しなさい. このとき,実際に読み書きされた BUFSIZ 以下であった場合,BUFSIZ になるまで読み書きを繰り返すようにすること.

練習問題(303)

mmap を用いて,ファイルの末尾を引数で指定された行数だけ表示する tail コマンドに似たプログラムを作りなさい. 表示する順序は,ファイルに記述されている順序を守ること. また,mmap した領域は munmap すること.

練習問題(304)

utmp ファイルの各エントリの内容を保持するリストを作るプログラムは utmp ファイルを用いない Mac OS X では実行できない.

プログラムを作りなさい. なお,内容に変更があったかどうかは,ファイルの更新時間ではなく,前回読み込んだ内容と比較することによって判断するものとする. そのために,struct utmpx のメンバ ut_type が LOGIN_PROCESS または USER_PROCESS のエントリについてのみ,struct utmpx を含むリスト (linked list) を用いて記憶するものとする.(LOGIN_PROCESS, USER_PROCESS は /usr/include/utmpx.h で定義されている.)

実行結果は,端末を開いたり閉じたりといった utmpx ファイルの内容を変更する操作を繰り返し,正しく動作していることがわかるようにしなさい.

練習問題(305)

SETUTXENT (3) は,マニュアルに記載されているとおり,ut_type の値により struct utmpx のうち有効となるメンバ(フィールド)が異なり,未使用の領域を含むことになる. また,固定長の配列は余裕を持った大きさに設定されており,メモリに関しては無駄が多いと言える. メモリ資源の消費を抑えたい環境を想定し,練習問題(304)のプログラムを変更し,SETUTXENT (3) が読み込む各エントリを保存するために,必要最小限のメモリのみを確保するようにしなさい.

この時,メモリリークを起こす危険性を低減し,かつメモリ使用効率を高めるため,SETUTXENT (3) によるエントリの読み込み1度につき,メモリの確保のための呼び出しは1度のみとする. 即ち,各エントリを保存するメモリ領域は,リストを構成するためのメンバの領域を含め,1つの連続した領域となる. 言い換えれば,異なった大きさのレコード領域を持つセルでリストを構成する必要がある.