命令的交换属性

时间:2015-06-11 09:07:23

标签: bash shell taskaffinity

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

命令的顺序是否重要?例如:

这是命令

 taskset 0x2 time echo "foo"

等于

time taskset 0x2 echo "foo"

我需要知道任务集所遵循的所有命令是否具有相同的CPU关联性,或者只是紧跟在它之后的命令。

2 个答案:

答案 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亲和力。

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

  1. /usr/bin/time taskset 0x2 sleep 100000 =>只有sleep获得亲和力掩码2 (有点期待!)
  2. taskset 0x2 /usr/bin/time sleep 100000 => timesleep都会获得亲和力掩码2 (需要澄清!)
  3. 在第二种情况下,让我们调用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的影响。