Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保调用sched_setaffinity()后立即在指定线程上运行代码,然后再等待cpu队列的下一轮?_C_Multithreading_Affinity - Fatal编程技术网

如何确保调用sched_setaffinity()后立即在指定线程上运行代码,然后再等待cpu队列的下一轮?

如何确保调用sched_setaffinity()后立即在指定线程上运行代码,然后再等待cpu队列的下一轮?,c,multithreading,affinity,C,Multithreading,Affinity,我已经写了一个代码,使7进程除了家长,所以总和是8。。。我设法将每个进程绑定到不同的线程。。ie我有intel core-i7..它有4个内核X 2个线程/内核=8个线程。。。现在我的问题是,如何确保在调用sched_setaffinity()之后,进程将继续在指定的处理器上运行,而不会等到指定cpu队列中的下一个轮到它??我们能吃点像这样的东西吗 将我从当前队列中取出,以便下一次将我放入指定队列中() 我的代码是: #define _GNU_SOURCE #include <

我已经写了一个代码,使7进程除了家长,所以总和是8。。。我设法将每个进程绑定到不同的线程。。ie我有intel core-i7..它有4个内核X 2个线程/内核=8个线程。。。现在我的问题是,如何确保在调用sched_setaffinity()之后,进程将继续在指定的处理器上运行,而不会等到指定cpu队列中的下一个轮到它??我们能吃点像这样的东西吗

将我从当前队列中取出,以便下一次将我放入指定队列中()

我的代码是:

       #define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <sched.h>
#include <sys/shm.h>

int main()
{
   //code here in parent only , before any child start ///


   /////Declaration section////////
   pid_t ProcessIDs[8];
   cpu_set_t ThreadArray[8];
   int i ;
   int j ;
   int k ;
   int InternalPID;
   ////////////////////////////////


   /////Initialization section/////
   i=1;
   j=0;
   k=0;
   InternalPID = 0;

   for (j=0;j<8;j++)
   {
   ProcessIDs[j] = 0;
   }

   for (j=0;j<8;j++)
   {
   CPU_ZERO(&ThreadArray[j]);
   }

   for (j=0;j<8;j++)
   {
   CPU_SET(j+1,&ThreadArray[j]);
   }
   /////////////////////////////////



///////// shm ///////////////////////////////
int  shmid ;
int err;
char *shm;
shmid = shmget(IPC_PRIVATE,8 ,IPC_CREAT | IPC_EXCL | 0666 );
shm=shmat(shmid,0, IPC_CREAT | IPC_EXCL | 0666  );
if (shmid > -1)
{
printf("shared memory created succefully\n");
}
int m =0;
for(m=0 ;m<8;m++)
{
    shm[m]='N';
}
//////////////////////////////////////////////



   /////// Parent only - children don't exist//////


   ProcessIDs[0] = getpid();
   while( (getpid() == ProcessIDs[0] ) & (i < 8) )
   {
   ProcessIDs[i] = fork();
   i++;
   }

    ////////////////////////////////////////////////

    ////////parent only - children exist////////////
    if(getpid() == ProcessIDs[0])
    {
    for(k=0;k<8;k++)
    {
    sched_setaffinity(ProcessIDs[k],sizeof(cpu_set_t),&ThreadArray[k]);
    shm[k] = 'Y';
    sleep(2);
    }
    }
    ////////////////////////////////////////////////


   ///////////////////parent and children////
   for(k=1;k<8;k++)
   {
    if(ProcessIDs[k] == 0){
    InternalPID = k;
    break;
    }
   }
   //////////////////////////////////////////////

   //////////Process Specific code //////////////

   if (InternalPID == 0)
   {
   ////// Parent only Rest of Code ////////
   while(shm[0] != 'Y');
   printf("hello for parent %i.. \n",InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   else if (InternalPID == 1)
   {
   ////////////// child 1 /////////////////
   while(shm[1] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   else if (InternalPID == 2)
   {
   ////////////// child 2 /////////////////
   while(shm[2] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   else if (InternalPID == 3)
   {
   ////////////// child 3 /////////////////
   while(shm[3] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   else if (InternalPID == 4)
   {
   ////////////// child 4 /////////////////
   while(shm[4] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   else if (InternalPID == 5)
   {
   ////////////// child 5 /////////////////
   while(shm[5] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   else if (InternalPID == 6)
   {
   ////////////// child 6 /////////////////
   while(shm[6] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   ////////////////////////////////////////
   }
   else if (InternalPID == 7)
   {
   ////////////// child 7 /////////////////
   while(shm[7] != 'Y');
   printf("hello for child  %i.. \n", InternalPID);
   return 0 ;
   ////////////////////////////////////////
   }
   /////////////////////////////////////////////////




   ///////////////////////////////////////////////////////
}
定义GNU源
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
//在此仅在父级中,在任何子级开始之前进行编码///
/////申报科////////
pid_t processid[8];
cpu设置线程阵列[8];
int i;
int j;
int k;
内部PID;
////////////////////////////////
/////初始化部分/////
i=1;
j=0;
k=0;
内部PID=0;
简言之,对于(j=0;j),您不能这样做,因为您请求的任何内核可能已经在忙于做其他事情。设置关联所做的只是告诉操作系统您只希望在该特定CPU上调度进程。因此,在默认关联(任何CPU)的情况下,您的任务实际上更可能延迟我会安排在第一个可用的时间

您可以提高进程优先级(即实时调度),这将导致进程抢占CPU上已经运行的任何内容,这可能更符合您的期望

也就是说,您有可能完全锁定系统,如果“while”循环永远不会结束,那么它们将被卡在一个紧密的循环中,并且不会安排任何其他内容(甚至您的shell),因此您将无法阻止它们

我的问题是,如何确保在调用sched_setaffinity()之后,进程将继续在指定的处理器上运行,而不会等到指定cpu队列中的下一个轮次

一定要部分地说:

如果pid指定的进程当前未在其中一个上运行 掩码中指定的CPU,然后 该进程将迁移到掩码中指定的一个CPU

这并不能保证这样的迁移会在进程的当前时间片(如果有)到期之前发生,也不能保证它会立即开始在指定的CPU上运行,但这是没有意义的,因为你怎么知道呢

如果一个孩子说孩子a想在其会话期间与家长通信,而孩子a仍在其cpu队列中,而不是像孩子a一样运行,那么会发生什么情况?操作系统的作用是让所有八个进程都感觉到每个进程当前都只有cpu吗

显然,一个进程在当前没有安排在CPU上的情况下根本无法做任何事情。事实上,它甚至不能设想(隐喻性地)想要做任何事情。但总体而言,是的,协调分时和IPC是操作系统的角色


这与CPU亲缘关系或系统中物理执行单元的数量没有任何特别的关系。所有这些都可以在单核机器上正常工作(尽管在这样的机器上设置CPU亲缘关系是毫无意义的)你能很好地格式化你的代码吗?抱歉……我会编辑………………谢谢你的回答……在不同CPU上运行独立进程的主要目的不是避免可能出现的通信问题……第二个问题是我担心它会发生的副作用…但是现在考虑我的问题…….是否有对某个函数的调用,该函数在执行后会使进程跳过其剩余的时间片,以便下次即使在延迟之后,它也会在正确的处理器上执行…我将在此时删除while循环…thnxI repeat:您如何判断该行为是否如您所希望的那样?父进程为子进程设置CPU相关性,当然,子进程的后续时间片被安排在指定的CPU上。但是,这两个进程如何知道在处理调用时,子进程是否在另一个CPU上执行?您似乎在担心一些无法测量的事情,这甚至无关紧要。即使子进程在指定的CPU上执行意外地损坏了cpu…只得到一次(即使是冗余的)但是保证它在指定的cpu上的下一个片上执行…它会好的…我不喜欢做检查..比如说,将它从cpu3队列中取出,并在同一个cpu3上执行它下一个时间片,碰巧也是cpu3不会引起任何问题…这是时间和我的目标之间的压缩问题..放置它可以使用的功能检查pid后的分支…在到达ifelsr梯形图之前不是所有进程执行的公共部分..这是我的观点.可以修改帖子标题以反映:如何将进程从cpu队列中取出..指定哪个进程是我们在代码中的何处编写此函数的问题..在ifelsr梯形图的开始处每个分支..还请注意我制作了一个掩码数组而不是一个掩码..并注意哪个进程在fork之后的公共部分中得到哪个掩码是if条件while循环..我可以在fork之前执行此类块,因此我必须停止shm的处理,直到父进程在sched中设置其掩码..完成后我无法保证打开shm将离开在它的cpuI上重复一遍:你会怎么说?我不是说你应该尝试检查,而是建议你没有办法这样做。如果这些行为细节确实没有可测量的影响,那么关注它们是毫无意义的。如果我在设置亲和性后可以跳过当前时间片..我会保证下次ice将在指定的cpu上。即使是巧合,最初它是r