Какие стандартные возможности С++ можно использовать для запроса архитектуры машины/ОС?

Каковы стандартные возможности и утилиты С++ для запроса свойств аппаратных средств или возможностей операционной системы, на которых запущена программа?
Например, std::thread::hardware_concurrency() дает вам количество потоков, поддерживаемых машиной.
Но как вы обнаруживаете, сколько оперативной памяти компьютера или сколько оперативной памяти используется в процессе, или сколько свободного места на диске доступно для записи в определенном каталоге или сколько доступно кэш L2?

Я бы предпочел ответы с помощью (), но TR2 или предложения также будут хорошими.

Ответы

Ответ 1

Как указывали другие, функции для получения таких свойств системы обычно зависят от платформы. STL и boost не обеспечивают платформенно-независимые обертки, поэтому вам придется полагаться на другие сторонние библиотеки.

Я успешно использовал SIGAR в прошлом:

Sigar API предоставляет портативный интерфейс для сбора информации информация, например:

  • Системная память, своп, процессор, средняя загрузка, время работы, логины
  • Per-process memory, cpu, учетная информация, состояние, аргументы, среда, открытые файлы
  • Обнаружение и показатели файловой системы
  • Обнаружение сетевого интерфейса, информация о конфигурации и показатели
  • Таблицы соединений TCP и UDP
  • Таблица маршрутов сети

В качестве дополнительной заметки Boost Filesystem действительно предоставляет boost:: filesystem:: space запрос о том, сколько свободного места на диске доступно для записи в определенную директорию ".

Ответ 2

как вы определяете, сколько оперативной памяти компьютера или сколько оперативной памяти используется процессом, или сколько свободного места на диске доступно для записи в определенном каталоге или сколько доступно кэш L2?

Нет. Именно ничто из этого не является компетенцией языка С++, который описывает абстрактную машину.

Единственная причина, по которой он говорит о том, что количество доступных ядер - это потому, что в противном случае его многопоточная модель была бы близка к бесполезной, и даже тогда она делает это абстрактным образом ( "hardware concurrency" не является "числом физических процессоров на вашем ПК" ).

Ответ 3

"std::thread::hardware_concurrency() дает вам количество потоков, поддерживаемых машиной..."

Нет, это не так. Чтобы быть точным (цитируя здесь)

std::thread::hardware_concurrency()... Возвращает количество параллельных потоков, поддерживаемых реализацией. Значение следует рассматривать только как подсказку....
... Если значение не определено или не вычисляется, возвращает ​0.

Лучше всего это дать вам знать, сколько ядер процессора доступно для реального параллельного выполнения потоков (см. @Rightness Races на орбите, ответьте здесь).
У вас все еще может быть столько экземпляров потоков, которые вы хотите, до тех пор, пока не получите один из них.


", как вы определяете, сколько оперативной памяти компьютера или сколько оперативной памяти этот процесс использует..."

Все эти возможности, такие как RAM и т.д., сильно зависят от машины и ОС и не могут быть запрошены со стандартными функциями или классами С++ (по крайней мере, я не знаю).

"... или сколько места на диске доступно для записи в определенный каталог,..."

Стандартная библиотека С++ также не имеет понятия о такой вещи, как файловая система или каталоги...

"... или сколько доступно кэш L2"

... и даже меньше понятий о таких специфических чертах MCU 1.

С++ использует полностью абстрактную, машинную архитектуру и оперативную систему, неэкономную для этого мира.

1) Поблагодарите БОГ, Бьярн и комитет по стандартам С++ за это, иначе у меня возникнут серьезные проблемы, чтобы написать наполовину переносимый код для различных целей, с которыми я сталкиваюсь. Если он терпит неудачу и не может быть доказана ошибка с моей стороны, нарушающая стандарты, это, скорее всего, ошибка реальной реализации компилятора. Это, по крайней мере, мешает моим ко-кодировщикам выходить из строя, чтобы получить ненужные и неясные попытки микро-оптимизации: -D. Суб >


Все сказанное выше:

Самое близкое, что вы можете получить, запрашивая основные черты и возможности машинной архитектуры с использованием существующих стандартов, - это то, что поддерживается <cstddef>, <limits> и <type_traits> ИМХО.

Хотя некоторые общие "современные" технологии и абстракции были приняты последними стандартными определениями (например, std::thread, std::chrono или экспериментальная библиотека файловой системы).

Ответ 4

Определение объема оперативной памяти или свободного места на жестком диске - это функциональность уровня операционной системы. Поскольку для решения этих проблем существует множество различных стратегий, нет никакой независимой от платформы способа получения этой информации. API для любой ОС, которую вы разрабатываете, должен обеспечивать функциональность для определения этих значений.

Например, API-интерфейс Windows предоставляет эту функцию: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx которые могут помочь вам определить, сколько физической/виртуальной памяти доступно.

Определение количества доступного пространства кэша - это другое дело, следующий ответ может помочь вам: fooobar.com/info/159838/...