Чи справді нитки ядра Linux є процесами ядра?


19

Я багато разів читав, що Linux створює нитку ядра для кожного потоку користувача в Java-версії Java. (Я бачу термін "нитка ядра", який використовується двома різними способами:

  1. потік, створений для роботи основної ОС і
  2. Потік ОС знає і планує виконувати роботу користувача.

Я говорю про останній тип.)

Чи потік ядра такий самий, як процес ядра, оскільки Linux підтримує спільні простори пам’яті між батьком і дочіркою, чи це справді інша сутність?

Відповіді:


23

Немає різниці між потоком і процесом в Linux. Якщо ви подивитесь на клон (2), ви побачите набір прапорів, які визначають, що поділяється між собою, а що не поділяється між потоками.

Класичні процеси - це лише нитки, які нічого не поділяють; Ви можете поділитися компонентами, які ви хочете в Linux.

Це не стосується інших реалізацій ОС, де є значно більші розбіжності.


22

Документація може бути досить заплутаною, тому ось " справжня " модель Linux:

  • всередині ядра Linux те, що можна запустити (і запланувати), називається "процесом",
  • кожен процес має унікальний ідентифікатор процесу (PID) та ідентифікатор групи ниток (TGID),
  • "нормальний" процес має PID = TGID, і жоден інший процес не поділяє це значення TGID,
  • "потоковий" процес - це процес, значення якого TGID поділяється іншими процесами,
  • кілька процесів спільного використання одного і того ж TGID також діляться, принаймні, тим самим простором пам'яті та обробниками сигналів (іноді більше),
  • якщо "потоковий" процес має PID = TGID, його можна назвати "основним потоком",
  • дзвінок getpid() з будь-якого процесу поверне свій TGID (= "PID основного потоку"),
  • дзвінок gettid() з будь-якого процесу поверне PID (!),
  • будь-який процес може бути створений за допомогою clone(2)системного виклику,
  • числові імена папок, з якими ви можете перелічити, ls /procяк /proc/NUMBERTGID,
  • числові імена папок, /proc/TGID/taskяк /proc/TGID/task/NUMBERі PID,
  • незважаючи на те, що ви не бачите всіх існуючих PID ls /proc, ви все одно можете це зробити cd /proc/any_PID.

Висновок : з точки зору ядра, існують лише процеси, кожен з яких має свій унікальний PID, а так званий потік - це просто різного роду процес.

Примітка: реалізація концепції "потоку" в Linux призвела до плутанини лексики, і якщо getpid() брехня вам не робить те, що ви думали, це тому, що її поведінка відповідає сумісності POSIX (потоки повинні мати спільний PID) .


1
Пропозиція: використання слова "завдання" може допомогти посилатися на щось, що можна виконати, не сильно заплутавшись у процесі / потоці.
Тотор

17

Нитки - це процеси під Linux. Вони створюються за допомогою cloneсистемного виклику, який повертає ідентифікатор процесу, на який може бути відправлений сигнал через killсистемний виклик, подібно до процесу. Процеси потоків видно на psвиході. cloneВиклик передаються прапори , які визначають , скільки середовища батьківського процесу використовується спільно з процесом потоку.


1
Чоловік pthreads(7)каже, що для поточної реалізації NPTL (Native POSIX Threads Library) "всі потоки в процесі розміщуються в одній групі потоків; всі члени групи потоків мають однаковий PID". У застарілій реалізації LinuxThreads кожен "потік" має свій власний PID.
Тотор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.