Win32 API 日本語リファレンス
ホームSystem.JobObjects › JOBOBJECT_IO_RATE_CONTROL_INFORMATION

JOBOBJECT_IO_RATE_CONTROL_INFORMATION

構造体
サイズx64: 40 バイト / x86: 40 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
MaxIopsLONGLONG8+0+0

I/O レートの最大制限を 1 秒あたりの I/O 操作数 (IOPS) 単位で指定します。制限を設けない場合は 0 に設定します。

MaxIopsMaxBandwith の両方を設定した場合、オペレーティング システムは I/O レートが最初に到達した方の制限を適用します。

MaxBandwidthLONGLONG8+8+8

I/O レートの最大制限をバイト/秒単位で指定します。制限を設けない場合は 0 に設定します。

MaxBandwithMaxIops の両方を設定した場合、オペレーティング システムは I/O レートが最初に到達した方の制限を適用します。

ReservationIopsLONGLONG8+16+16

オペレーティング システムがジョブのために予約する最小 I/O レートを設定します。ジョブのために予約を行わない場合は、この値を 0 に設定します。

オペレーティング システムは、可能であればこのレートでジョブが I/O 操作を実行できるようにします。すべてのジョブの最小レートの合計がオペレーティング システムの能力を超える場合、オペレーティング システムが各ジョブに許可する I/O 操作のレートは、そのジョブの予約に比例したものになります。

VolumeNameLPWSTR8/4+24+24

I/O レートのポリシーを適用するボリュームの NT デバイス名。NT デバイス名の詳細については、NT Device Names を参照してください。

このメンバーが NULL の場合、I/O レートのポリシーはオペレーティング システムのすべてのボリュームに適用されます。たとえば、このメンバーが NULLMaxIops メンバーが 100 の場合、すべてのボリュームにわたる I/O レートの合計制限を 100 IOPS に設定するのではなく、各ボリュームの I/O レートの最大制限がそれぞれ 100 IOPS に設定されます。

BaseIoSizeDWORD4+32+28

正規化された I/O 単位の基本サイズ (バイト単位)。たとえば、BaseIoSize メンバーが 8,000 の場合、8,000 バイトごとに 1 つの I/O 単位としてカウントされます。この例では 4,000 バイトも 1 つの I/O 単位であり、8,001 バイトは 2 つの I/O 単位になります。

この基本 I/O サイズの値は、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\QoS

レジストリ キーの StorageBaseIOSize 値を使用して設定できます。

BaseIoSize メンバーの値には、次の制約があります。

  • SetIoRateControlInformationJobObject 関数では、関数に渡す JOBOBJECT_IO_RATE_CONTROL_INFORMATION 構造体の BaseIoSize メンバーが 0 でなければなりません。
  • QueryIoRateControlInformationJobObject メソッドは、VolumeName メンバーで指定されたボリュームが I/O レートの制御をサポートしていない場合、この構造体の BaseIoSize メンバーを 0 に設定します。
  • QueryIoRateControlInformationJobObject メソッドは、VolumeName メンバーで指定されたボリュームが I/O レートの制御をサポートしている場合、この構造体の BaseIoSize メンバーを正規化された I/O 単位の基本サイズに設定します。
ジョブを作成せずに正規化された I/O 単位の基本サイズを照会するには、ジョブに関連付けられていないプロセスから、hJob パラメーターを NULL に設定して QueryIoRateControlInformationJobObject を呼び出します。
ControlFlagsDWORD4+36+32

I/O レートの制御ポリシー。このメンバーには、次のいずれかの値を指定できます。

意味
JOB_OBJECT_IO_RATE_CONTROL_ENABLE
0x1
この構造体を SetIoRateControlInformationJobObject 関数に渡すと、ジョブの I/O レートの制御が有効になります。この構造体を QueryIoRateControlInformationJobObject 関数で使用した場合は、ジョブの I/O レートの制御が有効になっていることを示します。

公式ドキュメント

Windows 10 バージョン 1607 以降: この構造体はサポートされていません。

ジョブの I/O レートを制御するために使用される情報を格納します。この構造体は SetIoRateControlInformationJobObject 関数および QueryIoRateControlInformationJobObject 関数で使用されます。

解説(Remarks)

ネストされたジョブの階層内では、1 つのジョブに対してのみ I/O レート制御を設定できます。指定した設定は、そのジョブと、そのジョブの階層内にある子ジョブに適用されます。設定は、親ジョブから階層の最上位までのジョブのチェーンには適用されません。I/O レート制御を設定した元のジョブの設定は、引き続き変更できます。ただし、親ジョブを含む階層内の他のジョブに対して I/O レート制御の値を設定しようとすると失敗します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// JOBOBJECT_IO_RATE_CONTROL_INFORMATION  (x64 40 / x86 40 バイト)
typedef struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION {
    LONGLONG MaxIops;
    LONGLONG MaxBandwidth;
    LONGLONG ReservationIops;
    LPWSTR VolumeName;
    DWORD BaseIoSize;
    DWORD ControlFlags;
} JOBOBJECT_IO_RATE_CONTROL_INFORMATION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION
{
    public long MaxIops;
    public long MaxBandwidth;
    public long ReservationIops;
    public IntPtr VolumeName;
    public uint BaseIoSize;
    public uint ControlFlags;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure JOBOBJECT_IO_RATE_CONTROL_INFORMATION
    Public MaxIops As Long
    Public MaxBandwidth As Long
    Public ReservationIops As Long
    Public VolumeName As IntPtr
    Public BaseIoSize As UInteger
    Public ControlFlags As UInteger
End Structure
import ctypes
from ctypes import wintypes

class JOBOBJECT_IO_RATE_CONTROL_INFORMATION(ctypes.Structure):
    _fields_ = [
        ("MaxIops", ctypes.c_longlong),
        ("MaxBandwidth", ctypes.c_longlong),
        ("ReservationIops", ctypes.c_longlong),
        ("VolumeName", ctypes.c_void_p),
        ("BaseIoSize", wintypes.DWORD),
        ("ControlFlags", wintypes.DWORD),
    ]
#[repr(C)]
pub struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION {
    pub MaxIops: i64,
    pub MaxBandwidth: i64,
    pub ReservationIops: i64,
    pub VolumeName: *mut core::ffi::c_void,
    pub BaseIoSize: u32,
    pub ControlFlags: u32,
}
import "golang.org/x/sys/windows"

type JOBOBJECT_IO_RATE_CONTROL_INFORMATION struct {
	MaxIops int64
	MaxBandwidth int64
	ReservationIops int64
	VolumeName uintptr
	BaseIoSize uint32
	ControlFlags uint32
}
type
  JOBOBJECT_IO_RATE_CONTROL_INFORMATION = record
    MaxIops: Int64;
    MaxBandwidth: Int64;
    ReservationIops: Int64;
    VolumeName: Pointer;
    BaseIoSize: DWORD;
    ControlFlags: DWORD;
  end;
const JOBOBJECT_IO_RATE_CONTROL_INFORMATION = extern struct {
    MaxIops: i64,
    MaxBandwidth: i64,
    ReservationIops: i64,
    VolumeName: ?*anyopaque,
    BaseIoSize: u32,
    ControlFlags: u32,
};
type
  JOBOBJECT_IO_RATE_CONTROL_INFORMATION {.bycopy.} = object
    MaxIops: int64
    MaxBandwidth: int64
    ReservationIops: int64
    VolumeName: pointer
    BaseIoSize: uint32
    ControlFlags: uint32
struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION
{
    long MaxIops;
    long MaxBandwidth;
    long ReservationIops;
    void* VolumeName;
    uint BaseIoSize;
    uint ControlFlags;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; JOBOBJECT_IO_RATE_CONTROL_INFORMATION サイズ: 40 バイト(x86)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; MaxIops : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; MaxBandwidth : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ReservationIops : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; VolumeName : LPWSTR (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; BaseIoSize : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ControlFlags : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; JOBOBJECT_IO_RATE_CONTROL_INFORMATION サイズ: 40 バイト(x64)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; MaxIops : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; MaxBandwidth : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ReservationIops : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; VolumeName : LPWSTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; BaseIoSize : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ControlFlags : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global JOBOBJECT_IO_RATE_CONTROL_INFORMATION
    #field int64 MaxIops
    #field int64 MaxBandwidth
    #field int64 ReservationIops
    #field intptr VolumeName
    #field int BaseIoSize
    #field int ControlFlags
#endstruct

stdim st, JOBOBJECT_IO_RATE_CONTROL_INFORMATION        ; NSTRUCT 変数を確保
st->MaxIops = 100
mes "MaxIops=" + st->MaxIops