Как определить, на каком процессоре работает поток? - программирование
Подтвердить что ты не робот

Как определить, на каком процессоре работает поток?

Есть ли способ определить, на каком процессоре работает данный поток? Предпочтительно в С#, но С++ будет делать.

В классах .NET Process и ProcessThread эти данные не отображаются.

Разъяснения ETA:

Мы разрабатываем серверное приложение, которое обрабатывает HTTP-многоадресные потоки и порождает несколько видеокодеров. Это работает на системе с 12 физическими ядрами, что приводит к 24 логическим процессорам (гиперпоточность). Через TaskManager и ProcessExplorer мы проверили, что наши порожденные процессы равномерно распределяются по логическим процессорам. Тем не менее, мы видим много (ядро?) Активность только на одном CPU, который мешает, потребляя необычное количество процессорного времени. Мы пытаемся определить, какие процессы (процессы)/потоки выполняются на этом конкретном процессоре. Кажется, что ни TaskManager, ни ProcessExplorer не предоставляют эту информацию. Если они это сделают, объясните, как можно получить такую ​​информацию.

В противном случае мы планируем написать наш собственный инструмент для получения этой информации. И это то, с чем нам нужна помощь.

Мы знаем, как изменить аффинность потоков (и мы знаем, что нет гарантии, что поток останется связанным с каким-либо процессором, хотя в этом конкретном случае поток (ы), потребляющий процессор, остается связанным только с одним процессором), но для этого нам нужно сначала определить, какой процесс/поток необходимо переместить. Это единственная цель этого вопроса.

Надеюсь, это поможет прояснить проблему.

4b9b3361

Ответ 1

Из MSDN, используя свойство ProcessThread.ProcessorAffinity, вы можете установить сходство потоков, но вы не сможете его получить. По умолчанию потоки не имеют сродства (могут работать на любом процессоре).

using System;
using System.Diagnostics;

namespace ProcessThreadIdealProcessor
{
    class Program
    {
        static void Main(string[] args)
        {
            // Make sure there is an instance of notepad running.
            Process[] notepads = Process.GetProcessesByName("notepad");
            if (notepads.Length == 0)
                Process.Start("notepad");
            ProcessThreadCollection threads;
            //Process[] notepads;
            // Retrieve the Notepad processes.
            notepads = Process.GetProcessesByName("Notepad");
            // Get the ProcessThread collection for the first instance
            threads = notepads[0].Threads;
            // Set the properties on the first ProcessThread in the collection
            threads[0].IdealProcessor = 0;
            threads[0].ProcessorAffinity = (IntPtr)1;
        }
    }
}

Аналогично Thread.SetProcessorAffinity делает то же самое.

Ответ 2

Это невозможно сделать непрерывным надежным способом. Планировщик задач ОС оптимизирует потоки и разбивает нагрузку между доступными ядрами ЦП. В общем случае поток может выполняться на любом CPU. Более того, с помощью контекстных переключателей он также может изменить его CPU.

Если вам нужно указать конкретный поток или процесс, вы можете назначить его близость, поэтому у вас есть разумная надежда, что процесс/поток будет выполняться на определенном логическом процессоре.