Ядро Linux: задача против потока

Ядро Linux: задача против потока

Когда я читал книгу (программирование ядра Linux), я нашел интересный/запутанный абзац об mm_segment_t addr_limit(одном из участников struct_task), как показано ниже:

mm_segment_t addr_limit;
В отличие от старых ядер, начиная с версии 2.4 задачи (потоки) также могут находиться внутри ядра. Они могут получать доступ к большему адресному пространству, чем задачи в пользовательском пространстве.addr_limitописывает адресное пространство, к которому можно получить доступ с помощью ядра задачи.

Вопросы:

  1. В первом пункте написано "(задачи) потокитакже может бытьвнутри ядра" есть. Что это значит? Потоки не обязательно находятся внутри ядра?

  2. Во втором предложении: «Этиможет получить доступ к большему адресному пространству, чем задачи в пользовательском пространстве." Я не понимаю, чтоэтиозначает? Если он говорит о потоках, как потоки могут иметь большее адресное пространство, чем задачи?

решение1

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

# ps aux | grep '\[.*\]$' | head
root         2  0.0  0.0      0     0 ?        S    May05   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    May05   0:03 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    May05   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    May05   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S    May05   0:00 [migration/1]
root         9  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/1:0]
root        10  0.0  0.0      0     0 ?        S    May05   0:02 [ksoftirqd/1]
root        11  0.0  0.0      0     0 ?        S    May05   0:00 [watchdog/1]

Такие потоки создаются кодом ядра, который вызывает kthread_create(). Эти потоки работают в режиме ядра, выполняя различные задачи, которые вы ожидаете от ядра.

С другой стороны, «задачи в пользовательском пространстве» представляют собой потоки или процессы, как вы обычно думаете о них, созданные через fork+exec или pthread_create. Они работают в пользовательском режиме и выполняют системные вызовы, когда им требуются службы от ядра. Формулировка там немного странная, потому что, конечно, ядро ​​знает об этих задачах и хранит информацию (такую ​​как struct_task) о них, чтобы оно могло планировать время для них на ЦП.

Что касается (2), «эти» относятся конкретно к «потокам ядра». Я считаю, что потоки ядра используют то же адресное пространство, что и ядро.

Связанный контент