Unix-system-calls-ioprio-set

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

ioprio_set()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

ioprio_get、ioprio_set-I/Oスケジューリングクラスと優先度の取得/設定

概要

int ioprio_get(int which, int who); int ioprio_set(int which, int who, int ioprio);

説明

*ioprio_get* ()および *ioprio_set* ()システムコールは、それぞれ1つ以上のプロセスのI/Oスケジューリングクラスと優先度を取得および設定します。

_which_引数と_who_引数は、システム呼び出しが動作するプロセスを識別します。 _which_引数は、_who_の解釈方法を決定し、次の値のいずれかを持ちます。

Tag

説明

*IOPRIO_WHO_PROCESS*

_who_は、単一のプロセスを識別するプロセスIDです。

*IOPRIO_WHO_PGRP*

_who_は、プロセスグループのすべてのメンバーを識別するプロセスグループIDです。

*IOPRIO_WHO_USER*

_who_は、一致する実際のUIDを持つすべてのプロセスを識別するユーザーIDです。

*ioprio_get* ()を呼び出すときに_which_が *IOPRIO_WHO_PGRP* または *IOPRIO_WHO_USER* として指定され、複数のプロセスが_who_に一致する場合、返される優先順位は、一致するすべてのプロセスで見つかった最高の優先順位になります。 優先度が高いクラス( *IOPRIO_CLASS_RT* が最高の優先度クラス、 *IOPRIO_CLASS_IDLE* が最低)に属している場合、または他のプロセスと同じ優先度クラスに属しているが、より高い優先度レベル(より低い優先度番号はより高い優先度レベルを意味します)。
*ioprio_set* ()に指定された_ioprio_引数は、ターゲットクラスに割り当てられるスケジューリングクラスと優先度の両方を指定するビットマスクです。 次のマクロは、_ioprio_値の組み立てと分析に使用されます。
  • IOPRIO_PRIO_VALUE(* classdata *

スケジューリング_class_および優先度(data)を指定すると、このマクロは2つの値を組み合わせて_ioprio_値を生成し、マクロの結果として返されます。

  • IOPRIO_PRIO_CLASS(* mask )*

mask(_ioprio_値)を指定すると、このマクロはそのI/Oクラスコンポーネント、つまり値 IOPRIO_CLASS_RTIOPRIO_CLASS_BE 、または IOPRIO_CLASS_IDLE のいずれかを返します。

  • IOPRIO_PRIO_DATA(* mask )*

maskioprio_値)を指定すると、このマクロは優先度(_data)コンポーネントを返します。

スケジューリングクラスと優先度の詳細については、「注」セクションを参照してください。

読み取りおよび同期(O_DIRECT、O_SYNC)書き込みのI/O優先度がサポートされています。 I/O優先度は、メモリをダーティにするプログラムのコンテキスト外で発行されるため、非同期書き込みではサポートされません。したがって、プログラム固有の優先度は適用されません。

返り値

成功すると、 ioprio_get ()は、_which_および_who_で指定された基準に一致するプロセスのいずれかで最も高いI/O優先順位を持つプロセスの_ioprio_値を返します。 エラーの場合、-1が返され、_errno_が設定されてエラーを示します。

成功すると、 ioprio_set ()は0を返します。 エラーの場合、-1が返され、_errno_が設定されてエラーを示します。

エラー

Tag Description
*EPERM * The calling process does not have the privilege needed to assign this ioprio to the specified process(es). See the NOTES section for more information on required privileges for* ioprio_set*().
ESRCH No process(es) could be found that matched the specification in which and who.
*EINVAL * Invalid value for which or ioprio. Refer to the NOTES section for available scheduler classes and priority levels for ioprio.

バージョン

これらのシステムコールは、カーネル2.6.13以降のLinuxで使用可能です。

準拠

これらのシステムコールはLinux固有です。

ノート

Glibcはこれらのシステムコールのラッパーを提供しません。* syscall *(2)を使用して呼び出します。

これらのシステムコールは、I/O優先度をサポートするI/Oスケジューラと組み合わせて使用​​した場合にのみ効果があります。 カーネル2.6.17の場合、そのようなスケジューラーはCompletely Fair Queuing(CFQ)I/Oスケジューラーのみです。

I/Oスケジューラーの選択

I/Oスケジューラは、特殊ファイル_/sys/block/<device>/queue/scheduler_を介してデバイスごとに選択されます。

_/sys_ファイルシステムを介して現在のI/Oスケジューラを表示できます。 たとえば、次のコマンドは、現在カーネルにロードされているすべてのスケジューラーのリストを表示します。

$ cat/sys/block/hda/queue/scheduler noop anticipatory deadline [cfq]

括弧で囲まれたスケジューラーは、デバイスで実際に使用されているものです(例では_hda_)。 別のスケジューラを設定するには、このファイルに新しいスケジューラの名前を書き込みます。 たとえば、次のコマンドは、_hda_デバイスのスケジューラーを_cfq_に設定します。

$ su Password: # echo cfq >/sys/block/hda/queue/scheduler

完全に公平なキューイング(CFQ)I/Oスケジューラー

v3(別名CFQ Time Sliced)以降、CFQはCPUスケジューリングと同様のI/O niceレベルを実装しています。 これらのナイスレベルは、それぞれが1つ以上の優先度レベルを含む3つのスケジューリングクラスにグループ化されます。

Tag

説明

*IOPRIO_CLASS_RT* (1)

これはリアルタイムI/Oクラスです。 このスケジューリングクラスには、他のどのクラスよりも高い優先度が与えられます。このクラスのプロセスには、毎回ディスクへの最初のアクセスが与えられます。 したがって、このI/Oクラスは注意して使用する必要があります。1つのI/Oリアルタイムプロセスがシステム全体を枯渇させる可能性があります。 リアルタイムクラスには、各プロセスでこのプロセスがディスクを必要とする時間を正確に決定する8つのレベルのクラスデータ(優先度)があります。 最高のリアルタイム優先度レベルは0です。最低は7です。 将来、これは、代わりに目的のデータレートを渡すことにより、パフォーマンスにより直接マッピングできるように変更される可能性があります。

*IOPRIO_CLASS_BE* (2)

これはベストエフォート型のスケジューリングクラスであり、特定のI/O優先度を設定していないプロセスのデフォルトです。 クラスデータ(優先度)は、プロセスが取得するI/O帯域幅を決定します。 ベストエフォート型の優先度レベルは、CPU nice値に似ています( getpriority (2)を参照)。 優先度レベルは、ベストエフォートスケジューリングクラスの他のプロセスに対する優先度を決定します。 優先度レベルの範囲は0(最高)〜7(最低)です。

*IOPRIO_CLASS_IDLE* (3)

これは、アイドルスケジューリングクラスです。 このレベルで実行されているプロセスは、他に誰もディスクを必要としない場合にのみI/O時間を取得します。 アイドルクラスにはクラスデータがありません。 この優先度クラスをプロセスに割り当てるときは、優先度の高いプロセスがディスクに常にアクセスしていると飢star状態になる可能性があるため、注意が必要です。

CFQ I/Oスケジューラとサンプルプログラムの詳細については、_Documentation/block/ioprio.txt_を参照してください。

I/O優先度を設定するために必要な権限

プロセスの優先度を変更する許可は、2つのアサーションに基づいて許可または拒否されます。

Tag

説明

  • プロセスの所有権 *

特権のないプロセスは、実際のUIDが呼び出しプロセスの実際のUIDまたは実効UIDと一致するプロセスのI/O優先度のみを設定できます。* CAP_SYS_NICE *機能を持つプロセスは、任意のプロセスの優先度を変更できます。

望ましい優先順位は何ですか

非常に高い優先度( IOPRIO_CLASS_RT )または非常に低い優先度( IOPRIO_CLASS_IDLE )を設定するには、 CAP_SYS_ADMIN 機能が必要です。

*ioprio_set* ()の呼び出しは両方の規則に従う必要があります。そうでない場合、呼び出しはエラー *EPERM* で失敗します。

BUGS

Glibcは、このページで説明されている関数プロトタイプとマクロを定義する適切なヘッダーファイルをまだ提供していません。 適切な定義は、_linux/ioprio.h_にあります。

関連項目

カーネルソースツリーのDocumentation/block/ioprio.txt。 [[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements