Используйте WMI для получения количества физических и логических процессоров в C#
В этом примере показано, как вы можете определить количество процессоров вашего компьютера, как физических, так и логических.
Многие компьютеры в наши дни содержат несколько процессоров. Каждый процессор может содержать несколько ядер, процессоры, которые могут выполнять инструкции. Наконец, некоторые ядра могут выполнять несколько потоков исполнения одновременно. И все это отдельно от многопоточности, используемой операционной системой, где система быстро переключается между потоками, чтобы заставить ее казаться, что разные программы работают одновременно.
Все это затрудняет определение того, сколько потоков выполнения может выполняться одновременно. Следующий метод GetProcessorCounts возвращает количество физических процессоров, количество ядер и количество логических процессоров.
// Возвращает числа физических процессоров, ядер, // и логические процессоры. private void GetProcessorCounts(out int num_physical_processors, out int num_cores, out int num_logical_processors) { string query; ManagementObjectSearcher searcher; // Получаем количество физических процессоров. num_physical_processors = 0; query = "SELECT * FROM Win32_ComputerSystem"; searcher = new ManagementObjectSearcher(query); foreach (ManagementObject sys in searcher.Get()) num_physical_processors = int.Parse(sys["NumberOfProcessors"].ToString()); // Получаем количество ядер. query = "SELECT * FROM Win32_Processor"; num_cores = 0; searcher = new ManagementObjectSearcher(query); foreach (ManagementObject proc in searcher.Get()) num_cores += int.Parse(proc["NumberOfCores"].ToString()); num_logical_processors = Environment.ProcessorCount; }
Метод сначала использует WMI для выбора информации Win32_ComputerSystem. Он использует свойство NumberOfProcessors возвращаемого объекта, чтобы получить количество физических процессоров в системе.
Далее метод использует WMI для выбора информации Win32_Processor. Каждый из этих объектов представляет собой физический процессор. (Таким образом, количество возвращаемых объектов должно равняться количеству физических процессоров, которые только что вычислил метод.) Код проходит через возвращенные объекты процессора и суммирует их количество ядер.
Наконец, код использует Environment.ProcessorCount для получения логического числа процессоров. Это включает в себя все потоки, которые могут работать одновременно на всех процессорах и ядрах. Обычно это все, о чем вы заботитесь в программе. Он также должен быть равен:
(# processors) × (# cores per processor) × (# threads per core)