gpt4 book ai didi

windows - 如何在 Windows 中使用 Go 将进程设置为 CPU?

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:01 24 4
gpt4 key购买 nike

我想在 win7 中使用 Go 为 CPU 设置一个进程,代码如下:

package main

import (
"fmt"
"math"
"runtime"
"syscall"
"unsafe"
)

func SetAffinity(pid int, mask *int64) {
syscall.Syscall(syscall.SYS_SCHED_SETAFFINITY,
uintptr(pid), 8, uintptr(unsafe.Pointer(mask)))
}

func GetAffinity(pid int, mask *int64) {
syscall.Syscall(syscall.SYS_SCHED_GETAFFINITY,
uintptr(pid), 8, uintptr(unsafe.Pointer(mask)))
}

var cpuNum = float64(runtime.NumCPU())

var setx = []struct {
args int
expected int64
}{
{0, int64(math.Pow(2, cpuNum)) - 2},
}

func main() {
for _, ca := range setx {
var cpuSet int64
GetAffinity(ca.args, &cpuSet)
cpuSet = cpuSet & 0XFFFFFFE
SetAffinity(ca.args, &cpuSet)
fmt.Println(cpuSet)
GetAffinity(ca.args, &cpuSet)
fmt.Println(cpuSet)
}
}

当我使用 go run affinity.go 时,得到以下信息:

# command-line-arguments
.\affinity.go:12: undefined: syscall.SYS_SCHED_SETAFFINITY
.\affinity.go:13: not enough arguments in call to syscall.Syscall
.\affinity.go:17: undefined: syscall.SYS_SCHED_GETAFFINITY
.\affinity.go:18: not enough arguments in call to syscall.Syscall

我发现 SYS_SCHED_SETAFFINITY 只在 linux 中使用。所以,我想在 Windows(Win7) 中使用 Go 为 cpu 设置一个进程,我该怎么做?

最佳答案

您必须调用 WinAPI SetProcessAffinityMask

像这样的东西应该可以工作:

func setProcessAffinityMask(h syscall.Handle, mask uintptr) (err error) {
r1, _, e1 := syscall.Syscall(syscall.NewLazyDLL("kernel32.dll").NewProc("SetProcessAffinityMask").Addr(), 2, uintptr(h), mask, 0)
if r1 == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
}
return
}
当然,

h 是进程句柄,mask 是所需的关联掩码。

这取自 Go benchmarks , 在 BSD 许可证下。

关于windows - 如何在 Windows 中使用 Go 将进程设置为 CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30098205/

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