2010-01-17 11 views
7

Sistemin Mac OS X'in açık olup olmadığını kontrol etmek için güvenilir, hızlı, deterministik bir yol var mı (yani bir referans noktası) Solid State Drive mı?Mac OS X'de SSD nasıl algılanır?

Diskin paralel erişimi ne kadar iyi kullandığını gösteren başka bir gösterge var mı? Programımın disk bağlı işlemler için kullanacağı iş parçacığı sayısını ayarlamaya çalışıyorum.

Ham hızla ilgilenmiyorum ya da zaman isteyin, sadece sürücü için hangi tür erişim - seri veya paralel - daha hızlı. Programımın kullanıcılarının iSCSI veya RAID kullanmasını beklemiyorum. SSD benim odak noktam, başka her şey güzel. Bu bilgileri içeren

Device CharacteristicsIOAHCIBlockStorageDevice içerir. Program aracılığıyla nasıl okuyabilirim?

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

Edit (aşağıdaki pseudocode olan):


Şimdiye kadar çözdüm böyle giderse Here's complete source code. Intel SSD ve OCZ Vertex ile çalıştığını doğruladım. Eğer gerçekten diski bir SSD olur bakım, sadece diski gerçekten hızlı olması umurumda değil -

+0

Ayrıca bkz. Http://stackoverflow.com/q/908188/545127 – Raedwald

cevap

5

Bu tür bir bilgi almaya çalışıyorsanız, en iyi tahmin IOKit'tir. Bunun bazı deneyebilirsiniz

IOREG komut satırı aracı veya IORegistryExplorer kullanarak işlevlerinden biri.


Size yardımcı olabilecek bazı kodlar. RAID olmayan ve bölüm olmayan tüm sabit diskleri getirir. İstediğiniz bu değil ama başlamanıza neden olabilir.

#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 
+0

@porneL: Size yardımcı olabilecek bir kod ekledim. –

+0

Teşekkürler. Çok yardımcı oldu. Bu olmadan IOKit C++ API'yi porsiyon ederdim. – Kornel

+0

@porneL: Kendi başına anladığın anlaşılıyor. Sanırım bu konuda daha fazla yardıma ihtiyacınız yok, bu doğru mu? –

6

Aslında daha doğru sorunuza yanıt çünkü, kıyaslama yol gitmek gerektiğini düşünüyorum. Kullanıcı hızlı bir RAID kurulumu veya Fiber Kanal dizisi kullanıyorsa veya iSCSI kullanıyorsa ne olur?

Sadece

+2

Herhangi bir temel "hızlı" ölçümüm yok. İki kriter karşılaştırmalı ve karşılaştırmalıyım. Güvenilir kıyaslama için harcanan zaman, daha iyi strateji seçerek zamandan daha uzun olabilir. Kısa ölçüt güvenilmez olacak ve önbellekleri, gecikmeyi vb. Dikkate almak zor. Hızlı, determinist bir çözüm arıyorum. SSD'den başka bir şeye destek vermemize gerek yok. – Kornel

+1

Yeterince adil ama size şunu söyleyeceğim, bu, Windows işletim sisteminin aldığı yaklaşımdır - biraz istatistik görürseniz, görmesi çok kolay olacaktır; Biri ardışık bir ardışık okuma (yani sektör 5,4,3,2, vb) ile 2 test çalıştırın, daha sonra rastgele bir sektör okuması olan bir 2.Varyans temelde aynıysa, SSD'niz vardır; mekanik diskler üzerinde çılgınca farklı olacaklar –

0

iplik sayısı tahrik altında yatan/dev/diskX rastgele sektörlerin bir demet okumak ve sizin şartlarını yerine getirirse bir "Hızlı" olarak davranabilirsiniz? 1 herhangi bir disk, SSD, RAID ya da baskın edecek. Disk yavaş, işlemci hızlı. İşletim sistemi, en az kafa hareketlerini elde etmek için disk taleplerinizi herhangi bir şekilde (veya en azından gereken şekilde) yeniden düzenleyecektir.

+0

En az Windows ve Linux işletim sistemlerinde SSD'ler için disk istekleri yeniden düzenlenmeyecek –

+1

Tecrübemde OS X, disk erişimini yönetmek için iyi bir iş yapmıyor (paralel erişim, daha verimli değil, çöplere neden oluyor erişim). SSD'ye erişen çok sayıda I/O-bağlı iş parçacığı daha hızlıdır - belki de bazı CPU ek yükleri vardır, ancak yine de daha hızlıdır. – Kornel