2012-11-21 4 views
13

POSIX XSH 2.8.4 Process Schedulingは、スレッドとプロセスのスケジューリング属性の動作を定義します。 sched_*インターフェイスは、スレッドではなくプロセスのスケジューリングプロパティに影響するように指定されています。これは、次の通路で明らかにされている:POSIXとLinux/glibc sched_ *関数の不一致を理解する

POSIXモデルは、プロセッサ(単数または複数)上のオペレーティング・システムによってスケジューリングされてもよい1つ以上のスレッドを含むシステム・リソースの集合としての「プロセス」を扱い、それが制御します。プロセスには独自のスケジューリング属性のセットがありますが、以下に説明するように、個々のスレッドのスケジューリング動作に間接的な影響があります(存在する場合)。

システムのスケジューリング競合範囲とスレッドの場合、プロセススケジューリング属性は、スレッドまたはそのスレッド専用の基盤となるカーネルのスケジューリング実体のいずれかのスケジューリング属性や行動に影響を与えないものとします。

本の私の読書は、「システムのスケジューリング競合範囲が」サポートされているシステム(Linuxでは/ glibcのは、このようなシステム)上で、sched_*機能は全く観察可能な効果を持つべきではない、ということです。

これは、Linux/glibcの現在の動作の現実に反して、sched_*が特定のスレッドのスケジューリング属性を設定しています。

別に良く、一般的にこのような状況を理解したいから、私はこれらの重要な質問があると思います:

  1. は、この矛盾の理論的根拠の任意のドキュメントはありますか?

  2. 標準の読みは正しいですか?特に、sched_setparamsched_setschedulerは、シングルスレッドアプリケーション(メインスレッドがデフォルトスケジューリングポリシーを使用していて変更できない、システム競合スコープを使用している)で効果がないことが指定されています。

  3. 標準のsched_*関数の有用性は何ですか?ほとんどの実装には何の影響も及ぼさず、プロセスの競合範囲をサポートする実装でさえも最小限の効果があります。誰かが彼らの意図された使用法を記述できますか?

+2

これがStackOverflowでない場合は、ここで炎戦が始まります。 – ssice

答えて

0

sched_setparamなどのLinuxでの動作のための理論的根拠は、スレッドがclone(2)システムコール、参照によって作成された実際のプロセスであるということですglibc/nptl/sysdeps/pthread/createthread.c

+2

「スレッドは実際にプロセスです」というのは、実際には真ではない古い言い分です。プロセスとは、カーネルが「スレッドグループ」と呼ぶもので、スレッドとはかなり異なっています。しかし、あなたが言っていることは、これらのインターフェースが追加された時点ではおそらくまだ「真実」だったでしょう。間違ったことをする理由は、既存のアプリケーションの使用にすぎないかもしれません。しかし、NPTLがLinuxThreadsの間違ったセマンティクスのほとんどを修正したので、この問題は修正されていないと奇妙に思えます... –

+0

OK、その言葉は、 LinuxThreads時代まで。とにかく、カーネルのスケジュール可能なエンティティとは別個の「単一スレッドを持つスレッドグループ」がなく、 'fork'と' pthread_create'の両方がカーネル内の同じ 'do_fork'関数に到達します。これは同じ' struct task_struct '。 – chill

+1

Linuxのプロセス(スレッドグループ)のスケジュール設定プロパティはないと私は同意します。だからこそ、NPTLは、プロセススケジューリングの競合範囲(POSIXはオプションです)を省略しています。私が得られないのは、これらの関数が1つのスレッドのスケジューリングプロパティを変更していて、それらがnearまたはcompleteのno-opsとして指定されているように見える理由です。 –

1

私は、NPTLが実装される前からこの方法があり、誰もスレッドグループ全体のスケジューリング属性のサポートをカーネルに提供していないので、これらの機能は今でもやっていることをやっていると思います。

あなたが指摘したように、POSIXがそれらを指定する方法は、プロセスの競合範囲&hellipなしでは本当に役に立たないからです。

関連する問題