Планировщик программ на C; как использовать SetProcessAfinityMask () для назначения процесса определенному процессору #

#c #windows #scheduler #bitmask #createprocess

#c #Windows #планировщик #битовая маска #createprocess

Вопрос:

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

Я пишу простую программу «планировщик» на C, которая реализует алгоритм обслуживания в порядке живой очереди (FCFS). Вы запускаете исполняемый файл программы на языке .c, в данном случае давайте назовем его «scheduler.exe » и вы можете передать список аргументов, которые интерпретируются как СЕКУНДЫ …, вот так: введите описание изображения здесь

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

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

ОБРАБАТЫВАТЬ myProcess = GetCurrentProcess();

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

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

DWORD_PTR lpProcessAffinityMask = 0;

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

DWORD_PTR lpSystemAffinityMask = 0;

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

Я использовал приведенные ниже инструкции printf для проверки значений lpProcessAffinityMask, которые выводят значение 0xFFF в шестнадцатеричном формате и 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», двоичная строка);

Итак, теперь у меня возникли проблемы, когда я вызываю SetProcessAffinityMask(), мне нужно убедиться, что у меня установлен ровно один бит в битовой маске, то есть бит, представляющий процессор, которому я назначаю процесс. Для поиска битов, установленных в processAffinityMask, мой профессор рекомендует использовать побитовые операторы C amp; и << .

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

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

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

Комментарии:

1. У меня возникли проблемы с пониманием того, в чем заключается ваш актуальный вопрос. Ваш вопрос довольно длинный и бессвязный, вы могли бы рассмотреть возможность удаления большей части истории и просто задать вопрос напрямую. Вы не знаете, как установить один бит в переменной? DWORD v = 0; v |= (1 << (cpunum-1));

2. Вы много говорите о том, что вам нужно сделать, но ничего о том, что вы сделали. Пожалуйста, поделитесь написанным вами кодом и, пожалуйста, задайте конкретный вопрос, помимо «Я в замешательстве».