В чем разница между потоками ядра и пользовательскими потоками? - PullRequest
8 голосов
/ 13 февраля 2011

В чем разница между потоками ядра и пользовательскими потоками?Это то, что поток ядра запланирован и выполняется в режиме ядра?Какие методы используются для создания потоков ядра?

Это пользовательский поток запланирован, выполнен в пользовательском режиме?Это то, что Ядро не участвует в выполнении / планировании пользовательских потоков?Когда при выполнении пользовательского потока возникают прерывания, тогда кто его обрабатывает?

Всякий раз, когда создается поток, создается TCB для каждого.Теперь, если речь идет о потоках пользовательского уровня. Этот TCB создается в адресном пространстве пользователя?

В случае переключения между двумя потоками пользовательского уровня, кто занимается переключением контекста?

Существует концепция многопоточности:

  1. Много к одному
  2. Один к одному
  3. Много ко многим.

Что это за модели?Как эти модели практически используются?

Прочитал несколько статей на эту тему, но все еще в замешательстве
Хочет уточнить концепцию ..

Заранее спасибо, Тазим

Ответы [ 4 ]

6 голосов
/ 13 февраля 2011

В Википедии есть ответы на большинство, если не на все эти вопросы.

http://en.wikipedia.org/wiki/Thread_(computer_science)

http://en.wikipedia.org/wiki/Thread_(computer_science)#Processes.2C_kernel_threads.2C_user_threads.2C_and_fibers

5 голосов
/ 14 февраля 2011

В чем разница между потоками ядра и пользовательскими потоками?

Потоки ядра являются привилегированными и могут получить доступ к вещам, недоступным для потоков пользовательского режима. Взгляните на " Ring (Computer Security) " в Википедии. В Windows пользовательский режим соответствует звонку 3, а режим ядра соответствует звонку 0.

Какие методы используются для создания потоков ядра?

Это очень зависит от операционной системы.

теперь в случае потоков уровня пользователя. Этот TCB создается в адресном пространстве пользователя?

TCB записывает информацию о потоке, который ядро ​​использует для запуска этого потока, верно? Таким образом, если бы он был размещен в пользовательском пространстве, поток пользовательского режима мог бы изменить или повредить его, что не очень хорошая идея. Итак, вы не думаете, что он создан в пространстве ядра?

Что это за модели? Как эти модели практически используются?

Википедия кажется, действительно ясно об этом.

1 голос
/ 09 августа 2011

Поток ядра означает поток, за который ядро ​​отвечает за планирование.Это означает, помимо прочего, что ядро ​​может планировать каждый поток на разных процессорах / ядрах одновременно.

Как их использовать, сильно зависит от языков программирования и API потоков, но в простом видеиллюстрация,

void task_a();
void task_b();
int main() {
    new_thread(task_a);
    new_thread(task_b);
    // possibly do something else in the main thread
    // wait for the threads to complete their work
}

В каждой знакомой мне реализации ядро ​​может приостановить их в любое время.(«упреждающий»)

Пользовательские потоки или «Пользовательские запланированные потоки» делают саму программу ответственной за переключение между ними.Есть много способов сделать это, и, соответственно, существует множество названий для них.

На одном конце у вас есть «Зеленые нити»;в основном пытается сделать то же самое, что и потоки ядра.Таким образом, вы сохраняете все сложности программирования с реальными потоками.

На противоположном конце у вас есть «Волокна», которые необходимы для того, чтобы сдаться до запуска любого другого волокна.Это означает, что

  • Волокна проходят последовательно.Нет никакого увеличения производительности параллеля.
  • Взаимодействие между волокнами очень хорошо определено.Другой код выполняется только в точных точках, которые вы получаете.Другой код не будет изменять переменные, пока вы над ними работаете.
  • Большинство программистов с низкоуровневыми сложностями борются с многопоточностью, такой как когерентность кэша (большинство пользователей обращают внимание на вопросы MT на этом сайте.не понимаю), не являются фактором.

В качестве простейшего примера волокон я могу представить:

while(tasks_not_done) {
    do_part_of_a();
    do_part_of_b();
}

, где каждый выполняет некоторую работу, а затем возвращается, когдаэта часть сделана.Обратите внимание, что они выполняются последовательно в одном и том же «аппаратном потоке», что означает, что вы не получите увеличения производительности от параллелизма.С другой стороны, взаимодействия между ними очень хорошо определены, поэтому у вас нет условий гонки.Фактическая работа каждой функции может варьироваться.Они также могут быть «объектами пользовательских потоков» из некоторого вектора / массива.

0 голосов
/ 14 февраля 2011

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

...