命令的可交换 属性

Commutative property of the commands

我需要问这个问题只是为了仔细检查答案。

命令的顺序重要吗?例如:

这是命令吗

 taskset 0x2 time echo "foo"

等于

time taskset 0x2 echo "foo"

?

我需要知道任务集后面的所有命令是否具有相同的 CPU 亲和力,或者只是紧随其后的命令。

I need to know if all the commands followed by the taskset will have the same CPU affinity or just the command immediately after it.

这里有一个小实验:

开始两个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 affinity 只为第一个进程设置。


更新(试图解释以下行为):

  1. /usr/bin/time taskset 0x2 sleep 100000=> 只有 sleep 得到亲和掩码 2 (有点期待!)
  2. taskset 0x2 /usr/bin/time sleep 100000 => timesleep 都得到亲和掩码 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 亲和力。

您似乎在问两个不同的问题 - "are they equivalent?" 和 "is CPU affinity inherited?"。

首先,您列出的两个命令是等价的。第一个:

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 affinity 在 Linux 中继承,因此你的第一个示例会将 /usr/bin/time/bin/echo 绑定到指定的 CPU 套。在第二个示例中,由于 time 是 shell 内置函数,它会受到 bash 本身上设置的任何 CPU 亲和力的影响,而不是 taskset 中的 taskset当前命令行。