オペレーティングシステム ( プロセス管理 )

21
オオオオオオオオオオオオ オオオオオオオオオオオオ ( ( オオオオオオ オオオオオオ ) ) 2006 2006 10 10 16 16 オオオオオオ( ( [email protected] [email protected] ) ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2006/ http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2006/

description

オペレーティングシステム ( プロセス管理 ). 2006 年 10 月 16 日 酒居敬一 ( [email protected] ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2006/. プロセスの生成と実行 (30 ページ ). プロセスの生成 プログラムをコンパイルし実行可状態に置く 実行可能形式ファイルをロードする spawn 現在実行中のプログラムを複製する fork, rfork, clone, … 新しいプログラムは exec でオーバーレイする - PowerPoint PPT Presentation

Transcript of オペレーティングシステム ( プロセス管理 )

オペレーティングシステムオペレーティングシステム(( プロセス管理プロセス管理 ))

20062006 年年 1010 月月 1616 日日酒居敬一酒居敬一 (([email protected]@kochi-tech.ac.jp))

http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2006/http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/OS/2006/

プロセスの生成と実行プロセスの生成と実行 (30 ページ )

• プロセスの生成– プログラムをコンパイルし実行可状態に置く

• 実行可能形式ファイルをロードする• spawn

– 現在実行中のプログラムを複製する• fork, rfork, clone,…• 新しいプログラムは exec でオーバーレイする

• OS の成り立ちなどで異なる– Unix は、複製によりプロセスを生成する

[大久保英嗣 , オペレーティングシステムの基礎 ]

プロセスの関係

生成されたプロセスはすべて同時に動く

static int init(void * unused){ lock_kernel(); /* * Tell the world that we're going to be the grim * reaper of innocent orphaned children. * * We don't want people to have to make incorrect * assumptions about where in the task array this * can be found. */ child_reaper = current;

/* Sets up cpus_possible() */ smp_prepare_cpus(max_cpus); do_pre_smp_initcalls(); smp_init(); do_basic_setup(); prepare_namespace(); /* * Ok, we have completed the initial bootup, and * we're essentially up and running. Get rid of the * initmem segments and start the user-mode stuff.. */ free_initmem(); unlock_kernel(); system_running = 1; if (open("/dev/console", O_RDWR, 0) < 0) printk("Warning: unable to open an initial console.\n"); (void) dup(0); (void) dup(0);

/* * We try each of these until one succeeds. * * The Bourne shell can be used instead of init if we are * trying to recover a really broken machine. */ if (execute_command) run_init_process(execute_command); run_init_process("/sbin/init"); run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh"); panic("No init found. Try passing init= option to kernel.");}

起動シーケンスの最終段起動シーケンスの最終段階階

プロセスに対して行われる各種の基本操作プロセスに対して行われる各種の基本操作

•生成 (spawn)や複製 (fork)– タスク管理領域を生成するか複製するか

•消滅– タスク管理領域を親のタスクが消す

•消えるまでの間が消滅中状態 (ゾンビ )

•シグナル送信– 終了– 停止

•同期

[大久保英嗣 , オペレーティングシステムの基礎 ]

プロセスに対する操作( forkによる生成)

プロセス間通信(32ページ)プロセス間通信(32ページ)• パイプ(93ページ)

– カーネルが作り出した仮想的な通信路• ソケット(107ページ)

– パイプの通信範囲を計算機間にまで広げたもの• 共有メモリ (Shared Memory)

– 仮想記憶のところで説明します• 擬似端末 (Pseudo TTY)

– デバイスドライバにより作られた仮想的な端末

プロセスの同期プロセスの同期• パイプを使う方法

– mkfifo コマンドで名前つきパイプを作る– 一方を cat コマンドで読み取りとして、– もう一方を cat コマンドで書き込みとする。

% mknod named_pipe% cat named_pipeaabbccdd%

% cat > named_pipeaabbccdd^D%

プロセスの同期(36ページ)プロセスの同期(36ページ)• 並列処理には必要不可欠である• 同期のための仕組みがある

– セマフォ• SYS V IPC(Inter-Process Communication)

– ロック• POSIX Thread

– モニタ• Java が採用

並行プロセス間で生じる問題並行プロセス間で生じる問題逐次的資源

たとえば、 Read-modify-write のような、 一連の操作を Atomicに行う必要のある資源。

このような逐次的資源が共有されるとき、Atomicに操作できるような機構が必要となる。

もし、そういう機構がなければプログラムが意図したとおりに動かない。

処理の粒度処理の粒度

•マルチジョブ– レコードの排他的利用– トランザクションを不可分な処理単位とする

•マルチタスク– メモリ上の共有領域の排他的利用– 共有領域を使用するプログラムを排他的に実行

•マルチ CPU– メモリ上の変数の排他的利用– プロセッサのバスサイクルを連続する

[大久保英嗣 , オペレーティングシステムの基礎 ]

c1や c2は、自プロセスが他プロセスに、臨界領域に入ることを知らせるための変数。

先に臨界領域に入ることを宣言したプロセスが実際に臨界領域に入る。

両方が臨界領域に入ろうとしたとき、turn変数により一方が譲る。

臨界領域に入っているとき、c1か c2の一方だけが trueである。

相互排除相互排除• TAS命令(計算機アーキテクチャの授業で既出)– もっとも原始的なロックの実装 (primitive)。– 2値セマフォを実現する。

•セマフォ– P操作(ロック)と V操作(アンロック)により実現。

– 再帰的ロックとも呼ばれる。•モニタ( Java言語で使われている)

– 共有資源とそれを操作する手続きを一体化。– セマフォのわかりにくさを、構造化により解消。– 構造化セマフォと呼ばれることもある。

TASTAS 命令命令

• メモリ上の変数をテストする処理、メモリ上の変数に値をセットする処理、これらを順に他の処理をはさむことなく (=Atomic) 行う。

• テストとは、 0 かそうでないかを調べてフラグに結果を反映する処理

• Intel 系では lock xchg 命令で代用する。– バスサイクルを lock (不可分かつ連続)して処理

• バイナリセマフォ、2値セマフォ、を実現する。

変形セマフォ変形セマフォ•セマフォ変数

– 正の値は利用可能な資源の数– 負の値は現在待ちに入っているプロセスの数

• P操作– セマフォの値を atomicに1減らしテストする

•テスト結果が負になったときは、待ち状態に入る• V操作

– セマフォの値を atomicにテストし1増やす•テスト結果が負のときは、待ち状態にあるプロセスをひとつ動作可能状態にする

相互排除とデッドロック相互排除とデッドロック

•競合を避けるため相互排除機構を持っている。– これが時に問題を起こす。

スレッド1

資源 Aを獲得資源 Bを獲得したい!

スレッド2

資源 Bを獲得資源 Aを獲得したい!

2つのスレッドが資源 Aと資源 Bを同時にとりたいとき    資源が2つそろうまでは返さないぞ、というアルゴリズムだと…

デッドロックの発生条件と防止デッドロックの発生条件と防止 逐次的資源に関する相互排除条件 待ち条件

資源要求は同時に行う 横取り不可条件

資源を同時に確保できない場合、解放し再度要求 循環待ち条件

資源を順序だてて取得する

プロセス P1 プロセス P2

2つのプロセスが資源 R1と資源 R2を同時にとりたいとき  資源が2つそろうまでは返さないぞ、というアルゴリズムだと…

資源 R1を獲得

資源 R2を獲得したい!

資源 R2を獲得

資源 R1を獲得したい!

Deadlock!

例:相互排除例:相互排除• /usr/src/linux/drivers/char/lp.c

• Atomic 処理• スピンロック• カーネルロック ( 全域的ロック )• mutex やセマフォ ( 局所的ロック )

例:相互排除の実装例:相互排除の実装• Atomic 処理

– /usr/src/linux/include/asm/atomic.h• スピンロック

– /usr/src/linux/include/asm/lock.h• カーネルロック ( 全域的ロック )

– /usr/src/linux/include/asm/smplock.h• mutex やセマフォ ( 局所的ロック )

– /usr/src/linux/include/asm/semaphore.h

プロセスとスレッドプロセスとスレッド (38(38 ページページ ))

•どちらも実行のひとつの単位である– そういう意味では「タスク」とひとくくりに扱う。

•スレッドはプロセスに属する点が異なる•同じプロセスに属す限り、資源は共有しあう•軽量プロセス=スレッドという定義もある。

• CPUが複数個存在する場合に、同じプロセスの複数のスレッドが実行できる。– 高速処理や効率的な処理には良いが…– 資源の競合が起きるかもしれない…

[大久保英嗣 , オペレーティングシステムの基礎 ]