首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >命令的交换性质

命令的交换性质
EN

Stack Overflow用户
提问于 2015-06-11 09:07:23
回答 2查看 212关注 0票数 2

我需要问这个问题,只是为了复核答案。

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

这个命令是

代码语言:javascript
运行
复制
 taskset 0x2 time echo "foo"

相等于

代码语言:javascript
运行
复制
time taskset 0x2 echo "foo"

我需要知道,任务集后面的所有命令是否都具有相同的CPU关联,或者仅仅是紧随其后的命令。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-11 10:01:39

我需要知道taskset后面的所有命令是否都具有相同的CPU关联,或者仅仅是后面的命令。

下面是一个小实验:

开始两个BG任务

代码语言:javascript
运行
复制
$ > taskset 0x2 sleep 50 & sleep 60 &

拿到他们的PID

代码语言:javascript
运行
复制
$ > 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关联:

代码语言:javascript
运行
复制
$ > taskset -p 20750
pid 20750's current affinity mask: 2
$ > taskset -p 20751
pid 20751's current affinity mask: 3f

因此,似乎只为第一个进程设置了CPU关联。

Update (试图解释以下行为):

  1. /usr/bin/time taskset 0x2 sleep 100000=>只有sleep才能获得亲和掩码2 (有点期待!)
  2. taskset 0x2 /usr/bin/time sleep 100000 => timesleep都得到了亲和掩码2 (需要澄清!)

在第二种情况下,让我们调用ps -f来获取每个进程的PPID (父PID):

代码语言:javascript
运行
复制
$> 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亲和力。

票数 2
EN

Stack Overflow用户

发布于 2015-06-16 18:51:02

你好像在问两个不同的问题--“它们是等价的吗?”和“CPU亲缘关系继承了吗?”。

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

代码语言:javascript
运行
复制
taskset 0x2 time echo "foo"

假设PATH和与我目前所使用的主机类似的设置,相当于:

代码语言:javascript
运行
复制
/bin/taskset 0x2 /usr/bin/time /bin/echo "foo"

生成这样的过程树:

代码语言:javascript
运行
复制
/bin/taskset
    |
    \- /usr/bin/time
            |
            \- /bin/echo

第二部分:

代码语言:javascript
运行
复制
time taskset 0x2 echo "foo"

它相当于由/bin/taskset 0x2 /bin/echo "foo"内置time包装的bash,生成这个过程树:

代码语言:javascript
运行
复制
/bin/taskset
    |
    \- /bin/echo

在这种情况下,只有两个外部进程-- time部件由bash内部处理,而不是调用/usr/bin/time

为了回答第二个问题,CPU亲和力是在Linux中继承的,所以您的第一个示例将/usr/bin/time/bin/echo绑定到指定的CPU集。在第二个示例中,由于time是shell内置的,因此它将受到bash本身上的任何CPU关联设置的影响,而不是受当前命令行中的taskset的影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30776315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档