Как Linux обрабатывает потоки и планирование процессов

19

Я пытаюсь понять, как linux обрабатывает планирование процессов и планирование потоков. Я читал, что linux может планировать как процессы, так и потоки.

Мой вопрос: у linux есть планировщик потоков и планировщик процессов? если да, то как они сотрудничают?

    
задан whitefox 11.12.2011 в 12:50
источник
  • Это зависит от типа потоков, которые вы хотели бы использовать. Какую библиотеку потоков вы используете? –  pajton 11.12.2011 в 12:55
  • Я вообще говорю о потоках ядра, а не о потоках пользователей. Я не знаю, что такое библиотека потоков ... –  whitefox 11.12.2011 в 12:59

3 ответа

28

планировщик ядра Linux на самом деле планирует задачи, и это либо потоки или (однопоточных) процессов.

Итак, задача ( task_struct внутри ядра) в контексте планировщика - это планируемая вещь и может быть частью потока ядра как kworker или kswapd , некоторый пользовательский поток многопоточного процесса (например, firefox ) или однопоточный процесс однопоточный процесс em> (например, bash ), идентифицированный с этим однопоточным процессом.

A процесс - это непустое конечное множество (иногда одноэлементное) threads используют один и тот же виртуальный адрес пространство (и другие вещи, такие как дескрипторы файлов , рабочий каталог и т. д. и т. д.). См. Также учетные данные (7) , (7) и т. д.

Потоки в Linux - это потоки ядра (в смысле управления ядром, которое также создает свои собственные потоки), созданных конкретным Linux clone syscall (который также можно использовать для создания процессов в Linux). pthread_create , вероятно, построена (в Linux) выше clone внутри NPTL и Gnu Libc (который интегрировал NPTL в Linux ) и musl-libc .

    
ответ дан Basile Starynkevitch 11.12.2011 в 20:08
  • Спасибо за детали :) –  whitefox 26.12.2011 в 00:52
  • Почему «однопоточное» в скобках? Как насчет многопоточных процессов? Они также являются задачами и запланированы одним и тем же планировщиком? –  Muhamed Huseinbašić 11.04.2017 в 11:47
  • Гораздо понятнее. Спасибо @BasileStarynkevitch. Таким образом, на самом деле запланированы только потоки внутри процессов (как задачи), независимо от того, является ли это многопоточным или однопоточным процессом (в дополнение к потокам ядра), а не самими процессами? –  Muhamed Huseinbašić 11.04.2017 в 12:30
  • Что такое задание ядра - это задача. –  Basile Starynkevitch 11.04.2017 в 13:34
22

Нити ядра в Linux реализуются как процессы, которые совместно используют ресурсы. Планировщик не проводит различия между потоком и процессом.

См. здесь для получения дополнительной информации: Ссылка

    
ответ дан nurio 11.12.2011 в 13:05
  • Спасибо, это то, что я хотел знать. Таким образом, существует только один планировщик (который является планировщиком процессов), который планирует «потоки» (которые фактически являются процессами, которые используют одни и те же ресурсы). Это заключение о коректинге? –  whitefox 11.12.2011 в 13:33
  • Под Linux - да –  nurio 11.12.2011 в 13:44
  • Я думаю, что лучшей терминологией является то, что планировщик Linux планирует задачи планирования (реализованные как task_struct внутри ядра), которые могут быть потоками или однопоточными процессами или потоками ядра ... –  Basile Starynkevitch 14.12.2011 в 09:33
  • , если «планировщик не проводит различия между потоком и процессом», то как планировщик переключает контекст между потоками, принадлежащими к одному и тому же процессу, и между двумя потоками, принадлежащими к разным процессам? Не следует ли переключение между потоками, которые связаны с буксированием различных процессов, выполненных по-другому, чем переключение потоков? –  kachanov 01.06.2012 в 09:14
  • @kachanov Насколько мне известно, это можно обрабатывать одинаково. Каждый поток имеет свой собственный стек и выполняет состояние выполнения (регистры и т. Д.), Как и обычные процессы. Переключение контекста между двумя потоками, принадлежащими к одному и тому же процессу, означает, что коммутатор может быть немного быстрее из-за разделяемой памяти, которая может оставаться в кеше. Чтобы избежать одновременного доступа к одной и той же памяти, потоковая программа должна использовать мьютексы или блокировки - в этом случае планировщик не помогает. –  nurio 12.06.2012 в 14:50
-3

В LINUX нет концепции потоков, чтобы поток писем LINUX POSIX был не чем иным, как другим процессом. Когда вы пытаетесь получить идентификатор процесса, он будет отображать идентификатор процесса руководителя под любым потоком. Для более подробной информации попробуйте обратиться к этой книге «Понимание ядра LINUX». Надеемся

    
ответ дан kiran 04.12.2014 в 15:00