Pthreadとフォークw.r.tの基本的な違いは何ですか。 Linuxの実装の違いとスケジューリングの違い(違いますか?)
私は2つの類似したプログラムでstraceを実行しました.1つはpthreadを使用し、もう1つはforkを使用して、最終的には異なる引数でclone()syscallを作成しますコードで。
誰かが深い説明をすることができますか?
編集:関連する 質問も参照してください
ただし、Cにはいくつかの違いがあります。
fork()
目的は、呼び出し元の子プロセスになる新しいプロセスを作成することです
どちらのプロセスも、fork()システムコールに続く次の命令を実行します
コンピューターのアドレス空間、コード、およびスタックの2つの同一のコピーが、親と子に1つ作成されます。
フォークを人のように考える。フォークすると、コピーしたコードを実行しているプログラム(プロセス)のクローンが作成されます。
pthread_create()
目的は、呼び出し元と同じプロセスが与えられるプログラムに新しいスレッドを作成することです
同じプロセス内のスレッドは、共有メモリを使用して通信できます。 (注意してください!)
2番目のスレッドは、データ、オープンファイル、シグナルハンドラーとシグナル処理、現在の作業ディレクトリ、ユーザーとグループIDを共有します。新しいスレッドは独自のスタック、スレッドID、および登録を取得します。
類推を続けます。プログラム(プロセス)は、同じ脳に接続された新しいスレッドを作成すると、2番目のアームを拡張します。
clone
のマンページをご覧ください。
特に、可能なすべてのクローンモードと、それらがプロセス/スレッド、仮想メモリ空間などにどのように影響するかをリストします...
あなたは「スレッドをコードで処理する方が簡単」と言います:それは非常に議論の余地があります。バグのない、デッドロックのないマルチスレッドコードを作成することは、非常に困難です。 2つの別個のプロセスがあると、物事がはるかに簡単になることがあります。
Linuxでは、システムコールclone
は、構成可能な共有レベルでタスクを複製します。 fork()
はclone(least sharing)
を呼び出し、pthread_create()
はclone(most sharing)
を呼び出します。テーブルをコピーしてメモリのCOWマッピングを作成するため、フォークはpthread_createingよりも少しコストがかかります。