1 .\" Copyright (C) 2002 Robert Love
2 .\" and Copyright (C) 2006, 2015 Michael Kerrisk
4 .\" %%%LICENSE_START(GPLv2+_DOC_FULL)
5 .\" This is free documentation; you can redistribute it and/or
6 .\" modify it under the terms of the GNU General Public License as
7 .\" published by the Free Software Foundation; either version 2 of
8 .\" the License, or (at your option) any later version.
10 .\" The GNU General Public License's references to "object code"
11 .\" and "executables" are to be interpreted as the output of any
12 .\" document formatting or typesetting system, including
13 .\" intermediate and printed output.
15 .\" This manual is distributed in the hope that it will be useful,
16 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
17 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 .\" GNU General Public License for more details.
20 .\" You should have received a copy of the GNU General Public
21 .\" License along with this manual; if not, see
22 .\" <http://www.gnu.org/licenses/>.
25 .\" 2002-11-19 Robert Love <rml@tech9.net> - initial version
26 .\" 2004-04-20 mtk - fixed description of return value
27 .\" 2004-04-22 aeb - added glibc prototype history
28 .\" 2005-05-03 mtk - noted that sched_setaffinity may cause thread
29 .\" migration and that CPU affinity is a per-thread attribute.
30 .\" 2006-02-03 mtk -- Major rewrite
31 .\" 2008-11-12, mtk, removed CPU_*() macro descriptions to a
32 .\" separate CPU_SET(3) page.
34 .TH SCHED_SETAFFINITY 2 2021-03-22 "Linux" "Linux Programmer's Manual"
36 sched_setaffinity, sched_getaffinity \- \
37 set and get a thread's CPU affinity mask
40 .BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
43 .BI "int sched_setaffinity(pid_t " pid ", size_t " cpusetsize ,
44 .BI " const cpu_set_t *" mask );
45 .BI "int sched_getaffinity(pid_t " pid ", size_t " cpusetsize ,
46 .BI " cpu_set_t *" mask );
49 A thread's CPU affinity mask determines the set of CPUs on which
50 it is eligible to run.
51 On a multiprocessor system, setting the CPU affinity mask
52 can be used to obtain performance benefits.
54 by dedicating one CPU to a particular thread
55 (i.e., setting the affinity mask of that thread to specify a single CPU,
56 and setting the affinity mask of all other threads to exclude that CPU),
57 it is possible to ensure maximum execution speed for that thread.
58 Restricting a thread to run on a single CPU also avoids
59 the performance cost caused by the cache invalidation that occurs
60 when a thread ceases to execute on one CPU and then
61 recommences execution on a different CPU.
63 A CPU affinity mask is represented by the
65 structure, a "CPU set", pointed to by
67 A set of macros for manipulating CPU sets is described in
70 .BR sched_setaffinity ()
71 sets the CPU affinity mask of the thread whose ID is
73 to the value specified by
77 is zero, then the calling thread is used.
80 is the length (in bytes) of the data pointed to by
82 Normally this argument would be specified as
83 .IR "sizeof(cpu_set_t)" .
85 If the thread specified by
87 is not currently running on one of the CPUs specified in
89 then that thread is migrated to one of the CPUs specified in
92 .BR sched_getaffinity ()
93 writes the affinity mask of the thread whose ID is
97 structure pointed to by
101 argument specifies the size (in bytes) of
105 is zero, then the mask of the calling thread is returned.
108 .BR sched_setaffinity ()
110 .BR sched_getaffinity ()
111 return 0 (but see "C library/kernel differences" below,
112 which notes that the underlying
113 .BR sched_getaffinity ()
114 differs in its return value).
115 On failure, \-1 is returned, and
117 is set to indicate the error.
121 A supplied memory address was invalid.
124 The affinity bit mask
126 contains no processors that are currently physically on the system
127 and permitted to the thread according to any restrictions that
130 cgroups or the "cpuset" mechanism described in
134 .RB ( sched_getaffinity ()
135 and, in kernels before 2.6.9,
136 .BR sched_setaffinity ())
138 is smaller than the size of the affinity mask used by the kernel.
141 .RB ( sched_setaffinity ())
142 The calling thread does not have appropriate privileges.
143 The caller needs an effective user ID equal to the real user ID
144 or effective user ID of the thread identified by
146 or it must possess the
148 capability in the user namespace of the thread
152 The thread whose ID is \fIpid\fP could not be found.
154 The CPU affinity system calls were introduced in Linux kernel 2.5.8.
155 The system call wrappers were introduced in glibc 2.3.
156 Initially, the glibc interfaces included a
162 argument was removed, but was then restored in glibc 2.3.4, with type
165 These system calls are Linux-specific.
168 .BR sched_setaffinity (),
169 the set of CPUs on which the thread will actually run is
170 the intersection of the set specified in the
172 argument and the set of CPUs actually present on the system.
173 The system may further restrict the set of CPUs on which the thread
174 runs if the "cpuset" mechanism described in
177 These restrictions on the actual set of CPUs on which the thread
178 will run are silently imposed by the kernel.
180 There are various ways of determining the number of CPUs
181 available on the system, including: inspecting the contents of
185 to obtain the values of the
186 .BR _SC_NPROCESSORS_CONF
188 .BR _SC_NPROCESSORS_ONLN
189 parameters; and inspecting the list of CPU directories under
190 .IR /sys/devices/system/cpu/ .
193 has a description of the Linux scheduling scheme.
195 The affinity mask is a per-thread attribute that can be
196 adjusted independently for each of the threads in a thread group.
197 The value returned from a call to
199 can be passed in the argument
203 as 0 will set the attribute for the calling thread,
204 and passing the value returned from a call to
206 will set the attribute for the main thread of the thread group.
207 (If you are using the POSIX threads API, then use
208 .BR pthread_setaffinity_np (3)
210 .BR sched_setaffinity ().)
214 boot option can be used to isolate one or more CPUs at boot time,
215 so that no processes are scheduled onto those CPUs.
216 Following the use of this boot option,
217 the only way to schedule processes onto the isolated CPUs is via
218 .BR sched_setaffinity ()
222 For further information, see the kernel source file
223 .IR Documentation/admin\-guide/kernel\-parameters.txt .
224 As noted in that file,
226 is the preferred mechanism of isolating CPUs
227 (versus the alternative of manually setting the CPU affinity
228 of all processes on the system).
232 inherits its parent's CPU affinity mask.
233 The affinity mask is preserved across an
235 .SS C library/kernel differences
236 This manual page describes the glibc interface for the CPU affinity calls.
237 The actual system call interface is slightly different, with the
240 .IR "unsigned long\ *" ,
241 reflecting the fact that the underlying implementation of CPU
242 sets is a simple bit mask.
245 .BR sched_getaffinity ()
246 system call returns the number of bytes placed copied into the
249 this will be the minimum of
251 and the size (in bytes) of the
253 data type that is used internally by the kernel to
254 represent the CPU set bit mask.
255 .SS Handling systems with large CPU affinity masks
256 The underlying system calls (which represent CPU masks as bit masks of type
257 .IR "unsigned long\ *" )
258 impose no restriction on the size of the CPU mask.
261 data type used by glibc has a fixed size of 128 bytes,
262 meaning that the maximum CPU number that can be represented is 1023.
263 .\" FIXME . See https://sourceware.org/bugzilla/show_bug.cgi?id=15630
264 .\" and https://sourceware.org/ml/libc-alpha/2013-07/msg00288.html
265 If the kernel CPU affinity mask is larger than 1024,
266 then calls of the form:
268 sched_getaffinity(pid, sizeof(cpu_set_t), &mask);
272 the error produced by the underlying system call for the case where the
276 is smaller than the size of the affinity mask used by the kernel.
277 (Depending on the system CPU topology, the kernel affinity mask can
278 be substantially larger than the number of active CPUs in the system.)
280 When working on systems with large kernel CPU affinity masks,
281 one must dynamically allocate the
285 Currently, the only way to do this is by probing for the size
286 of the required mask using
287 .BR sched_getaffinity ()
288 calls with increasing mask sizes (until the call does not fail with the error
293 may allocate a slightly larger CPU set than requested
294 (because CPU sets are implemented as bit masks allocated in units of
297 .BR sched_getaffinity ()
298 can set bits beyond the requested allocation size, because the kernel
299 sees a few additional bits.
300 Therefore, the caller should iterate over the bits in the returned set,
301 counting those which are set, and stop upon reaching the value returned by
303 (rather than iterating over the number of bits
304 requested to be allocated).
306 The program below creates a child process.
307 The parent and child then each assign themselves to a specified CPU
308 and execute identical loops that consume some CPU time.
309 Before terminating, the parent waits for the child to complete.
310 The program takes three command-line arguments:
311 the CPU number for the parent,
312 the CPU number for the child,
313 and the number of loop iterations that both processes should perform.
315 As the sample runs below demonstrate, the amount of real and CPU time
316 consumed when running the program will depend on intra-core caching effects
317 and whether the processes are using the same CPU.
321 to determine that this (x86)
322 system has two cores, each with two CPUs:
326 $ \fBlscpu | egrep \-i \(aqcore.*:|socket\(aq\fP
327 Thread(s) per core: 2
328 Core(s) per socket: 2
333 We then time the operation of the example program for three cases:
334 both processes running on the same CPU;
335 both processes running on different CPUs on the same core;
336 and both processes running on different CPUs on different cores.
340 $ \fBtime \-p ./a.out 0 0 100000000\fP
344 $ \fBtime \-p ./a.out 0 1 100000000\fP
348 $ \fBtime \-p ./a.out 0 3 100000000\fP
362 #include <sys/wait.h>
364 #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e
368 main(int argc, char *argv[])
371 int parentCPU, childCPU;
375 fprintf(stderr, "Usage: %s parent\-cpu child\-cpu num\-loops\en",
380 parentCPU = atoi(argv[1]);
381 childCPU = atoi(argv[2]);
382 nloops = atoi(argv[3]);
387 case \-1: /* Error */
391 CPU_SET(childCPU, &set);
393 if (sched_setaffinity(getpid(), sizeof(set), &set) == \-1)
394 errExit("sched_setaffinity");
396 for (int j = 0; j < nloops; j++)
401 default: /* Parent */
402 CPU_SET(parentCPU, &set);
404 if (sched_setaffinity(getpid(), sizeof(set), &set) == \-1)
405 errExit("sched_setaffinity");
407 for (int j = 0; j < nloops; j++)
410 wait(NULL); /* Wait for child to terminate */
426 .BR sched_get_priority_max (2),
427 .BR sched_get_priority_min (2),
428 .BR sched_getscheduler (2),
429 .BR sched_setscheduler (2),
433 .BR pthread_setaffinity_np (3),
434 .BR sched_getcpu (3),
435 .BR capabilities (7),