Планировщик программ на С; Как использовать SetProcessAfinityMask (), чтобы назначить процесс для конкретного процессора # - PullRequest
0 голосов
/ 01 апреля 2019

Я действительно исследовал через Google и старые сообщения о переполнении стека, но все еще испытывал проблемы с концептуальной попыткой выяснить шаги, которые мне нужно запрограммировать, и я всегда получал большую помощь от переполнения стека,Я хотел бы использовать вашу большую помощь: D

Я пишу простую программу "планировщика" на C, которая реализует алгоритм First Come First Serve (FCFS).Вы запускаете исполняемый файл программы .c, в этом случае давайте назовем его «scheduler.exe», и вы можете передать список аргументов, которые интерпретируются как SECONDS ... , например: enter image description here

Итак, на этом рисунке я вызываю программу «планировщик» и передаю аргументы командной строки «6 12 4 5 10», которые представляют собой список положительных целочисленных значений.Целочисленные значения - это времена выполнения для экземпляров программы computeProgram_64.exe (еще одна программа, предоставленная нам нашим профессором).Таким образом, массив argv [] должен иметь имя программы в argv [0] (в данном случае «планировщик») и аргументы «6 12 4 5 10» в argv [1] для argv [5] (соответственно).

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

HANDLE myProcess = GetCurrentProcess ();

Затем 2-й шаг заключается в использовании Функция GetProcessAffinityMask () запрашивает у операционной системы, какие процессоры становятся доступными для нее, и передает код HANDLE myProcess , указанный выше, в GetProcessAffinityMask () , чтобы операционная системаСистема знает, какой процесс вы хотите маску сходства.Я сделал это с помощью кода:

// область памяти, которая может содержать значение

DWORD_PTR lpProcessAffinityMask = 0;

// область памяти, которая может содержать значение

DWORD_PTR lpSystemAffinityMask = 0;

BOOL res = GetProcessAffinityMask (myProcess, & lpProcessAffinityMask, & lpSystemAffinityMask);

Я использовал приведенные ниже операторы printf, чтобы проверить значения lpProcessAffinityMask, которые выводят в 0xFFF в HEX и 4095 в десятичном (основание 10).У меня Intel 5820k, которая имеет 6 ядер, но 12 потоков, и 0xFFF - это 0000 0000 0000 0000 0000 0000 1111 1111 1111 в двоичном формате, так что это выглядит правильно как битовая маска из ядер # 12 (считая количество битов «1» ввектор), то есть AffinityMask 00000000000000000000000010011001 будет означать, что в моем понимании доступны только CPU0, CPU3, CPU4 и CPU7!

printf ("% d 0x% X \ n", res, lpProcessAffinityMask);

printf ("\ n");printf («GetProcessAffinityMask () возвращает логическое значение:% d \ n», res);

printf («Шестнадцатеричное значение AffinityMask: 0x% X, десятичное значение:% d \ n», lpProcessAffinityMask, lpProcessAffinityMask);

char * binaryString;binaryString = decimal_to_binary (lpProcessAffinityMask);printf («который равен:% s в двоичном (32 бита) \ n», binaryString);

Так что теперь у меня возникли проблемы , когда я звоню SetProcessAffinityMask () , мне нужно убедиться, что в битовой маске установлен ровно один бит, то есть бит, представляющий процессор, которому я назначаю процесс.Чтобы найти биты, установленные в processAffinityMask, мой профессор рекомендует использовать побитовые операторы C & и <<. </p>

Однако Я написал функцию decimal_to_binary (int n), которая принимает десятичный выводof affinityMask и возвращает двоичный ответ, хранящийся в указателе char *.Я не уверен, если я слишком усложнил это, но я подумал, что мог бы затем выполнить итерацию (для цикла) массива char, а затем найти индекс конкретных доступных процессоров для выделения SetProcessAffinityMask () .

Я просто запутался в этом вопросе относительно того, что я делаю с аргументами командной строки в массиве argv [], который содержит секунды «6 12 4 5 10», так как они должны быть распределены по порядку длядоступные процессоры, возвращаемые AffinityMask GetProcessAffinityMask () .Затем мне нужно установить бит SetProcessAfinityMask () и затем позже начать вызывать процессы с помощью функции CreateProcess () .

Извините, если это длинный пост, но я чувствую, чтопришлось объяснить некоторые процедуры.Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...