我确实确实通过谷歌和旧的堆栈溢出帖子进行了研究,但是在概念上试图弄清楚我需要编程的步骤时仍然遇到困难,并且我总是从堆栈溢出中获得很大的帮助,所以认为我会利用您的大力帮助:D
我正在编写一个简单的C“计划程序”程序,该程序实现先到先得(FCFS)算法。您运行.c程序的可执行文件,在这种情况下,我们将其称为“ scheduler.exe”,然后可以传递解释为 SECONDS ... 的参数列表,如下所示:
因此在此图中,我正在调用“ scheduler”程序并传递命令行参数“ 6 12 4 5 10”,这是正整数值列表。整数值是程序computeProgram_64.exe(由我们的教授提供给我们的另一个程序)的实例的执行时间。因此,argv []数组应在argv [0]中具有程序名称(在本例中为“ scheduler”),在argv [1]中应将参数“ 6 12 4 5 10”改为argv [5]
第一步 是调用 GetCurrentProcess()函数,该函数为调度程序提供了自身的句柄。我是通过代码做到的:
HANDLE myProcess = GetCurrentProcess();
然后,第二步是使用 GetProcessAffinityMask()函数询问操作系统哪些处理器可用,并传递将上述代码中的myProcess 处理到 GetProcessAffinityMask(),以便操作系统知道要使用亲和性掩码的进程。我是通过代码做到的:
//可以保存值的存储位置
DWORD_PTR lpProcessAffinityMask = 0;
//可以保存值的存储位置
DWORD_PTR lpSystemAffinityMask = 0;
BOOL res = GetProcessAffinityMask(myProcess,&lpProcessAffinityMask, &lpSystemAffinityMask);
我使用下面的printf语句检查lpProcessAffinityMask的值,该值以十六进制输出为0xFFF,以十进制输出4095(以10为基数)。我有一个Intel 5820k,它具有6个核心但12个线程,并且0xFFF是二进制的0000 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 in binary(32 bits)\ n”,binaryString);
所以现在是我遇到麻烦的地方,当我调用 SetProcessAffinityMask()时,我需要确保在位掩码中设置的位恰好是就是代表我要分配进程的CPU的位。为了找到processAffinityMask中设置的位,我的教授建议我们使用C位运算符&和<<。
但是,我编写了一个decimal_to_binary(int n)函数,该函数采用affinityMask的十进制输出并返回存储在char *指针中的二进制答案。我不确定这样做是否过于复杂,但是我认为可以遍历char数组(循环),然后找到要分配给 SetProcessAffinityMask()的特定可用CPU的索引。 >。
在这一点上,我对argv []数组中的命令行参数的处理感到困惑,该参数保存秒“ 6 12 4 5 10”,因为它们应该按顺序分配给 GetProcessAffinityMask()的AffinityMask返回的可用CPU。然后,我需要设置SetProcessAfinityMask()的位,然后再通过 CreateProcess()函数开始调用进程。
很抱歉,如果这是一篇很长的文章,但是我觉得我必须解释一些程序。非常感谢。