プロセス記述とプロセスを作成します。
1.プロセスの説明
1.1オペレーティングシステム、三の大管理機能と対応する抽象的概念:
- プロセス管理
- メモリ管理
- ファイルシステムの
状態1.2Linuxプロセス:
(1)工程でのLinuxの状態が7に分けることができます。 - R動作状態(runingて):必ずしもプロセスが実行されている、あなたはまた、キューを実行できることを意味するものではありません。
- Sスリープ(睡眠):イベントの完了を待つ処理;(光睡眠、あなたが目を覚ますことができます)
- Dスリープ状態のディスク(ディスクスリープ):無停電睡眠(深い眠り、目覚めていない、ディスクへの書き込みは通常発生します)
- Tは、(停止)状態を停止:あなたがプロセスにシグナルSIGSTOPを送ることによって、プロセスを停止することができ、それが実行を継続するためのプロセスのための信号を送信することができますSIGCONT
- X死んだ状態(デッド):この状態は、タスクリストに表示状態のリターン、ではありません。
- Zゾンビ(ゾンビ):子プロセスが終了すると、親プロセスがまだ実行されているが、親はゾンビ状態に入るように、子プロセスを子プロセスの終了ステータスを読んでいません。
- T状態(STOPをtrancing)トラッキング停止
Linuxで(2)、プロセス三つの主要な状態。 - レディ状態
- Runnableを
- 状態ブロックする
外部条件に応じて、各状態のは、スイッチしていきます。プロセスの開始が呼び出されたとき、実行はまた、これらの2つの状態フラグとtask_runing使用していたTASK_RUNNINGと呼ばれる実行している状態は、実行していると解釈することができると呼ばれ、タイムスライスかどうかを確認するために実行TASK_RUNNINGと呼ばれる、レディ状態と呼ばれる作成しますその他の情報。プロセスがゾンビ状態に終了した場合、それが最終的に回収しました。あなたが何かを待っていればブロッキングステートに移行します。あなたが目を覚ます場合はレディ状態を再入力してください。
作成2.プロセス
三つの機能の合計を作成するプロセスで2.1Linux。
- フォーク、子プロセスを作成します。
- vfork、フォークと似ていますが、親と子の共有アドレススペース、および子プロセスは親プロセスを実行します。
- クローンは、主にスレッドを作成するために使用します。
注意:すべてのプロセスが作成されるLinuxは、LinuxはフォークをDO_呼び出すことで実現し、コピーする親プロセスベースのアプローチをコピーして新しいプロセスを作成します。そして、子プロセスは、いくつかの特別な処理を行います。Linuxでのスレッドでなく、特殊なプロセス。解析コード、コピー_調製工程、でDO_フォーク、チューブを実行しているプロセス、子プロセスをfork wake_ up_ new_master_ hostは、タスクが完了とによります。フォーク()関数は、最大の特徴は、返された二回、一回呼ばれています。
2.2 do_fork処理内容:
- 子プロセスに現在のプロセスをコピーし、copy_processを呼び出し、子プロセスとそれに対応するコンテキスト情報を設定します。
- 場合のvfork呼び出し、初期化処理情報のvforkの完了
- 子プロセスが実行されるように、スケジューリングプロセスを選択することができ、その場合、スケジューラキューへwake_up_new_task、子プロセスを呼び出します。
- vfork呼び出した場合は、子プロセスのexecするまで親プロセスをブロックする必要があります。
一般的なプロセスcopy_process 2.3:
- 各種フラグをチェック
- 子プロセスの記述子として、dup_task_structコピーtask_struct構造を呼び出します。
- プロセスの制限数を確認してください。
- タイマー、信号やスピンロックを初期化します。
- 状態は子プロセスを設定初期化およびスケジューリングに関連するデータ構造、と呼ばれるsched_forkは、TASK_RUNNINGです。
- そうでFS、信号処理機能、信号、(コピー・オン・ライトを含む)メモリを含むコピーすべてのプロセス情報、。
- 今度は重要なステップであるcopy_threadを呼び出して、ここでは、スタック情報サブプロセスを設定します。
- 子プロセスのPIDを割り当て
- その上で他のプロセスと子の関係を設定するだけでなく、PID、TGIDと。ここではいくつかの主要な区別を行うためのスレッドです。
- でcopy_processでは、copy_thread関数は、子プロセスのコンテキストスタック情報を作成します
次のように2.4 copy_threadプロセスは次のとおりです。
- 子の格納位置情報を取得することはレジスタを処理します
- 子プロセスのthread.sp割り当て、将来的に実行した子プロセスが、これは子プロセスのESPレジスタの値です。
- あなたがカーネルスレッドを作成している場合は、その動作位置は、他のレジスタ情報を表示して終了を準備した後、thread.ipするために割り当てられたアドレスコードをret_from_kernel_threadされます
- 子供に親のレジスタ情報をコピーします。
- 0サブプロセスに設定され、EAXレジスタの値は、フォークにおける呼サブプロセスは0を返します。
Ret_from_forkの子プロセスが実行を開始する、それはEIPレジスタの未来であるの割り当てられたthread.ipを、対応しています。
ウェブテスト
1.前のメニューを削除し、新しいgitのクローンを通じて、上書きMV test.cのを使用して、rooftsを作る実行します。
cd LinuxKernel
rm -rf menu
git clone http://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c
2. rootfsのを作るのですか、あなたはリストの使用は、フォークを高める見ることができます。
make rootfs
MenuOS>>help
3.水平分割シェルは、新しいウィンドウを開くGDBを起動し、カーネルをロード、リモート1234ターゲットに接続します
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
4. bはsys_cloneに関する、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_forkの代わりに各セットブレークポイントです。
(gdb)b sys_clone
(gdb)b do_fork
(gdb)b dup_task_struct
(gdb)b copy_process
(gdb)b copy_thread
(gdb)b ret_from_fork
5. Cが停止位置をdo_forkし、コマンドnを使用する、継続します
(gdb)c
(gdb)n
6. copy_processに()関数が続け。
7.はcopy_threadを破るために続けcは
概要
:今週のコースを研究することによって、私は次のように理解
古いプログラム(現在のプロセス)をクローニングによって確立された新しいプロセスを。
fork()とクローン()(スレッドの)システムでは、新しいプロセスコールを作成するために使用することができます。
使用される新しいプロセスをスタックする物理ページを割り当てながら、これら2つのシステム・コールの終了時に、カーネルはシステムの物理メモリに新しいプロセスのための新しいtask_struct構造を割り当てます。
Linuxは、新しいプロセスのための新しいプロセス識別子が割り当てられます。
その後、新しいtask_struct構造体のアドレスをリストに格納されており、古いプロセス構造のtask_structの内容は、新しいプロセスのtask_struct構造体にコピーされます。