Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> Linuxシステムの呼び出しfork()関数メソッド

Linuxシステムの呼び出しfork()関数メソッド

  

fork()関数はfork関数です。既存のプロセスは新しいプロセスを作成するためにfork()関数を呼び出すことができます。その後、Linuxでfork()関数を呼び出す方法は? ?それともLinuxでfork()関数を実装するにはどうすればいいですか? Xiaobianと一緒に来てください。

1.直接ページ書き込みを使用しているとき.Linuxは、フォーク()コピー(コピー・オン・ライト)のすべてのリソースが達成新しく作成されたプロセスにコピーされた伝統的なフォーク()システムコール。コピーオンライトは、データのコピーを延期または排除することができる手法ですこの時点では、カーネルはプロセスアドレス空間全体をコピーするのではなく、親プロセスと子プロセスが同じコピーを共有できるようにします。

あなたが書く必要があるときだけ、データがコピーされるので、各プロセスはそれ自身のコピーを持ちます。つまり、リソースのコピーはそれが書かれる必要があるときにだけ行われます。読み取り専用として共有するだけです。この技法により、アドレス・スペース上のページのコピーは、実際の書き込みが行われるまで延期されます。ページが書き込まれていない場合(たとえば、exec()がfork()の直後に呼び出される)、それらをコピーする必要はありません。

2.linuxはシステム上でclone()を呼び出すことによってfork()を実装します。それからdo_fork()がclone()によって呼び出されます。

linuxでのfork()関数の実装:

Linuxはclone()システムコールを通してfork()を実装します。この呼び出しは、一連のパラメータフラグを使用して、親子プロセスが共有する必要があるリソースを指定します。 fork()、vfork()、および__clone()ライブラリー関数は、それぞれのパラメーター・フラグに従ってclone()を呼び出します。それからclone()からdo_fork()を呼び出します。

do_frokはほとんどの作業を作成時に行っています。これはker /frok.cファイルで定義されています。この関数はcopy_process()の関数を呼び出してからプロセスの実行を開始します。 copy_process()関数によって行われる作業は非常に興味深いものです:

1. dup_task_struct()を呼び出して新しいプロセス用のカーネルスタック、thread_info構造体、およびtask_structを作成しますこれらの値は現在のプロセスと同じです。この時点で、子プロセスと親プロセスの記述子は同じです。

2.新しく作成された子プロセスを確認した後、現在のユーザーが所有しているプロセス数が、割り当てられているリソースの上限を超えていません。

3.これで、子プロセスは自分自身を親プロセスと区別するようになりました。プロセス記述子の多くのメンバーは、クリアされるか、またはそれらの初期値に設定されます。プロセス記述子のメンバ値は継承されませんが、主に統計情報です。プロセス記述子のほとんどのデータは共有されています。

4.次に、子プロセスの状態をTASK_UNINTERRUPTIBLEに設定して、子プロセスが実行されないようにします。

5.copy_process()は、copy_flags()を呼び出して、task_structのflagsメンバーを更新します。プロセスがスーパーユーザー特権を持っているかどうかを示すPF_SUPERPRIVのフラグは、0にクリアされます。exec()関数のPF_FORKNOEXECフラグがプロセスによって設定されていないことを示します。

6. get_pid()を呼び出して、新しいプロセスの有効なPIDを取得します。

7. clone()に渡されるパラメータフラグに従って、copy_process()は開いているファイル、ファイルシステムの情報、シグナルハンドラ、プロセスのアドレス空間と名前空間をコピーまたは共有します。 1日の後半に、これらのリソースは特定のプロセスのすべてのスレッドによって共有されます;それ以外の場合、これらのリソースはプロセスごとに異なるため、ここにコピーされます。

8.親プロセスと子プロセスが残りのタイムスライスを分割するようにします。

9.最後に、copy_process()が仕上げ作業を行い、子プロセスへのポインタを返します。

do_fork()関数に戻り、copy_process()関数が正常に戻った場合は、新しく作成された子プロセスが起動されて動作状態になります。カーネルは意図的に最初に実行する子プロセスを選択します。子プロセスの半分がすぐにexec()関数を呼び出すので、コピーオンライトのオーバーヘッドが回避されます親プロセスが最初に実行されると、アドレススペースへの書き込みが開始される場合があります。

以上がLinuxでのfork()関数の呼び出し方法の紹介ですこの記事では、Linuxでのfork()関数の呼び出し方法の紹介に加えて、fork()関数の実装についても詳しく紹介しました。助けた。

Copyright © Windowsの知識 All Rights Reserved