gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:19:55 25 4
gpt4 key购买 nike

我已经编写了一段代码,除了父进程之外还有 7 个进程,所以总和是 8 ...我设法使每个进程绑定(bind)到不同的线程..即我有 intel core-i7 ..它有4 个核心 X 2 个线程/核心 = 8 个线程...现在我的问题是如何确保在调用 sched_setaffinity() 之后进程将继续在指定的处理器上运行,并且不会等到指定 cpu 队列中的下一个回合??我们可以有一些类似的东西

get_me_out_of_the_current_queue_so_that_the_sched_puts_me_in_the_specified_queue_next_time()

我的代码是:

       #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 ;
////////////////////////////////////////
}
/////////////////////////////////////////////////




///////////////////////////////////////////////////////
}

我知道 while() 在每个进程特定代码的开头循环(在 if 分支内)可以保证这一点,但我猜这是由于时间延迟,这不是一个可靠的解决方案......请告诉我解决这个问题的正确方法是什么......

我想问的第二点:

8个进程中的每个进程将在不同的核心上运行,但是在进程间通信期间,例如当我继续并创建管道时,以便进程通过父进程进行通信,就像中间点“像星形拓扑一样”如果一个 child 说 child a 想要在它的 session 期间与父级进行通信,当它仍然在它的 cpu 队列中并且当前没有像 child A 那样运行时......操作系统的作用是让所有八个进程感觉好像每个进程都在运行目前只有CPU吗?

最佳答案

简而言之——你不能,因为无论你要求什么核心,都可能已经在忙于做其他事情了。设置亲和性所做的只是告诉操作系统您只希望在该特定 CPU 上调度进程。因此,实际上更有可能使您的任务延迟,而默认关联性(任何 CPU)会将其安排在第一个可用的时间上。

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

话虽这么说,你可能会冒着完全锁定系统的风险,如果“while”循环永远不会结束,它们将陷入一个紧密的循环中,并且不会安排其他任何事情(甚至是你的 shell),所以你将无法阻止他们。

关于c - 如何确保代码在调用 sched_setaffinity() 之后立即在指定线程上运行,然后再等待 cpu 队列的下一轮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47909809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com