ネットワーク・プログラミング プロセスとファイルシステム管理
全体の位置づけ オペレーションシステム(Linux) ソケットプログラミング プロセス カーネルとシステムコール プロセス間通信 スレッド クライアントーサーバ 非同期I/Oとマルチタスク
sleep()やパケット受信、キーボードからの入力処理 1.1 プロセス管理 プロセス管理 sleep()やパケット受信、キーボードからの入力処理 アドレス空間、ファイルの保護 複数のプロセスにCPUを割当る タイマと 割込み 保護 メカニズム プロセス間 通信 スケジューラ カーネル データ この授業の メインテーマ プロセステーブル パイプライン、シグナル、共有メモリ、メッセージ、セマフォ、スレッド、ソケット
1.2 システムコールと割込み システムコール時 割込み時 カーネルモードのプロセス実行 プロセスのスケジューリング ユーザモード 1.2 システムコールと割込み ユーザモード プロセス実行 システムコール時 システム関数の実行 ret_from_sys_call ペンディングのシグナル処理 ペンディングの割込処理 プロセスのスケジューリング 割込み時 IRQに対応するISRを実行 速い割込処理 処理中は他の割込みは無効 遅い割込処理 ret_from_sys_callを実行 割込処理番号 IRQ trap ISR システムコール 遅い 割込処理 システム関数を実行 速い 割込処理 ret_from_sys_call プロセスの実行を継続 プロセスの スケジューリング カーネルモードのプロセス実行
1.3 スケジューラと保護メカニズム スケジューラ 実行可能プロセスの中で最も優先度の高いプロセスにCPUを割当る。 時間 1.3 スケジューラと保護メカニズム 実行するプロセスがない場合に実行される 割込み処理ルーチン スケジューラ 実行可能プロセスの中で最も優先度の高いプロセスにCPUを割当る。 カーネル関数schedule() ret_from_sys_callコードの一部 保護メカニズム アドレス空間の分離 プロセスは他のプロセスのアドレス空間を読み書き出来ない。 ファイルの保護 各ファイルはユーザ(uid)、グループ(gid)を持ち、読出し、書込み、実行の権限が設定されている。 アイドル プロセス プロセス 1 プロセス 2 時間 カーネル ISR CPU時間 スケジューリング コマンドls –lで確認出来る CPUが実行するプログラム
1.4 プロセステーブル プロセステーブル プロセステーブル プロセスid1,2,3,… state state プロセス記述子の生成 1.4 プロセステーブル プロセステーブル プロセス記述子(task_struct構造体)の集合。 プロセス毎に記述子を持つ。 プロセス状態に依存してリンクを持つ。 例えば、子は親のプロセス記述子を指す。 例えば、入出力完了待ちプロセスは割込み待ちリストに入る。 プロセス記述子の生成 親プロセスの記述子からコピーする。 子プロセス固有の値に修正する。例えば、pid、子、親、兄弟とのリンク、プロセス生成時刻等。 子の状態を実行可能状態にする。 プロセスid1,2,3,… ポインター変数 state nice tty fs files mm sig flag プロセス記述子 struct task_struct state nice tty fs files mm sig flag state nice tty fs files mm sig flag プロセスの状態 state Next_task pid fs files mm sig nice オープンファイル記述子 シグナル …. プロセステーブル
1.5 プロセス間通信(IPC)と同期 セマフォによる同期 プロセス間通信(IPC) プロセス間でハードウェア資源を同時にアクセスするのを避ける。 並列処理実行時の同期を取る。 プロセス間通信(IPC) シグナル 非同期に信号を送る。 パイプライン 循環バッファを使い、プロセス間でデータを移動する。 共有メモリ カーネル内のメモリブロックをプロセス間で共有する。 ソケット ソケットを使って、ネットワークを介して情報の読書きを行う。 プロセス A プロセス B プロセス C プロセス間通信 同期 シグナル パイプライン 共有メモリ ソケット カーネル スレッドも学びます ファイル
2.ファイルシステム 2.1 ディスク中のファイルシステム 2.ファイルシステム 2.1 ディスク中のファイルシステム パーティション ハードディスクは幾つかのパーティションに分れている。 ファイルシステムはパーティション毎にある。 マウント Linuxが起動されると各パーティションはマウントされ、統一されたファイルシステムが出来る。 パーティション2にあるhw.cの絶対パス名は/home/oida/hw.cである。 ネットワーク上のディスクをマウントする場合もある(NFS)。 マウント情報はコマンド(df)とファイル(/etc/fstab)で確認出来る。 パーティション0 / bin home usr パーティション2 パーティション3 / / oida ito bin hw.c マウント 統一された ファイルシステム / bin home usr oida ito bin hw.c
カーネルのキャッシュ情報とディスクの情報を一致させる 2.2 パーティションの情報を得る 読み取り専用文字列へのポインタ変数 ndf.c statfs スーパブロックの情報を取出す #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/vfs.h> int main(int argc, char *argv[]) { struct statfs buf[1]; sync(); if (statfs(argv[1], buf)<0) { fprintf(stderr, “Cannot read super block!\n”); exit(EXIT_FAILURE); } fprintf(stderr,”%4.1f %% free\n”, 100.0*buf[0].f_bfree/buf[0].f_blocks); return EXIT_SUCCESS; インクルードファイル #include <sys/vfs.h> 書式 int statfs(const char *path, struct statfs *buf); 戻値 成功時 0 失敗時 -1 パーティション全体の情報 statfs構造体 ファイルシステム の種類 カーネルのキャッシュ情報とディスクの情報を一致させる f_type ブート ブロック スーパ ブロック f_bsize ブロックサイズ グループ ディスクリプタ パーティ ション0 ブロック グループ 0 f_blocks 全ブロック数 データブロック ビットマップ f_bfree 空ブロック数 ブロック グループ 1 f_bavail iノード ビットマップ f_files iノードの総数 iノード テーブル . f_ffree 空iノード数 データ ブロック f_fsid ブロック グループ N f_namelen f_spare[6] % ./ndf / 40.2 % free % パーティション”/”を引数で指定する。 sync スーパブロックを更新する インクルードファイル #include <unistd.h> 書式 void sync(void); 戻値 なし
宿題5 宿題:(ndf.cを参考にして)パーティションのブロックサイズ(f_bsize)を表示するプログラム(hw5.c)を作成せよ。 Linux上でmanコマンドを使って、f_bsizeの型を確認すること。例えば、出力する場合、 int型のフォーマットは、%d long型のフォーマットは、%ld 宿題:(ndf.cを参考にして)パーティションのブロックサイズ(f_bsize)を表示するプログラム(hw5.c)を作成せよ。 ブロックサイズを表示するパーティションは以下の2つ。 / /boot レポート内容 表紙に氏名と学籍番号を書く。 本文にプログラムを書く。 プログラムの実行結果を書く。 実施した内容を説明する文章を書く レポートの締切は次の週の水曜日18:00 hw5.c #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/vfs.h> int main(int argc,char *argv[]) { struct statfs buf[1]; sync(); if (statfs(argv[1],buf)<0) { fprintf(stderr,"Cannot read super block!\n"); exit(EXIT_FAILURE); } return EXIT_SUCCESS; ここに、ブロックサイズを出力 する命令を1行書いて下さい。