以前のバージョンと互換性のある方法でCのRobotC APIを再実装しようとしています(一部の詳細はC ++に適しているか、C ++を使用する方が簡単です)。マルチスレッドAPIの再実装sched_get_priority_max(2)
移植可能な方法でおよびを使用してみましたsched_get_priority_min(2)
。ただし、優先順位は-20(最も高い優先順位)と19(低い優先順位)の間であり、他方では前のマニュアルページに次のようにnice(1)
指定されsched(7)
ています。
[...] 優先度の高いプロセスは、優先度の低いプロセスの前に予約されます。したがって、 sched_get_priority_max() が返す値は sched_get_priority_min() が返す値よりも大きくなります。
これはその逆を意味します。正の値は優先順位が高く、負の値は優先順位が低い(優先順位が1から99のリアルタイムポリシーの例も提供します)。
sched_get_priority_max
それでは何が返されますか_min
?何と一緒に使うべきですかpthread_attr_setschedparam(3)
?
カスタム優先順位の範囲を定義する3つの値があります。低優先順位(kLowPriority
、0に設定)、高優先順位(kHighPriority
、255に設定)、デフォルト優先順位(kDefaultPriority
、7に設定)。理想的には、デフォルト値が0のスケジューリングポリシーでは、kDefaultPriority
/ 7が0でなければならず、kHighPriority
/ 255が最も高い優先順位(19〜99?sched_get_priority_max(3)
返される値)、または権限がない可能性があると思います。割り当てることができる最も高い優先順位は何ですか?それでは、それとも一番低い優先順位…どれがより合理的でしょうかkLowPriority
?0 ± kDefaultPriority
現在私はこう思います:
pthread_attr_t attr;
pthread_t thread;
struct sched_param param;
const int policy = sched_getscheduler(0),
sched_high_prio = sched_get_priority_max(policy), // 19,
sched_low_prio = sched_get_priority_min(policy), // -20,
sched_range_prio = sched_high_prio - sched_low_prio;
pthread_attr_init (&attr);
pthread_attr_getinheritsched(&attr, PTHREAD_INHERIT_SCHED);
pthread_attr_getschedparam (&attr, ¶m);
param.sched_priority = -(((nTaskPriority
- kLowPriority) * sched_range_prio
/ kHighPriority) + sched_low_prio
- kDefaultTaskPriority);
PS:POSIX APIについて質問するのに最適な場所がここであるかどうかはわかりません。スタックオーバーフローですから、私がこの2つのことをしているので、私の記事を削除していただくか、奇妙なところにあると思われる場合は削除してもらってください。編集する:だから投稿は削除されました。
答え1
私はあなたがポータブルな答えを探していると思いますが、これを理解するための良いスタートは、マンページで説明されているようにLinuxの動作を見てみることです。sched(7)
、「スケジュール戦略」セクションで:
スケジューラは、CPUが次に実行する実行可能スレッドを決定するカーネルコンポーネントです。各スレッドには関連するスケジュールポリシーと変化のないスケジュール優先順位、 スケジューリング優先順位。スケジューラは、スケジューリングポリシーの知識とシステム内のすべてのスレッドの静的優先順位に基づいて決定を下します。
一般スケジューリングポリシー(
SCHED_OTHER
、、、SCHED_IDLE
)のいずれかSCHED_BATCH
に従ってスケジュールされたスレッドの場合、スケジューリング優先順位スケジュールの決定には使用されません(0として指定する必要があります)。リアルタイムポリシー(
SCHED_FIFO
、、)のいずれかSCHED_RR
に従って予約されたプロセススケジューリング優先順位値の範囲は1(低)から99(高)までです。 (数値が示すように、リアルタイムスレッドは常に通常のスレッドよりも優先順位が高くなります。)注:POSIX.1は、リアルタイムポリシーに対してのみ少なくとも32の異なる優先順位をサポートするように実装する必要があります。 。移植可能なプログラムは以下を使用する必要があります。sched_get_priority_min(2)そして sched_get_priority_max(2)特定のポリシーでサポートされている優先順位の範囲を確認してください。
また、見ることができますPOSIX ドキュメントpthread_setschedparam
、これは3つのポリシー(SCHED_OTHER
、、SCHED_FIFO
およびSCHED_RR
)のみを必要とし、最初のポリシーによる動作が実装に従って定義されることを宣言します。
したがって、移植可能な優先順位でスレッドを予約するには、まず適切な戦略(FIFOまたはラウンドロビン)を使用する必要があります。次に、値の範囲を決定し、適切な優先順位を設定します。スレッドとプロセスは優先順位を下げて予約されます。優先順位の高いスレッドが最初に実行されます。
Linuxでは、POSIX実装によって定義されたデフォルトの動作は、nice
値と特定のスレッドが実行される頻度に基づいて計算される動的優先順位を使用します。いいえ計画済み。 Linuxでは、このnice
値は低い優先順位から高い優先順位を決定するため、-20が最も高い優先順位、19が最も低い優先順位です。 POSIXではこれをプロセス固有の値として説明nice
しますが、Linuxではスレッド固有であるため、スレッドをスケジュールするために使用できます(ただし移植可能ではありません)。