سؤال

هل هناك طريقة موثوقة وسريعة وحتمية (أي ليس معيار) للتحقق مما إذا كان نظام التشغيل MAC OS X قيد التشغيل هو محرك الحالة الصلبة؟

هل هناك أي مؤشر آخر كيف يعالج القرص جيدًا وصولًا متوازيًا؟ أحاول ضبط عدد المواضيع التي سيستخدمها برنامجي لعمليات المرتبطة بالقرص.

لست مهتمًا بالسرعة الخام أو البحث عن الوقت ، أي نوع من الوصول - التسلسلي أو المتوازي - أسرع بالنسبة لمحرك الأقراص. لا أتوقع من مستخدمي برنامجي استخدام ISCSI أو RAID. SSD هو تركيزي ، أي شيء آخر لطيف.

Device Characteristics من IOAHCIBlockStorageDevice يحتوي على هذه المعلومات. كيف يمكنني قراءته برمجيا؟


لقد اكتشفت حتى الآن الأمر كما هو: (التالي هو رمز pseudocode)

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); 
}

يحرر: إليك رمز المصدر الكامل. لقد تحقق من أنه يعمل مع Intel SSD و OCZ Vertex.

هل كانت مفيدة؟

المحلول

إذا كنت تحاول الحصول على هذا النوع من المعلومات ، فمن الأفضل أن تخمن هو Iokit.

يمكنك تجربة بعض وظائفها باستخدام ioreg أداة سطر الأوامر أو ioregistryexplorer.


إليك بعض التعليمات البرمجية التي قد تساعدك. إنه يجلب جميع محركات الأقراص الصلبة التي ليست غارة وليست أقسام. هذا ليس ما تريد ، لكنه قد يجعلك تبدأ.

#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 للاستعلام عن Samsung T5 الخارجي USB 3 SSD لـ SSD-ness (ولا Toshiba canvio USB HDDD). لقد أدارت محرك الأقراص الداخلي في MBP الخاص بي.

لا تعتقد الأداة المساعدة للقرص أيضًا أن Samsung عبارة عن SSD ، مما يجعلني أعتقد أنه قد لا يكون هناك طريقة ، بخلاف قياس الأداء الفعلي.

عدد المواضيع؟ 1 سوف يتغلب على أي قرص ، SSD ، الغارة أم لا. القرص بطيء ، المعالج سريع. سيقوم نظام التشغيل بإعادة ترتيب طلبات القرص الخاصة بك على أي حال (أو على الأقل يجب) الحصول على أقل حركات الرأس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top