#windows #semaphore
#Windows #семафор
Вопрос:
Как определить размер объекта семафора в Windows?
Я пытался использовать sizeof()
, но мы не можем указать имя объекта sempahore в качестве аргумента sizeof. Это должен быть дескриптор. sizeof(HANDLE)
дает нам размер дескриптора, а не семафора.
Комментарии:
1. Я считаю, что это определяется реализацией .
Ответ №1:
Это так называемый «непрозрачный дескриптор». Невозможно узнать, насколько он велик на самом деле, что он содержит или как какая-либо из функций работает внутри. Это дает Microsoft возможность полностью переписывать реализацию с каждой новой версией Windows, если они захотят, не беспокоясь о нарушении существующего кода. Это похоже на концепцию наличия общедоступного и частного интерфейса для класса. Поскольку мы не работаем с ядром Windows, мы видим только общедоступный интерфейс.
Обновить:
Возможно, можно получить приблизительное представление о том, насколько они велики, создав группу и отслеживая, что происходит с использованием вашей памяти в Process Explorer. Однако, поскольку существует большая вероятность, что они находятся в ядре, а не в пространстве пользователя, он может вообще не отображаться. В любом случае, нет никаких гарантий относительно любой другой версии Windows, прошлой или будущей, включая исправления / пакеты обновления.
Комментарии:
1. Я хотел создать сотни семафоров для приложения. Есть ли какой-либо способ, с помощью которого я могу узнать, сколько памяти они занимают (если они занимают)?
2. @ajay bidari: Сотни ? Что в мире вы делаете, что заставляет вас думать, что вам нужно так много семафоров? Это само по себе напоминает проблему дизайна / архитектуры, которую необходимо решить.
3. @ajay Я обновил свой ответ. Они занимают память, но, вероятно, не так много.
4. @ajaybidari Давайте посмотрим на ситуацию пессимистично. Каждый из них занимает 4 КБ памяти (страница памяти). Это 400 КБ памяти для 100 из них. Достаточно ли большое число, чтобы вызвать проблемы?
5. Я использую семафоры для IPC (точнее, для удаленного вызова функции). Существует около сотни функций, которые необходимо выполнять удаленно. Для каждой функции я буду использовать пару семафоров. Один для запроса вызова функции, а другой для подтверждения. Другое дело, что любой семафор будет принимать только два значения (0 или 1).
Ответ №2:
Это что-то «скрытое» от вас. Вы не можете сказать, насколько он велик. И это объект ядра, поэтому он, вероятно, даже не находится в вашем адресном пространстве. Это все равно, что спросить: «Насколько велика таблица процессов?» или «сколько МБ тратит Windows впустую?».
Я добавлю, что я провел небольшой тест на своей 32-разрядной машине Windows 7: 100000 семафоров ядра (с именем X{number}
с 0 <= числом < 100000)): 4 МБ памяти ядра и 8 МБ пользовательского пространства (оба измеряются с помощью диспетчера задач). Это около 40 байт / семафор в пространстве ядра и 80 байт / семафор в пользовательском пространстве! (это в Win32… В 64 битах он, вероятно, удвоится)