我需要问这个问题只是为了仔细检查答案。
命令的顺序是否重要?例如:
这是命令
taskset 0x2 time echo "foo"
等于
time taskset 0x2 echo "foo"
我需要知道任务集所遵循的所有命令是否具有相同的CPU关联性,或者只是紧跟在它之后的命令。
答案 0 :(得分:2)
我需要知道
taskset
后面的所有命令是否都有 相同的CPU亲和力或紧随其后的命令。
这是一个小实验:
启动两项BG任务
$ > taskset 0x2 sleep 50 & sleep 60 &
获取他们的PID
$ > ps
PID TTY TIME CMD
18562 pts/81 00:00:00 bash
20750 pts/81 00:00:00 sleep
20751 pts/81 00:00:00 sleep
20752 pts/81 00:00:00 ps
获取已知PID的CPU亲和力:
$ > taskset -p 20750
pid 20750's current affinity mask: 2
$ > taskset -p 20751
pid 20751's current affinity mask: 3f
因此,似乎只为第一个进程设置了CPU亲和力。
更新(尝试解释以下行为):
/usr/bin/time taskset 0x2 sleep 100000
=>只有sleep
获得亲和力掩码2
(有点期待!) taskset 0x2 /usr/bin/time sleep 100000
=> time
和sleep
都会获得亲和力掩码2
(需要澄清!) 在第二种情况下,让我们调用ps -f
来获取每个进程的PPID(父PID):
$> taskset 0x2 /usr/bin/time sleep 60 &
[1] 5942
$> ps -f
UID PID PPID C STIME TTY TIME CMD
user 5942 9698 0 18:19 pts/261 00:00:00 /usr/bin/time sleep 60
user 5943 5942 0 18:19 pts/261 00:00:00 sleep 60
user 5944 9698 0 18:19 pts/261 00:00:00 ps -f
user 9509 9508 0 16:19 pts/261 00:00:00 -bash
user 9698 9509 0 16:20 pts/261 00:00:00 bash
$> taskset -p 5942
pid 5942's current affinity mask: 2
$> taskset -p 5943
pid 5943's current affinity mask: 2
可以看出sleep
的PPID(5942)对应于/usr/bin/time
的PID(5942)。 IOW sleep
是的子进程(已从分叉)/usr/bin/time
。由于任何子进程都继承父进程的配置,因此sleep
与/usr/bin/time
具有相同的CPU关联。
答案 1 :(得分:1)
你好像在这里问两个不同的问题 - "它们是等同的吗?"和"继承了CPU亲和力?"。
首先,您列出的两个命令不是等效。第一个:
taskset 0x2 time echo "foo"
假设PATH
与我当前主持人类似的设置,相当于:
/bin/taskset 0x2 /usr/bin/time /bin/echo "foo"
生成这样的流程树:
/bin/taskset
|
\- /usr/bin/time
|
\- /bin/echo
第二个:
time taskset 0x2 echo "foo"
相当于/bin/taskset 0x2 /bin/echo "foo"
内置bash
包裹的time
,生成此进程树:
/bin/taskset
|
\- /bin/echo
在这种情况下,只有两个外部流程 - time
部分由bash
内部处理,而不是调用/usr/bin/time
。
要回答第二个问题,CPU亲和力在Linux中继承,因此您的第一个示例会将/usr/bin/time
和/bin/echo
绑定到指定的CPU集。在第二个示例中,由于time
是内置的shell,因此它将受bash
本身上的任何CPU关联设置的影响,而不受当前命令行中的taskset
的影响。