内容简介
int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask) int sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask) void CPU_CLR(int cpu, cpu_set_t *set) int CPU_ISSET(int cpu, cpu_set_t *set) void CPU_SET(int cpu, cpu_set_t *set) void CPU_ZERO(cpu_set_t *set) #include <sched.h> |
描述
A process’s CPU affinity mask determines the set of CPUs on which it is eligible to run. On a multiprocessor system, setting the CPU affinity mask can be used to obtain performance benefits. For example, by dedicating one CPU to a particular process (i.e., setting the affinity mask of that process to specify a single CPU, and setting the affinity mask of all other processes to exclude that CPU), it is possible to ensure maximum execution speed for that process. Restricting a process to run on a single CPU also prevents the performance cost caused by the cache invalidation that occurs when a process ceases to execute on one CPU and then recommences execution on a different CPU.A CPU affinity mask is represented by the%uA0cpu_set_t%uA0structure, a "CPU set", pointed to by%uA0mask. Four macros are provided to manipulate CPU sets.%uA0CPU_ZERO() clears a set.CPU_SET() and%uA0CPU_CLR() respectively add and remove a given CPU from a set.CPU_ISSET() tests to see if a CPU is part of the set this is useful aftersched_getaffinity() returns. The first available CPU on the system corresponds to a%uA0cpuvalue of 0, the next CPU corresponds to a%uA0cpu%uA0value of 1, and so on. The constantCPU_SETSIZE%uA0(1024) specifies a value one greater than the maximum CPU number that can be stored in a CPU set.
sched_setaffinity() sets the CPU affinity mask of the process whose ID is%uA0pid%uA0to the value specified by%uA0mask. If%uA0pid%uA0is zero, then the calling process is used. The argumentcpusetsize%uA0is the length (in bytes) of the data pointed to by%uA0mask. Normally this argument would be specified as%uA0sizeof(cpu_set_t).
If the process specified by%uA0pid%uA0is not currently running on one of the CPUs specified inmask, then that process is migrated to one of the CPUs specified in%uA0mask.
sched_getaffinity() writes the affinity mask of the process whose ID is%uA0pid%uA0into thecpu_set_t%uA0structure pointed to by%uA0mask. The%uA0cpusetsize%uA0argument specifies the size (in bytes) of%uA0mask. If%uA0pid%uA0is zero, then the mask of the calling process is returned.
返回值
On success,%uA0sched_setaffinity() and%uA0sched_getaffinity() return 0. On error, -1 is returned, and%uA0errno%uA0is set appropriately.错误
标签 | 描述 |
---|---|
EFAULT | A supplied memory address was invalid. |
EINVAL | The affinity bitmask%uA0mask%uA0contains no processors that are physically on the system, or%uA0cpusetsize%uA0is smaller than the size of the affinity mask used by the kernel. |
EPERM | The calling process does not have appropriate privileges. The process calling%uA0sched_setaffinity() needs an effective user ID equal to the user ID or effective user ID of the process identified by%uA0pid, or it must possess the%uA0CAP_SYS_NICEꃊpability. |
ESRCH | The process whose ID is%uA0pid%uA0could not be found. |
遵循于
这些系统调用是Linux特有的。注意
The affinity mask is actually a per-thread attribute that can be adjusted independently for each of the threads in a thread group. The value returned from a call to%uA0gettid(2) can be passed in the argument%uA0pid.A child created via%uA0fork(2) inherits its parent’s CPU affinity mask. The affinity mask is preserved across an%uA0execve(2).
This manual page describes the glibc interface for the CPU affinity calls. The actual system call interface is slightly different, with the%uA0maskꂾing typed as%uA0unsigned long *, reflecting that the fact that the underlying implementation of CPU sets is a simple bitmask. On success, the raw%uA0sched_getaffinity() system call returns the size (in bytes) of the%uA0cpumask_tꃚta type that is used internally by the kernel to represent the CPU set bitmask.