我想尝试一下线程和并行性。我知道我的处理器有多个内核,但不知道如何查看每个内核上发生的情况。访问此信息的正确方法是什么?
更具体地说,我正在计划以下内容:我想象编写一个启动多个线程的小程序,然后这些线程应该分布在核心上并在需要时相互通信。我希望能够观察哪个线程正在运行,有什么提示吗?
我对尝试这种事情完全陌生(我也很高兴与此相关的任何信息不直接解决这个问题)。
最好的,巴特
(谷歌搜索只让我找到“cat /proc/cpuinfo”,这似乎告诉我我有 7 个处理器。这不是事实,这告诉我我不知道如何读取这个输出。)
答案1
每个核心都有自己的条目/proc/cpuinfo
,因此这里有很多冗余信息。
要了解您拥有多少个 cpu 和/或核心,请执行以下操作:
# egrep 'processor|core id|physical id' /proc/cpuinfo
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
这是在我的单芯片双核计算机上运行的。所以我有两个核心,编号为0和1,但是它们都属于物理cpu 0。
记住,计算机专家喜欢从 0 开始数。
以下是双 CPU、单核系统的输出:
$ egrep 'processor|core id|physical id' /proc/cpuinfo
processor : 0
processor : 1
所以我有两个 CPU,但由于没有指定内核,所以我知道每个处理器芯片都有一个内核。
还有一点更有趣:
$ egrep 'processor|core id|physical id' /proc/cpuinfo
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
processor : 2
physical id : 1
core id : 0
processor : 3
physical id : 1
core id : 1
这是我的双CPU双核系统。我有“处理器”0-3,每个处理器都位于处理器 0 或 1 上,作为核心 0 或 1。
你明白了。
综上所述,我怀疑您有一个双 CPU 四核系统,处理器为 0 到 7。
答案2
处理器数量:请注意,编号从 0 开始,因此如果我有处理器 1,我至少有 2 个
绑定到线程线程不会绑定到 CPU(除非您通过使用 cpulimit 和 co. 来实现技巧 - 在大多数情况下您不应该这样做)。假设您已将内核配置为 1000Hz 并且没有 I/O,则上下文切换每秒完成 1000 次。现在,在我的 2 个处理器设置中,此时大约有 300 个线程正在运行,这意味着每个进程将分配 6.(6) 个插槽。可以安全地假设在任何时刻每个进程都会占用两个核心。
鉴于 - 楼梯算法,I/O 使其不一定为真,但一秒钟的每个线程可能位于两个内核上 - 以及在等待时不运行(因此它不受任何内核的限制)。
超线程我猜你有 4 核 Intel iX 和超线程(除非你有双处理器机器)。超线程通过模拟单独的核心来工作。因此,如果进程正在等待一个内核的 I/O,它可以切换到执行另一个内核 - 这当然会让事情变得更加复杂。