Каковы стандартные функции и утилиты C ++ для запроса свойств аппаратного обеспечения или возможностей операционной системы, на которых работает программа?
Например, std::thread::hardware_concurrency()
дает количество потоков, поддерживаемых машиной.
Но как определить, сколько оперативной памяти имеет компьютер, сколько оперативной памяти использует процесс, сколько дискового пространства доступно для записи в определенном каталоге или сколько доступно кэша L2?
Я бы предпочел ответы с помощью C ++ (C ++ 14) стандарты, но TR2 или увеличение предложения тоже будут хорошими.
Как уже отмечали другие, функции для получения таких свойств системы обычно зависят от платформы. STL и boost не предоставляют независимые от платформы оболочки, поэтому вам придется полагаться на сторонние библиотеки.
Я успешно использовал SIGAR в прошлом:
Sigar API предоставляет переносимый интерфейс для системы сбора
такая информация как:
- Системная память, подкачка, процессор, средняя загрузка, время работы, логины
- Оперативная память, процессор, учетные данные, состояние, аргументы, среда, открытые файлы
- Обнаружение файловой системы и метрики
- Обнаружение сетевого интерфейса, информация о конфигурации и метрики
- Таблицы соединений TCP и UDP
- Таблица сетевых маршрутов
Как примечание, Boost Filesystem действительно обеспечивает повышение :: файловая система :: пространство запросить «сколько дискового пространства доступно для записи в определенном каталоге».
Как определить, сколько оперативной памяти имеет компьютер, сколько оперативной памяти использует процесс, сколько дискового пространства доступно для записи в определенном каталоге, или сколько доступно кэша L2?
Вы не В точности это не относится к языку C ++, который описывает абстрактную машину.
Единственная причина, по которой он сообщает вам количество доступных ядер, заключается в том, что в противном случае его многопоточная модель была бы почти бесполезной, и даже в этом случае она делалась бы абстрактно («аппаратный параллелизм» — это не «количество физических процессоров на вашем рабочем столе»). ПК»).
«
std::thread::hardware_concurrency()
дает количество потоков, поддерживаемых машиной … »
Нет, это не так. Точнее (цитируя отсюда)
std::thread::hardware_concurrency()
… Возвращает количество одновременных потоков поддерживается реализацией. Значение следует рассматривать только как подсказку. …
… Если значение не является хорошо определенным или не вычисляемым, возвращает0
,
Лучше всего это сообщить вам, сколько процессорных ядер доступно для реальное параллельное исполнение потоков (см. @ Lightness Races в ответе Орбиты здесь).
Вы по-прежнему можете иметь столько экземпляров потока, сколько захотите, пока один из них не завершится неудачно.
«Как определить, сколько оперативной памяти имеет компьютер или сколько оперативной памяти использует процесс …»
Все эти возможности, такие как доступная оперативная память и т. Д., Сильно зависят от машины / ОС и не могут запрашиваться стандартными функциями или классами c ++ (по крайней мере, я не знаю о них).
«… или сколько дискового пространства доступно для записи в определенном каталоге, …»
Стандартная библиотека C ++ также не имеет понятия о такой вещи, как файловая система или же каталоги …
«… или сколько доступно кэш-памяти L2»
… и еще меньше понятия о таких специфических чертах MCU1.
C ++ использует абсолютно абстрактную, независимую от архитектуры машины и операционной системы картину своего мира.
1) Спасибо GOD, Bjarne и комитету по стандартам c ++ за это, иначе у меня были бы серьезные проблемы, чтобы написать наполовину переносимый код для различных целей, с которыми я сталкиваюсь. Если это терпит неудачу и не может быть доказано, что ошибка с моей стороны нарушает стандарты, это, скорее всего, ошибка фактической реализации компилятора. Это, по крайней мере, мешает моим кодировщикам сжиматься, чтобы получить ненужные и неясные попытки микрооптимизации :-D.
Самое близкое, что вы можете получить, запросив некоторые основные характеристики и возможности архитектуры машины с использованием текущих стандартов, — это то, что поддерживается <cstddef>
, <limits>
а также <type_traits>
ПО МОЕМУ МНЕНИЮ.
Хотя некоторые общие ‘уровень развития’ технологии и абстракции были приняты по последним стандартным определениям (например, как std::thread
, std::chrono
или же экспериментальная библиотека файловой системы).
Определение объема ОЗУ или свободного места на жестком диске зависит от уровня операционной системы. Поскольку существует множество различных стратегий для решения этих проблем, не существует независимого от платформы способа получения этой информации. API-интерфейсы для любой операционной системы, для которой вы разрабатываете, должны обеспечивать функциональность для определения этих значений.
Например, Windows API, кажется, предоставляет эту функцию:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx
который может помочь вам определить, сколько физической / виртуальной памяти доступно.
Определение объема доступного пространства кеша — это другое дело, вам может помочь следующий ответ:
https://stackoverflow.com/a/12838695/3798126