c# 的线程可以指定运行在指定的cpu核心上吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 的线程可以指定运行在指定的cpu核心上吗相关的知识,希望对你有一定的参考价值。

c# 的线程可以指定运行在指定的cpu核心上吗
比如双核的 我指定运行在第一个上面

参考技术A 托管的代码是无法办到这点的。
如果需要这样的功能,需要编写非托管代码调用win32的API
可参考
http://hi.baidu.com/robinlxzh/blog/item/ba4fb57ec15c5d310dd7da25.html

android如何强制cpu核心离线(关闭核心)

【中文标题】android如何强制cpu核心离线(关闭核心)【英文标题】:android how to force cpu core offline(shut down cores) 【发布时间】:2013-11-26 15:46:36 【问题描述】:

我使用的是四核智能手机。

我想知道如何强制三核或两核离线。因此,我可以在运行指定基准的不同频率级别测量不同活动核心数的性能。

我可以通过“用户空间调控器”管理核心频率。但是,我无法关闭核心。当我运行基准测试时,空闲的核心会被唤醒。

我已使用“adb shell”连接到手机。我也可以获得root访问权限。

有人可以帮忙解决这个问题吗?提前致谢。

【问题讨论】:

我不确定这是否可行。您可以将内核设置为非常低的频率,但我认为“关闭”它们会带来安全问题。 【参考方案1】:

运行以下命令关闭cpu1、cpu2、cpu3。

adb root
adb shell stop mpdecision
adb shell
echo "0" > /sys/devices/system/cpu/cpu1/online
echo "0" > /sys/devices/system/cpu/cpu2/online
echo "0" > /sys/devices/system/cpu/cpu3/online

【讨论】:

这些命令并非一直有效。在线写入 0 后马上又变成 1。 如果 mpdecision 仍在运行,我可以想象会发生这种情况。 “mpdecision”是高通独有的 CPU 调度机制。【参考方案2】:

我必须首先为 Galaxy-S7 设备禁用 hotplug,以防止 CPU 返回在线状态:

echo 0 > /sys/devices/system/cpu/cpuhotplug/enabled

在我的设备上,对该文件的每次写入访问都会导致 CPU 状态重置。因此,先检查现有值以免遇到麻烦:

if [[ 0 != $(cat /sys/devices/system/cpu/cpuhotplug/enabled) ]]; then
    echo 0 > /sys/devices/system/cpu/cpuhotplug/enabled
fi

【讨论】:

【参考方案3】:

您可以通过更改相应文件的权限来强制“在线”状态:

# Without stopping this service, the following approach will fail
# You can run it after. This will increase battery life. So, I suggest to run it.
stop mpdecision

# Make the file writable
chmod 664 /sys/devices/system/cpu/cpu0/online

# Make the core always offline
echo 0 > /sys/devices/system/cpu/cpu0/online

# Make the file read-only. 
# Now "online" status will not be changed by external apps
chmod 444 /sys/devices/system/cpu/cpu0/online

# Run the service again
start mpdecision

您必须为每个 cpu 内核运行所有这些东西。 我建议创建一个 bash 脚本,如下所示:

...
set_core_offline () 
    local core=$1
    chmod 664 /sys/devices/system/cpu/cpu$core/online
    echo 0 > /sys/devices/system/cpu/cpu$core/online
    chmod 444 /sys/devices/system/cpu/cpu$core/online


# Works for 4-core CPUs
set_cores_offline () 
    set_core_offline 0
    set_core_offline 1
    set_core_offline 2
    set_core_offline 3

...

当然,这个解决方案并不完美。再看一遍,代码sn-p:

echo 0 > /sys/devices/system/cpu/cpu0/online
chmod 444 /sys/devices/system/cpu/cpu0/online

这是两个独立的命令。执行第一个后,外部应用程序可能会再次将“在线”状态更改为“1”。之后,第二个命令将将此状态修复为不可更改。因此,最清晰的解决方案是将这 2 个命令包装成一个循环并检查状态,直到我们得到所需的结果。

【讨论】:

以上是关于c# 的线程可以指定运行在指定的cpu核心上吗的主要内容,如果未能解决你的问题,请参考以下文章

CPU调优并发问题

如何查看linux线程 运行在哪个cpu核上

Linux 进程线程运行在指定CPU核上

Windows10 临时将线程绑定至指定CPU的方法

linux 将进程或者线程绑定到指定的cpu上

进程线程运行状态查看包括线程在cpu上运行情况