Articles of 调度器

为什么Linux的调度程序将两个线程放在具有超线程的处理器的相同物理内核上?

我读过多处,Linux的默认调度程序在多核机器上是超线程感知的 ,这意味着如果你有一台拥有2个真实核心(4 HT)的机器,它不会将两个繁忙的线程调度到逻辑核心上他们都运行在相同的物理内核上(这在很多情况下会导致性能成本的2倍)。 但是当我在英特尔i5-2520M上运行stress -c 2 (产生两个线程在100%的CPU上运行)时, 它经常 将两个线程 调度 (并保持) 到HT核心1和2上,这两个线程映射到相同的物理核心 。 即使系统空闲,否则。 这也发生在真正的程序(我在这里使用stress ,因为它使得它很容易重现),当这种情况发生时,我的程序可以理解需要两倍的时间运行。 使用taskset手动设置亲和力可以修复我的程序,但是我希望HT认知调度程序能够自己正确地做到这一点。 您可以使用egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'findHT->物理核心configurationegrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g' egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g' 。 所以我的问题是:为什么调度程序把我的线程放在同一个物理内核上呢? 笔记: 这个问题与这个问题非常相似,答案就是说Linux有一个非常复杂的HT调度线程调度器 。 如上所述,我无法观察到这个事实(检查自己的stress -c ),并想知道为什么。 我知道我可以为我的程序手动设置处理器关联,例如使用taskset工具或sched_setaffinity函数。 这不是我正在寻找的,我希望调度程序自己知道把两个繁忙的线程映射到一个物理核心并将一个物理核心完全清空并不是一个好主意。 我知道在某些情况下 ,你更喜欢把线程安排在同一个物理核心上,而把另一个核心放在空闲的位置,但是调度程序大概只有1/4的情况似乎是无意义的。 在我看来,它select的HT内核是完全随机的,或者是在调度时活动最less的HT内核,但是这并不是非常了解超线程的,因为考虑到stress特性的程序有多好从单独的物理内核运行。

Java – IO绑定线程 – 1:1线程模型

在下面的程序中, //Producer – IO bound public class FileCrawler implements Runnable{ private final BlockingQueue<File> fileQueue; private final File root; …. public void run(){ try{ crawl(root); // IO bound }catch(InterruptedException e){ Thread.currentThread().interrupt(); } } private void crawl(File root) throws InterruptedException{ File[] entries = root.listFiles(fileFilter); … for(File entry: entries){ fileQueue.put(entry); } } } //Consumer – CPU bound public […]

我怎样才能看到哪个CPU内核正在运行一个线程?

在Linux中,假设一个线程的pid是[pid],从目录/ proc / [pid]中可以得到很多有用的信息。 例如,这些proc文件/ proc / [pid] / status,/ proc / [pid] / stat和/ proc / [pid] / schedstat都是有用的。 但是我怎么能得到一个线程正在运行的CPU核心号码? 如果一个线程处于睡眠状态,我怎么能知道它将在再次调度之后运行哪个核心? 顺便说一句,有没有办法转储每个CPU核心的运行和睡眠任务的进程(线程)列表?

如何创build一个新的Linux内核调度程序

查看调度程序源代码(2.6.34,kernel / sched.c),我可以看到“可插拔”调度程序是如何使用的,我相信我理解要实现的接口。 我不明白的是如何让我的代码内置到内核。 至less,指向其他网站,将不胜感激。 现在,我在内核源代码树中查找SCHED_FIFO,SCHED_RR和SCHED_NORMAL,所以我正在寻找更有见地的方式来看看它:-) 编辑:作为一些背景,我非常熟悉FreeBSD调度程序(以及一般的FreeBSD内核),所以我不在寻找如何执行进程/线程级调度的指针。 我正在寻找一种方法来将我自己的调度程序与普通的linux调度程序(类似于SCHED_FIFO)一起添加。 编辑#2:下面的BFS指针是一个好的开始,但它仍然将CFS从内核中剥离出来。 sched.c现在看起来像: #ifdef CONFIG_SCHED_BFS #include "sched_bfs.c" #else // original sched.c #endif // CONFIG_SCHED_BFS 我很乐意看到一个答案或一个指示,说明如何做得更好(即保持CFS,至less现在)。 编辑#3:我已经回答了我自己的问题,因为我想我已经知道了。

C ++ – Sleep()和cin如何工作?

只是好奇。 Sleep()函数实际上是如何工作的(在windows.h中声明的)? 也许不仅仅是这个实现,而是任何人。 我的意思是 – 它是如何实现的? 如何使代码在特定时间“停止”? 也好奇cin >>和那些实际上工作 。 他们究竟做了什么? 我知道如何“阻止”继续运行的唯一方法是使用while循环,但是考虑到这与处理从stdin读取方法时发生的情况相比,需要大量的处理能力(只是比较一段时间(真正)从标准input读取),我猜这不是他们做的。

为什么将multithreading应用程序限制到一个内核会使其运行速度更快?

我有一个用C ++编写的本地multithreadingWin32应用程序,它有大约3个相对繁忙的线程和4到6个线程,这些线程没有那么多。 当它运行在正常模式下时,总共CPU使用率在8核机器上增加了大约15%,应用程序在大约30秒内完成。 而当我通过将亲和性掩码设置为0x01将应用程序限制为仅一个核心时,它在23秒内完成得更快。 我猜测它与限制在一个物理内核和/或一些并发内存访问问题上的同步更便宜有关。 我正在运行Windows 7 x64,应用程序是32位。 CPU是Xeon X5570,具有4个核心并启用了HT。 任何人都可以详细解释这种行为吗? 为什么会发生这种情况,以及如何提前预测这种行为? 更新:我想我的问题不是很清楚。 我想知道为什么它在一个物理内核上变得更快,而不是为什么在多个内核上它不会达到15%以上。

Windows中进程的最短保证时间是多less?

我有一个进程提供一个具有特定缓冲区大小的硬件(数据传输设备)。 我可以从Windows调度程序窗口合理的期望,以确保我没有得到一个缓冲区下溢? 我的缓冲区大小为32K,以〜800k字节/秒的速度消耗。 如果我填写16k字节的批量,每20ms一个批量。 但是,我填充的下限是多less? 如果说,我在填充循环中调用sleep(0),那么我最合适的最坏情况调度间隔是多less? OS = Windows XP SP3双核2.2Ghz 请注意,我正在进行API调用以检查缓冲区填充级别以及对驱动程序API的调用以将其传递给数据。 我假设这些是Windows除了睡眠(0)之外可以使用的调度点。 我想(作为一个过程)performance出色,仍然能够实现我的实时期限。 机器专门负责此任务,但需要通过networking接收数据并将其发送到IO设备。 我对调度程序的性能有什么期望? 还有什么我需要考虑。