- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
只有一个kthread,我想控制它在特定的CPU上运行。主进程通过kthread_create()和wake_up_process()函数创建并唤醒kthread。创建 kthread 时,maie 进程将 kthread 的 pid 存储在全局变量中。让它称为“thread_pid”。
我创建函数来更改 kthread 的 CPU。它看起来像“int change_cpu(int cpu_to_change)”。它在将参数 pid 作为“thread_pid”传递时使用 sched_setaffinity()。即它调用类似“sched_setaffinity(thread_pid, cpu_mask_to_change);”。并将参数“cpu_to_change”的值存储到全局变量。让它称为“thread_cpu”。
kthread 有诸如“ASSERT(smc_processor_id() == thread_cpu)”之类的断言。kthread 通常不运行而是等待完成。
我希望在调用 change_cpu() 函数后,kthread 运行良好,不会断言失败。但它属于断言失败,即使 sched_setaffinity() 成功运行。为什么它不能按预期工作?我想知道为什么这种方式行不通。
为了更好地理解,这里是伪代码。
int thread_cpu;
int thread_pid;
int dummy_kthread(void *args)
{
while(1) {
wait_for_completion();
ASSERT( smc_processor_id() == thread_cpu );
'''
do something
'''
complete();
}
}
int change_cpu(int cpu_to_change)
{
struct cpumask * cpu_mask;
thread_cpu = cpu_to_change;
cpu_mask = set_cpumask(cpu_to_change); // this is not actually exist function.
return sched_setaffinity(thread_pid, cpu_mask);
}
int main(){
struct task_struct *dummy;
dummy = kthread_create(dummy_kthread, NULL, "dummy_kthread");
thread_pid = get_pid(dummy); // this is not actually exist function.
}
最佳答案
sched_setaffinity() 似乎无法正常工作的一个可能原因与内核的动态电源管理有关。当核心关闭时,该核心上运行的所有线程都将从该核心迁移出去。因此,cpumask 将相应更新。
为了防止内核断电,您需要在配置内核时为 HOTPLUG_CPU 选择“no”,或者您可以在 Kconfig 文件 (arch/[architecture]/Kconfig) 中手动将默认值设置为 'n' ) 在编译你的内核之前。
关于c - 为什么 sched_setaffinity 在 kthread 上没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985309/
我想了解 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 个线程/核心
我是一名优秀的程序员,十分优秀!