- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经编写了一段代码,除了父进程之外还有 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/
我想了解 linux 系统调用 sched_setaffinity() 的工作原理。这是我的问题的后续问题 here . 我有this guide ,它解释了如何使用系统调用并有一个非常简洁(有效!)
有没有一种方法可以在使用截止时间调度的同时将 cpu 亲和性设置为 linux 中的进程?我正在运行 4.16 内核。下面是我的测试代码: #define _GNU_SOURCE #include "
我目前正在使用 sched_setaffinity将线程固定到特定的 CPU 内核。 void setCpuAffinity(int id) {
我正在编写一个需要在单核上运行的程序。为了将它绑定(bind)到单核,我使用了 sched_setaffinity(),但编译器给出了警告: implicit declaration of funct
我正在尝试编写一个使用 sched_setaffinity() 的内核模块.它在 linux/sched.h 中声明但在 core.c 中实现(afaik),现在的问题是我的系统似乎没有 core.c
我到处寻找,但似乎无法完成。我试图避免的是: “通过 fork(2) 创建的子级继承其父级的 CPU 亲和性掩码。” 来源:https://manpages.debian.org/testing/ma
我有两 block 配备不同 ARM CPU 的主板,一 block 2x 内核 - 运行 Linux 内核 4.1.x,另一 block 4x 内核 - 运行 3.10。在那些 Linux 安装中,
我正在使用带有 Alpha ISA 的完整系统模拟器 (GEM5)。我已成功交叉编译(使用 gcc-4.3.2、glibc-2.6.1)Linux 2.6.27 for Alpha。现在,我正在交叉编
很多关于 sched_setaffinity 的帖子,但几乎没有关于在内核空间中使用它的帖子。 我使用的是 4.14.79 内核。 我尝试使用调用 sched_setaffinity 的用户空间方法,
谁能告诉我如果我跑会发生什么 taskset -c 7 ./fred.x 但是在 fred.x 中,一个线程正在调用 sched_setaffinity 来绑定(bind)到核心 6? 该线程是否会获
我正在编写一个 linux 内核模块,该模块需要将两个线程固定在两个不同的 cpu 上。我计划在将 sched_setaffinity() 导出到内核后使用它。是否还有其他相同的导出功能? 另外,如果
我在 nginx source 中看到这样的代码: if (sched_setaffinity(0, 32, (cpu_set_t *) &cpu_affinity) == -1) {
我将/proc/sys/kernel/core_pattern 设置为将核心转储管道传输到我的程序。该程序调用一个shell脚本(使用“系统”),该脚本又调用我的测试程序,附加。此测试程序尝试为任何
我调用内核函数 sched_setaffinity() 以尝试使用 CPU 锁定内核线程,但它总是失败,错误号 22 显示“参数无效”。该机器运行 Fedora 15,内核版本为 2.6.38。 如果
我想通过 sched_affinity 在多个 CPU 上设置亲和性,如下所示。 void pin(pid_t t, int cpu) { cpu_set_t cpuset; CPU_ZERO
只有一个kthread,我想控制它在特定的CPU上运行。主进程通过kthread_create()和wake_up_process()函数创建并唤醒kthread。创建 kthread 时,maie
对于我可以用来为系统上的 sched_setaffinity 调用创建 CPU_SET 的 CPU 数量的正确值是多少,我有些困惑。 我的/proc/cpuinfo 文件: processor :
是否可以在使用 Android NDK 编译的原生 C 代码中设置 CPU 亲和性?由于系统使用的是 Linux 内核,应该可以使用 sched_setaffinity/sched_getaffini
我在一台有 1 个插槽、4 个内核的服务器上用 Linux 做了一个 sched_setaffinity 测试,以下/proc/cpuinfo 显示 cpu 信息: processor :
我已经编写了一段代码,除了父进程之外还有 7 个进程,所以总和是 8 ...我设法使每个进程绑定(bind)到不同的线程..即我有 intel core-i7 ..它有4 个核心 X 2 个线程/核心
我是一名优秀的程序员,十分优秀!