我需要问这个问题只是为了仔细检查答案。
命令的顺序重要吗?例如:
是这个命令吗
taskset 0x2 time echo "foo"
等于
time taskset 0x2 echo "foo"
?
我需要知道任务集后面的所有命令是否具有相同的 CPU 亲和性,或者只是紧随其后的命令。
我需要问这个问题只是为了仔细检查答案。
命令的顺序重要吗?例如:
是这个命令吗
taskset 0x2 time echo "foo"
等于
time taskset 0x2 echo "foo"
?
我需要知道任务集后面的所有命令是否具有相同的 CPU 亲和性,或者只是紧随其后的命令。
我需要知道紧随其后的所有命令
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
's PPID(5942)对应/usr/bin/time
''s PID(5942)。IOWsleep
是(has be fork from )的子进程/usr/bin/time
。因为任何子进程都继承了父进程的配置,所以sleep
与/usr/bin/time
.
你似乎在这里问了两个不同的问题——“它们是等价的吗?” 和“是否继承了 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"
相当于由builtin/bin/taskset 0x2 /bin/echo "foo"
包装,产生这个进程树:bash
time
/bin/taskset
|
\- /bin/echo
在这种情况下,只有两个外部进程 - 该time
部分由内部处理bash
而不是调用/usr/bin/time
.
要回答您的第二个问题,Linux 中继承了 CPU 亲和性,因此您的第一个示例将同时绑定/usr/bin/time
和绑定/bin/echo
到指定的 CPU 集。在第二个例子中,由于time
是内置的 shell,它会受到任何在bash
其自身上设置的 CPU 关联性的影响,而不是受taskset
当前命令行中的 影响。