Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен по ОС_Ответы.doc
Скачиваний:
51
Добавлен:
24.09.2019
Размер:
926.72 Кб
Скачать

15) Эффект ложного разделения переменных (влияния кэш линий). (пример)

  • Влияние КЭШ-линий.

volatile int x = 0; // Thread1( ) x++

volatile int y = 0; // Thread2( ) y++

Для ускорения работы с ОЗУ каждый из процессоров использует локальный КЭШ, однако подгрузка в КЭШ производится не побайтно, а загружается целиком КЭШ-линия (участок памяти, выровненный по 32-байтной границе). Если две переменные попадают в одну КЭШ-линию, то эффект от использования КЭШа пропадает: нужно обновлять данные и в ОЗУ и во втором КЭШе. Поэтому следует выровнять переменные по границам КЭШ-линии или вводить фиктивные переменные, чтобы гарантировать, что переменные не попадут в одну КЭШ-линию. Для того чтобы избежать этих проблем, в Windows реализован такой объект, как критическая секция.

16) Управление объектами ядра в ос Windows. (описатель объекта, таблица описателей объектов процесса, создание, наследование, именование, дублирование)

Создание CreateMutex()

Закрытие BOOL CloseHandle(HANDLE)

Каждый процесс имеет таблицу описателей:

При закрытии HANDLE мы удаляем описатель из таблицы и декрементируем счетчик i. Если i = 0 – уничтожение объекта.

Наследование: SECURITY_ATTRIBUTE sa;

sa.nlength = sizeof(sa);

sa.lpSecurityDescriptor=NULL; /*NULL – защита по умолчанию; определяет, кто может пользоваться объектом (при NULL – создатель процесса и администраторы) */

sa.bInHeritHandle=TRUE; /*наследовать HANDLE*/

HANDLE hMutex = CreateMutex (&sa, FALSE, NULL);

Для передачи описателя в дочерний процесс обычно используется командная строка или переменные окружения.

Если объект создается уже после создания дочернего процесса, то дочерний процесс не содержит наследованного описателя.

SetHandleInformation

GetHandleInformation

HANDLE_FLAG_INHERIT

HANDLE_FLAG_PROTECT_FROM_CLOSE (CloseHandle)

flag

Именование:

Можно задать имя:

HANDLE hMut = CreateMutex(NULL, FALSE, “SomeMutex”);

Проводится проверка, имеется ли объект ядра с нашим именем и происходит проверка типа объекта ядра.

Если объект с таким именем и типом уже существует, то функция не создает новый объект, а возвращает описатель существующего объекта (при этом 1-й и 2-й параметры игнорируются) и генерирует код оштбки.

Можно осуществить проверку на возникновение ошибки:

If (GetLastError() = = ERROR_ALREADY_EXISTS) {…}

Пространство имен объектов ядра является глобальным, если только не запущен терминал. В последнем случае к имени добавляются префиксы Global\, Local\.

Дублирование:

BOOL DuplicateHandle(

HANDLE hSourceProcessHandle,//описатель исходного процесса (GetCurrentProcess())

HANDLE hSourceHandle, //дублируемый описатель процесса-источника

HANDLE hTargetProcessHandle, //процесс-приемник

PHANDLE phTargetHandle, //описатель в процессе-приемнике

DWORD dwPesiredAccess,

DWORD dwQotions);

Особенность: нужно использовать механизм межпроцессного взаимодействия для передачи продублированного описателя (DuplicateHandle его сформирует, но нужно также поставить в известность и сам процесс-приемник).