X.orgソフトウェアの一部はマルチスレッドで構成されていますか?

X.orgソフトウェアの一部はマルチスレッドで構成されていますか?

私が知る限り、すべてのコマンドラインシェルはマルチスレッドではありません。特に、「タスク制御」(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

私が理解したところによれば、X11自体はマルチスレッドクライアントを防止せず、単にXlibに削除できない競争条件があるということです。私は出身ですXCB、経験上よくわかりません。XCBマルチスレッドクライアントで使用するように設計されたXlibレイヤライブラリです。したがって、X11クライアントはイベントベースの、ほぼリアルタイムプログラムで作成される傾向があるようです。スレッドクライアントを実行しない理由はありません。

答え4

これは質問に対する直接的な答えではありませんが、内容を明確にし、説明が長すぎると思います。

私の考えでは、UNIXスレッドをプロセス()と比較しないでくださいfork()。この質問は、スレッドが何らかの方法でプロセスを置き換えることを示しているように見えますが、そうではありません。それらはすべて独自の長所と短所を持っており、どちらを使用するかを決定することは最終的にプログラマーの役割です。再構成も同じだ。

スレッドを使用することに利点がある場合は、基本ツールが再実装されるか、少なくともそれにフォークがあります。

個人的には、私はマルチプロセッシングがシェリングのような仕事に良い選択だと思います。なぜなら、シェルがたくさん保護されているからです。開始されるプロセスは狂ってしまうかもしれませんが、シェルをクラッシュさせません。

一方、シグナルはすべてのスレッドに渡されるため、スレッドシェルはユーティリティスレッドによって意図または生成された信号を受け入れると同時にユーティリティスレッドに必要になる可能性があるため、これらのシグナルを転送できる必要があります。

要約すると、マルチプロセッシングを使用すると、シェルとシェルが開始するプロセスをよりよく分離でき、シェルによって開始されたプロセスに信号をより自由に得ることができ、おそらく私が考えることができない他の多くがあるでしょう。

関連情報