有没有一种可靠的,快速的,确定性的方式(即的的基准),以检查系统驱动器的Mac OS X上是否是固态硬盘?

是否有任何其他指示盘如何处理并行访问?我试图调节我的程序将使用磁盘绑定操作的线程数。

我不感兴趣的原始速度或寻道时间,仅访问类型 - 串行或并行 - 是驱动器快。我不希望我的程序的用户使用iSCSI或RAID。 SSD是我的重点,别的是不错的到了。

Device CharacteristicsIOAHCIBlockStorageDevice包含此信息。我怎样可以通过编程读它?


到目前为止,我已经想通了,它是这样的:(下面是伪代码)

match = IOBSDNameMatching(kIOMasterPortDefault,0,"disk0s2");
IOServiceGetMatchingServices(kIOMasterPortDefault, match, &iterator);
while(entry = IOIteratorNext(iterator)) {
   do {
     entry = IORegistryEntryGetParentEntry(nextMedia, kIOServicePlane, &entry);
     dict = IORegistryEntryCreateCFProperty(nextMedia, 
            CFSTR(kIOPropertyDeviceCharacteristicsKey), kCFAllocatorDefault, 0);
     [dict objectForKey:CFSTR(kIOPropertyMediumTypeKey)];
   } 
   while(!dict && entry); 
}

编辑:这里的完整源代码。我已经验证了它与英特尔SSD和OCZ的顶点。

有帮助吗?

解决方案

如果你想获得这方面的信息,你是最好的猜测是由于IOKit。

您可以是一个使用功能尝试一些它的的名为ioreg 的命令行工具或 IORegistryExplorer 的。


下面是一些代码,可以帮助你。它获取不属于RAID和不分区上的所有硬盘驱动器。这是不是你想要的,但它可能让你开始。

#import "TWDevice.h"

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <paths.h>
#include <sys/param.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOBSD.h>
#include <IOKit/storage/IOMedia.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/Kext/KextManager.h>


@implementation TWDevice

@synthesize name, devicePath, size, blockSize, writable, icon;

+ (NSArray *)allDevices {
    // create matching dictionary
    CFMutableDictionaryRef classesToMatch;
    classesToMatch = IOServiceMatching(kIOMediaClass);
    if (classesToMatch == NULL) {
        [NSException raise:@"TWError" format:@"Classes to match could not be created"];
    }

    // get iterator of matching services
    io_iterator_t mediaIterator;
    kern_return_t kernResult;
    kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                                                      classesToMatch,
                                                                      &mediaIterator);

    if (kernResult != KERN_SUCCESS) {
        [NSException raise:@"TWError" format:@"Matching services did not succed."];
    }

    // iterate over all found medias
    io_object_t nextMedia;
    NSMutableArray *detectedDevices = [NSMutableArray array];
    while (nextMedia = IOIteratorNext(mediaIterator)) {
        NSMutableDictionary *properties;
        kernResult = IORegistryEntryCreateCFProperties(nextMedia,
                                                                                  (CFMutableDictionaryRef *)&properties,
                                                                                  kCFAllocatorDefault, 0);

        if (kernResult != KERN_SUCCESS) {
            [NSException raise:@"TWError" format:@"Getting properties threw error."];
        }

        // is it a whole device or just a partition?
        if ([[properties valueForKey:@"Whole"] boolValue] &&
            ![[properties valueForKey:@"RAID"] boolValue]) {
            TWDevice *device = [[[TWDevice alloc] init] autorelease];

            device.devicePath = [NSString stringWithFormat:@"%sr%@", _PATH_DEV, [properties valueForKey:@"BSD Name"]];
            device.blockSize = [[properties valueForKey:@"Preferred Block Size"] unsignedLongLongValue];
            device.writable = [[properties valueForKey:@"Writable"] boolValue];
            device.size = [[properties valueForKey:@"Size"] unsignedLongLongValue];

            io_name_t name;
            IORegistryEntryGetName(nextMedia, name);
            device.name = [NSString stringWithCString:name encoding:NSASCIIStringEncoding];

            …

            [detectedDevices addObject:device];
        }

        // tidy up
        IOObjectRelease(nextMedia);
        CFRelease(properties);
    }
    IOObjectRelease(mediaIterator);

    return detectedDevices;
}

@end

其他提示

其实,我觉得你应该去的基准路线,因为它更准确地回答你的问题 - 你没有的真正的关心磁盘恰好是一个SSD,你只关心这个盘是真快。如果用户使用的是一个快速的RAID设置,或光纤通道阵列,或者是使用iSCSI?

刚刚从底层的/ dev / diskX读了一堆随机扇区的,如果它符合您的要求,你可以把它当作一个“快”驱动器

这仅用于内部驱动器似乎是可能的。我找不到使用由于IOKit来查询其SSD岬三星T5外置USB 3 SSD(也不是东芝Canvio USB HDDD)的方式。我还是设法在我的MBP内部驱动器,虽然。

磁盘工具也并不认为三星是一个SSD,所以让我觉得有可能不是一种方式,比其他测量实际性能。

线程的数量? 1是要压倒任何硬盘,SSD,RAID与否。磁盘速度慢,处理速度快。操作系统将会重新排序无论如何磁盘请求(或者至少应该),以获得至少头部运动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top