7

私は高パフォーマンスの I/O プログラムに取り組んでおり、C++ を使用してデバイスのディスク ブロックのバイト サイズ_physical_(ではなく) を決定する最良の方法を見つけようとしています。_logical_これまでの調査により、次のコード スニペットにたどり着きました。

#include <iostream>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char ** argv)
{
    // file information including block size of the device
    struct stat info;
    // device to get block size from
    char * device = "/mnt/hdb1";

    if (stat(device, &info))
    {
        printf("stat() error");
        strerror(errno);
        exit(1);
    }
    printf("Prefered block size for '%s' is %i byte\n", device, info.st_blksize);
    return 0;
}

manページには、について次のように書かれていますst_blksize

st_blksize フィールドは、効率的なファイル システム I/O の「優先」ブロック サイズを指定します。(小さいチャンクでファイルに書き込むと、非効率的な読み取り-変更-再書き込みが発生する可能性があります。)

st_blksize、しかし、が論理ディスクブロックサイズか物理ディスクブロックサイズかについては言及していません。

つまり、st_blksize物理ディスクのブロック サイズです。もしそうなら、これは、物理ディスクのブロック サイズを検出する最も POSIX OS 移植性の高い方法です。

4

1 に答える 1

5

私は答えを書きましたが、希望はありますが、ブロックデバイスでは正しく機能しませんでした。

デバイスの基本的な物理ブロック サイズを取得するための POSIX メカニズムはありませんioctl。プラットフォームに依存する に頼る必要があります。

Linuxにはioctl(fd, BLKPBSZGET, &block_size)

Solaris にdkioは、物理​​ブロック サイズを取得できるインターフェイスがあります。

dk_minfo_ext media_info;
if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info))
    block_size = media_info.dki_pbsize;

Mac OS X の場合は、ioctl(fd, DKIOCGETPHYSICALBLOCKSIZE, &block_size).

FreeBSD の場合は、iotcl(fd, DIOCGSECTORSIZE, &block_size).

于 2013-04-11T11:38:04.223 に答える