Реализация потоков в ядре Linux

Реализация потоков в ядре Linux

Многопоточность — это популярная сегодня программная абстракция. Она обеспечивает выполнение нескольких потоков в совместно используемом адресном пространстве памяти. Потоки также могут совместно использовать открытые файлы и другие ресурсы. Многопоточность используется для параллельного программирования (concurrent programming), что на многопроцессорных системах обеспечивает истинный параллелизм.

Реализация потоков в операционной системе Linux уникальна. Для ядра Linux не существует отдельной концепции потоков. В ядре Linux потоки реализованы так же, как и обычные процессы. В ОС Linux нет никакой особенной семантики для планирования выполнения потоков или каких-либо особенных структур данных для представления потоков. Поток— это просто процесс, который использует некоторые ресурсы совместно с другими процессами. Каждый поток имеет структуру task_struct и представляется для ядра обычным процессом (который совместно использует ресурсы, такие как адресное пространство, с другими процессами).

В этом смысле Linux отличается от других операционных систем, таких как Microsoft Windows или Sun Solaris, которые имеют явные средства поддержки потоков в ядре (в этих системах иногда потоки называются процессами с быстрым переключением контекста, lightweight process). Название "процесс с быстрым переключением контекста" показывает разницу между философией Linux и других операционных систем. Для остальных операционных систем потоки— это абстракция, которая обеспечивает облегченные, более быстрые для исполнения сущности, чем обычные тяжелые процессы. Для операционной системы Linux потоки — это просто способ совместного использования ресурсов несколькими процессами (которые и так имеют достаточно малое время переключения контекста)[18].

Допустим, у нас есть процесс, состоящий из четырех потоков. В операционных системах с явной поддержкой потоков должен существовать дескриптор процесса, который далее указывает на четыре потока. Дескриптор процесса описывает совместно используемые ресурсы, такие как адресное пространство и открытые файлы. Потоки описываются ресурсами, которые принадлежат только им. В ОС Linux, наоборот, существует просто четыре процесса и, соответственно, четыре обычные структуры task_struct. Четыре процесса построены так, чтобы совместно использовать определенные ресурсы.

Потоки создаются так же, как и обычные задания, за исключением того, что в системный вызов clone() передаются флаги с указанием, какие ресурсы должны использоваться совместно:

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);

Результат выполнения показанного кода будет таким же, как и при выполнении обычного вызова fork(), за исключением того, что адресное пространство, ресурсы файловой системы, дескрипторы файлов и обработчики сигналов останутся общими. Другими словами, новая задача, так же как и родительский процесс, — обычные потоки. В отличие от этого, обычный вызов fork() может быть реализован следующим образом:

clone(SIGCHLD, 0);

а вызов vfork() в таком виде:

clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0);

Флаги, которые передаются в системный вызов clone() , помогают указать особенности поведения нового процесса и детализировать, какие ресурсы должны быть общими для родительского и порожденного процессов. В табл. 3.1 приведены флаги системного вызова clone() и их эффект.

Таблица 3.1. Флаги системного вызова clone()

Флаг Описание
CLONE_FILES Родительский и порожденный процессы совместно используют открытые файлы
CLONE_FS Родительский и порожденный процессы совместно используют информацию о файловой системе
CLONE_IDLETASK Установить значение PID в нуль (используется только для холостых (idle) задач)
CLONE_NEWNS Создать новое пространство имен для порожденной задачи
CLONE_PARENT Родительский процесс вызывающего процесса становится родительским и для порожденного
CLONE_PTRACE Продолжить трассировку и для порожденного процесса
CLONE_SETTID Возвратить значение идентификатора TID в пространство пользователя
CLONE_SETTLS Для порожденного процесса создать новую область локальных данных потока (thread local storage, TLS)
CLONE_SIGHAND У порожденного и родительского процессов будут общие обработчики сигналов
CLONE_SYSVSEM У родительского и порожденного процессов будет общая семантика обработки флага SEM_UNDO для семафоров System V
CLONE_THREAD Родительский и порожденный процессы будут принадлежать одной группе потоков
CLONE_VFORK Использовать vfork(): родительский процесс будет находиться а приостановленном состоянии, пока порожденный процесс не возобновит его работу
CLONE_UNTRACED Запретить родительскому процессу использование флага CLONE_PTRACE для порожденного процесса
CLONE_STOP Запустить процесс в состоянии TASK_STOPPED
CLONE_CHILD_CLEARTID Очистить идентификатор TID для порожденного процесса
CLONE_CHILD_SETTID Установить идентификатор TID для порожденного процесса
CLONE_PARENT_SETTID Установить идентификатор TID для родительского процесса
CLONE_VM У порожденного и родительского процессов будет общее адресное пространство
Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Пул потоков CLR

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Пул потоков CLR Заключительной темой нашего обсуждения в этой плаве, посвященной потокам, будет пул потоков CLR. При асинхронном вызове типов с помощью делегатов (посредством метода BeginInvoke()) нельзя сказать, что среда CLR буквально создает совершенно новый поток. В целях


Стеки потоков и допустимые количества потоков

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Стеки потоков и допустимые количества потоков Следует сделать еще два предостережения. Во-первых, подумайте о размере стека, который по умолчанию составляет 1 Мбайт. В большинстве случаев этого будет вполне достаточно, но если существуют какие-либо сомнения на сей счет,


13.1.6. Группы потоков

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

13.1.6. Группы потоков Группа потоков — это механизм управления логически связанными потоками. По умолчанию все потоки принадлежат группе Default (это константа класса). Но если создать новую группу, то в нее можно будет помещать потоки.В любой момент времени поток может


О ядре баз данных

Из книги VBA для чайников автора Каммингс Стив

О ядре баз данных Программное обеспечение, которое отвечает за выполнение основных действий по извлечению информации, которая содержится в одном или нескольких файлах базы данных, называется ядром базы данных. Ядро базы данных часто называют просто базой данных, хотя


Закрытие потоков

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Закрытие потоков Функции fclose и fcloseall закрывают поток или потоки. Функция fclose закрывает один заданный поток, fcloseall — все потоки, кроме потоков stdin, stdout, stderr, stdaux, stdprn.Если программа не выполняет закрытия потоков, потоки автоматически закрываются, когда программа завершается


Реализация NPTL для высших версий Linux

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Реализация NPTL для высших версий Linux Новая библиотека потоков POSIX (Native POSIX Thread Library, NPTL) в Red Hat 9 (и, возможно, в более поздних дистрибутивах Linux) создает проблемы с Суперсервером и локально скомпилированными программами, а также с утилитами. Утилита gbak сообщает об ошибке "broken


4.5. Реализация потоков в Linux

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

4.5. Реализация потоков в Linux Потоковые функции, соответствующие стандарту POSIX, реализованы в Linux не так, как в большинстве других версий UNIX. Суть в том, что в Linux потоки реализованы в виде процессов. Когда вызывается функция pthread_create(), операционная система на самом деле


7.4. Информация о ядре

Из книги Разработка ядра Linux автора Лав Роберт

7.4. Информация о ядре В файловой системе /proc есть много элементов, содержащих информацию о настройках и состоянии ядра. Некоторые из них находятся на верхнем уровне файловой системы, а некоторые скрыты в каталоге


Глава 2 Начальные сведения о ядре Linux

Из книги Linux Mint и его Cinnamon. Очерки применителя автора Федорчук Алексей Викторович

Глава 2 Начальные сведения о ядре Linux В этой главе будут рассмотрены основные вопросы, связанные с ядром Linux: где получить исходный код, как его компилировать и как инсталлировать новое ядро. После этого рассмотрим некоторые допущения, связанные с ядром Linux, отличия между


Глава 9 Средства синхронизации в ядре

Из книги Вопросы истории: UNIX, Linux, BSD и другие автора Федорчук Алексей Викторович

Глава 9 Средства синхронизации в ядре В предыдущей главе обсуждались источники и решения проблем, связанных с конкуренцией за ресурсы. К счастью, в ядре Linux реализовано большое семейство средств синхронизации. В этой главе обсуждаются эти средства, интерфейсы к ним, а


Информация о времени в ядре

Из книги автора

Информация о времени в ядре Концепция времени для компьютера является несколько неопределенной. В действительности, для того чтобы получать информацию о времени и управлять системным временем, ядро должно взаимодействовать с системным аппаратным обеспечением.


Порядок байтов в ядре

Из книги автора

Порядок байтов в ядре Для каждой аппаратной платформы, которая поддерживается ядром Linux, в файле <asm/byteorder.h> определена одна из двух констант __BIG_ENDIAN или __LITTLE_ENDIAN, в соответствии с используемым порядком байтов.В этот заголовочный файл также включаются макросы из


Реализация связанных списков в ядре Linux

Из книги автора

Реализация связанных списков в ядре Linux В ядре Linux для прохождения по связанным спискам используется унифицированный подход. При прохождении связанного списка, если не важен порядок прохода, эту операцию не обязательно начинать с головного элемента, на самом деле вообще


Утилита apt. Реализация для Linux Mint

Из книги автора

Утилита apt. Реализация для Linux Mint В данном очерке рассмотрены особенности утилиты apt в реализации для дистрибутива Linux Mint и её отличия от семейства утилит, входящих в пакет apt, общий для всех deb based


IPLabs Linux Team: начало русского Linux’а

Из книги автора

IPLabs Linux Team: начало русского Linux’а Следующая веха на пути русского Linux’а – 1998 год, когда фирма IPLabs (точнее, ее подразделение – IPLabs Linux Team) совместно с Институтом логики (на самом деле это были одни и те же люди – Алексей Новодворский, Алексей Смирнов и Юрий Девяткин с