タグ付けされた質問 「thread」


7
スレッドはLinuxのプロセスとして実装されていますか?
私は通過つもりだこの本マーク・ミッチェル、ジェフリー・オールダム、そしてアレックス・サミュエルことにより、高度なLinuxのプログラミング。2001年からですので、少し古いです。しかし、とにかくかなり良いと思います。 しかし、シェル出力でLinuxが生成するものとは異なる点に到達しました。92ページ(ビューアでは116ページ)の4.5 GNU / Linuxスレッド実装の章は、次の文を含む段落から始まります。 GNU / LinuxでのPOSIXスレッドの実装は、他の多くのUNIX系システムでのスレッド実装とは重要な点で異なります。GNU/ Linuxでは、スレッドはプロセスとして実装されます。 これは重要なポイントのようで、後でCコードで説明します。本の出力は次のとおりです。 main thread pid is 14608 child thread pid is 14610 そして、私のUbuntu 16.04では: main thread pid is 3615 child thread pid is 3615 ps 出力はこれをサポートします。 2001年から現在までに何かが変わったに違いないと思います。 次のページの次のサブセクション4.5.1シグナル処理は、前のステートメントに基づいています。 シグナルとスレッド間の相互作用の動作は、UNIXに似たシステムごとに異なります。GNU / Linuxでは、スレッドはプロセスとして実装されるという事実によって動作が決定されます。 そして、これはこの本の後半でさらに重要になるようです。誰かがここで何が起こっているのか説明できますか? 私はこれを見ましたLinuxカーネルスレッドは本当にカーネルプロセスですか?、しかしそれはあまり役に立ちません。よくわかりません。 これはCコードです: #include <pthread.h> #include <stdio.h> #include <unistd.h> void* thread_function …

3
4.3カーネルで「リソースが一時的に利用不可」でスレッドの作成が失敗する
いくつかのコンテナでArch Linux(カーネル4.3.3-2)でdockerサーバーを実行しています。前回の再起動以来、ドッカーサーバーとコンテナ内のランダムプログラムの両方がクラッシュし、スレッドを作成できない、または(あまり頻繁ではありませんが)フォークするというメッセージが表示されます。特定のエラーメッセージはプログラムによって異なりますが、それらのほとんどは特定のエラーに言及しているようですResource temporarily unavailable。エラーメッセージの例については、この投稿の最後をご覧ください。 今、このエラーメッセージを受け取った人がたくさんいますし、彼らへの応答もたくさんあります。本当にイライラするのは、誰もが問題を解決する方法を推測しているように見えることですが、問題の多くの考えられる原因のどれが存在するかを特定する方法を誰も指摘していないようです。 エラーの考えられる5つの原因と、それらがシステムに存在しないことを確認する方法を収集しました。 /proc/sys/kernel/threads-max(source)で設定されるスレッドの数にはシステム全体の制限があります。私の場合、これはに設定されてい60613ます。 すべてのスレッドはスタック内のスペースを使用します。スタックサイズの制限はulimit -s(source)を使用して構成されます。私のシェルの制限があることに使用される8192が、私は置くことによって、それが増加している* soft stack 32768に/etc/security/limits.confので、ulimit -s今戻ります32768。私も入れてドッキングウィンドウのプロセスのためにそれを増加しているLimitSTACK=33554432に/etc/systemd/system/docker.service(ソース、と私は限界が覗くことで適用されていることを確認/proc/<pid of docker>/limitsし、実行することにより、ulimit -sドッキングウィンドウコンテナ内。 すべてのスレッドはいくらかのメモリを消費します。仮想メモリの制限は、を使用して構成されますulimit -v。私のシステムではに設定されてunlimitedおり、3 GBのメモリの80%が無料です。 を使用するプロセスの数には制限がありますulimit -u。この場合、スレッドはプロセスとしてカウントされます(source)。私のシステムでは、制限はに設定されて30306おり、Dockerデーモンおよび内部のdockerコンテナの場合、制限は1048576です。現在実行中のスレッドの数は、実行ls -1d /proc/*/task/* | wc -lまたは実行ps -elfT | wc -l(source)によって確認できます。私のシステムでは、それらはとの間に700あり800ます。 開いているファイルの数には制限があります。一部のソースによると、これはスレッドを作成するときにも関係します。制限はを使用して設定されますulimit -n。私のシステムと内部ドッカーでは、制限がに設定されてい1048576ます。開いているファイルの数はlsof | wc -l(source)を使用して調べることができます30000。私のシステムでは約です。 最後のリブート前にカーネル4.2.5-1を実行していたように見えますが、現在は4.3.3-2を実行しています。4.2.5-1にダウングレードすると、すべての問題が修正されます。この問題に言及している他の投稿はthisとthisです。Arch Linuxのバグレポートを開きました。 これを引き起こしている可能性のあるカーネルの変更点は何ですか? エラーメッセージの例を次に示します。 Crash dump was written to: erl_crash.dump Failed to create aux thread …
39 linux  docker  limit  fork  thread 

5
Linux上の1つのプロセスのすべてのスレッド(および子)を放棄する方法は?
Linuxは(まだ)POSIX.1標準に従っていないと言うことreniceに従っているため、プロセス上は、「プロセス内のすべてのシステム・スコープ・スレッド」に影響をpthreadsの(7)DOC「のスレッドが共通の素敵な値を共有しません」。 ただし、renice特定のプロセスに関連する「すべて」が便利な場合もあります(1つの例は、Apacheの子プロセスとそのすべてのスレッドです)。そう、 特定のプロセスに属するreniceすべてのスレッドをどのようにすればよいですか? 特定のプロセスに属するreniceすべての子プロセスはどうすればよいですか? 私はかなり簡単な解決策を探しています。 私はことを知っているプロセスグループは、時には役に立つことができ、しかし、彼らはいつも私が何をしたいのか一致しません:彼らはプロセスのより広範または異なるセットを含めることができます。 cgroupマネージドを使用することsystemdも役立つかもしれませんが、それについて聞いてみたいと思っても、ほとんどの場合「標準」ソリューションを探しています。 編集:また、man (7) pthreads「プロセス内のすべてのスレッドは同じスレッドグループに配置されます。スレッドグループのすべてのメンバーは同じPIDを共有します」。それで、それreniceがそれ自身のPIDを持っていない何かにさえ可能ですか?
22 linux  process  nice  thread 

3
Linuxは子プロセスとは別にスレッドにどのように通知しますか?
Linuxは実際にはプロセスとスレッドを区別せず、両方をデータ構造として実装しますtask_struct。 Linuxは、子プロセスからプロセスのスレッドを伝えるために、いくつかのプログラムに何を提供しますか?たとえば、Linuxでプロセスが持つすべてのスレッドの詳細を表示する方法はありますか? ありがとう。
21 linux  process  thread 

3
Linuxカーネルスレッドは本当にカーネルプロセスですか?
LinuxはJava VMのユーザースレッドごとにカーネルスレッドを作成することを多くの場所で読みました。(「カーネルスレッド」という用語は、2つの異なる方法で使用されています。 コアOS作業を行うために作成されたスレッド OSが認識し、ユーザーの作業を実行するようにスケジュールするスレッド。 私は後者のタイプについて話している。) Linuxプロセスは親と子の間の共有メモリ空間をサポートしているため、カーネルスレッドはカーネルプロセスと同じですか、それとも本当に異なるエンティティですか?


1
Unixのプロセス、カーネルスレッド、軽量プロセス、ユーザースレッドの関係は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店。 VahaliaのUnix Internalには、プロセス、カーネルスレッド、軽量プロセス、ユーザースレッドの関係を示す図があります。この本はSVR4.2に最も注意を向けており、4.4BSD、Solaris 2.x、Mach、およびDigital UNIXについても詳しく探っています。Linuxについては聞いていないことに注意してください。 プロセスごとに、プロセスの基礎となる1つ以上の軽量プロセスが常にありますか?図3.4はイエスと言っているようです。 なぜ図3.5(a)は、CPUの上に直接プロセスを表示し、その間に軽量プロセスを表示しないのですか? 軽量プロセスごとに、軽量プロセスの基礎となるカーネルスレッドは常に1つだけですか?図3.4はイエスと言っているようです。 図3.5(b)は、カーネルスレッドを介さずにプロセスの上に軽量プロセスを直接表示するのはなぜですか? カーネルスレッドだけがスケジュール可能なエンティティですか? 軽量プロセスは、基になるカーネルスレッドをスケジュールすることによって間接的にのみスケジュールされますか? プロセスは、基礎となる軽量プロセスのスケジューリングを介して間接的にのみスケジューリングされますか? 更新: Linuxについても同様の質問をしました。Linux のカーネルスレッドに軽量プロセスが接続されていますか? 「オペレーティングシステムの概念」という本が暗黙的にUnixを使用する概念を紹介し、UnixとLinuxが異なる可能性があるため、Unixカーネルについて読んだためだと思います。 現在の返信に感謝していますが、他の返信を受け入れることができるように、投稿を再開することを望んでいます。

5
スレッドと(フォークされた)プロセス
Linuxアプリケーションは一般にforkしてからexecve()でexecしますが、Javaアプリケーションと特定のApache MPMはスレッドを使用します。フォークする場合、fork + execを使用してプロセスを生成します。スレッド化の高レベルバージョンは何ですか?JVMまたはワーカーMPMはどのようにしてスレッドを生成しますか?
9 process  fork  thread 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.