私が知る限り、すべてのコマンドラインシェルはマルチスレッドではありません。特に、「タスク制御」(Control-Z bg
、、など)をサポートするシェルもfg
機能(たとえばfork
、信号、パイプ、PTY)を介してexec
これを行います。糸。
Emacsは「同時に多くのことを行う」ことができますが、マルチスレッドではありません。 (再び、外部プログラムをたくさんフォークして実行し、信号、パイプ、PTYを使用してこれらの外部プログラムと通信します。)
私の質問は、X11プロトコル(X.org)の基本的な実装がサーバーまたはクライアントライブラリのUnixスレッドを使用することです。
それでは、おおよそいつから(またはその祖先であるXFree86またはXFree86の祖先)この仕事を始めましたか?
答え1
$ ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 1 0 1 0 1 19:25 ? 00:00:00 init [4]
...
root 1699 1 1699 0 1 19:25 ? 00:00:00 /usr/bin/kdm
root 1701 1699 1701 8 2 19:25 tty10 00:13:10 /usr/bin/X :1 vt10 ...
root 1701 1699 1703 0 2 19:25 tty10 00:00:00 /usr/bin/X :1 vt10 ...
root 1706 1699 1706 0 1 19:25 ? 00:00:00 -:1
root 1707 1699 1707 0 2 19:25 tty9 00:00:02 /usr/bin/X :0 vt9 ...
root 1707 1699 1710 0 2 19:25 tty9 00:00:00 /usr/bin/X :0 vt9 ...
root 1713 1699 1713 0 1 19:25 ? 00:00:00 -:0
....
私はそれがあなたの質問に答えると思います。
それでも問題はいくつかを一緒に混ぜるようです。マルチスレッドはfork()
/を使用しませんexec()
。スレッドは同じアドレス空間を共有するので、異なるプロセスを実行したい場合は、同じアドレス空間にアクセスしたくないでしょう。外部プログラム(特に言及したシェル)を使用しないことにした場合は、すべての機能を再コーディングする必要があります。
マルチスレッドはすべての問題を解決するわけではありません。実際、これは主に並列性の問題のみを解決します。確認ウィキページ良い簡単な概要です。プログラムをマルチスレッドにしてもそれは良くなるわけではなく、ほとんどの場合、同期コード(存在する場合)のバグによって状態が悪くなります。
答え2
ES Raymondの本では、著者は次のように引用します。
Xサーバーは毎秒数百万のタスクを実行できますが、ポーリング/選択ループは使用しません。マルチスレッド実装のためのさまざまな努力は良い結果を得ませんでした。グラフィックサーバーのようにパフォーマンスに敏感なサーバーの場合、ロックとロック解除のコストが高すぎます。 ——ジムゲティス
答え3
答え4
これは質問に対する直接的な答えではありませんが、内容を明確にし、説明が長すぎると思います。
私の考えでは、UNIXスレッドをプロセス()と比較しないでくださいfork()
。この質問は、スレッドが何らかの方法でプロセスを置き換えることを示しているように見えますが、そうではありません。それらはすべて独自の長所と短所を持っており、どちらを使用するかを決定することは最終的にプログラマーの役割です。再構成も同じだ。
スレッドを使用することに利点がある場合は、基本ツールが再実装されるか、少なくともそれにフォークがあります。
個人的には、私はマルチプロセッシングがシェリングのような仕事に良い選択だと思います。なぜなら、シェルがたくさん保護されているからです。開始されるプロセスは狂ってしまうかもしれませんが、シェルをクラッシュさせません。
一方、シグナルはすべてのスレッドに渡されるため、スレッドシェルはユーティリティスレッドによって意図または生成された信号を受け入れると同時にユーティリティスレッドに必要になる可能性があるため、これらのシグナルを転送できる必要があります。
要約すると、マルチプロセッシングを使用すると、シェルとシェルが開始するプロセスをよりよく分離でき、シェルによって開始されたプロセスに信号をより自由に得ることができ、おそらく私が考えることができない他の多くがあるでしょう。