Нитки ядра в posix - PullRequest
       6

Нитки ядра в posix

0 голосов
/ 04 ноября 2011

Насколько я понимаю, ядро ​​имеет потоки ядра для каждого ядра в компьютере, и потоки из пользовательского пространства распределяются по этим потокам ядра (ОС решает, какой поток из приложения подключается к какому потоку ядра).Допустим, я хочу создать приложение, которое использует число ядер X на компьютере с ядрами X.Если я использую обычные pthreads, я думаю, что вполне возможно, что ОС решит, что все созданные мной потоки будут запланированы на одно ядро.Как я могу убедиться, что каждый поток один на один с потоками ядра?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Вы должны в основном доверять используемому ядру (в частности, потому что может быть запущен другой тяжелый процесс; планировщик ядра выберет задачи, которые будут выполняться в течение определенного периода времени).

Возможно, вас интересует сродство ЦП с непереносимыми функциями, такими как pthread_attr_setaffinity_np

0 голосов
/ 04 ноября 2011

То, что вы упоминаете, является одной из возможных моделей для реализации потоков.Но такая иерархическая модель может вообще не следовать заданной реализации потока POSIX.Поскольку кто-то уже упоминал о linux, у него его нет, все потоки равны с точки зрения планировщика.Они конкурируют за одни и те же ресурсы, если вы не укажете что-то дополнительное.

В последний раз я видел такую ​​иерархическую модель на машине с операционной системой IRIX, давным-давно.

ИтакТаким образом, в POSIX не существует общего правила для этого, вам придется поискать документацию по вашей конкретной ОС или задать более конкретный вопрос по этому поводу.

0 голосов
/ 04 ноября 2011

Вы понимаете, это немного не так.'kernelthreads' в Linux - это в основном задачи ядра, которые запланированы вместе с другими процессами и потоками.Когда запускается планировщик ядра, алгоритм планирования решает, какой процесс / поток из пула выполняемых потоков планируется запустить следующим на данном ядре ЦП.Как упомянул @Basile Starynkevitch, вы можете указать ядру привязать отдельные потоки из вашего приложения к конкретному ядру, что означает, что планировщик операционной системы будет рассматривать возможность запуска только на этом ядре, наряду с другими потоками, которые не прикреплены к конкретному ядру.

В общем случае с многопоточностью вы не хотите, чтобы количество потоков было равно количеству ядер, если только вы не выполняете исключительно процессорную обработку, вам нужно количество потоков> количество ядер,При ожидании сетевого или дискового ввода-вывода (т. Е. Когда вы ожидаете в accept (2), recv (2) или read (2)) ваш поток не считается работоспособным.Если N потоков> N ядер, операционная система может запланировать выполнение другого потока во время ожидания этого ввода-вывода.

...