- Реализация потоков в ядре Linux
- Читайте также
- Стеки потоков и допустимые количества потоков
- Глава 2 Начальные сведения о ядре Linux
- Глава 9 Средства синхронизации в ядре
- Информация о времени в ядре
- Порядок байтов в ядре
- Реализация связанных списков в ядре Linux
- IPLabs Linux Team: начало русского Linux’а
- Утилита apt. Реализация для Linux Mint
- О ядре баз данных
- 13.1.6. Группы потоков
- Пул потоков CLR
- 4.5. Реализация потоков в Linux
- 7.4. Информация о ядре
- Закрытие потоков
- Реализация NPTL для высших версий 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() может быть реализован следующим образом:
а вызов 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 У порожденного и родительского процессов будет общее адресное пространство
Читайте также
Стеки потоков и допустимые количества потоков
Стеки потоков и допустимые количества потоков Следует сделать еще два предостережения. Во-первых, подумайте о размере стека, который по умолчанию составляет 1 Мбайт. В большинстве случаев этого будет вполне достаточно, но если существуют какие-либо сомнения на сей счет,
Глава 2 Начальные сведения о ядре Linux
Глава 2 Начальные сведения о ядре Linux В этой главе будут рассмотрены основные вопросы, связанные с ядром Linux: где получить исходный код, как его компилировать и как инсталлировать новое ядро. После этого рассмотрим некоторые допущения, связанные с ядром Linux, отличия между
Глава 9 Средства синхронизации в ядре
Глава 9 Средства синхронизации в ядре В предыдущей главе обсуждались источники и решения проблем, связанных с конкуренцией за ресурсы. К счастью, в ядре Linux реализовано большое семейство средств синхронизации. В этой главе обсуждаются эти средства, интерфейсы к ним, а
Информация о времени в ядре
Информация о времени в ядре Концепция времени для компьютера является несколько неопределенной. В действительности, для того чтобы получать информацию о времени и управлять системным временем, ядро должно взаимодействовать с системным аппаратным обеспечением.
Порядок байтов в ядре
Порядок байтов в ядре Для каждой аппаратной платформы, которая поддерживается ядром Linux, в файле <asm/byteorder.h> определена одна из двух констант __BIG_ENDIAN или __LITTLE_ENDIAN, в соответствии с используемым порядком байтов.В этот заголовочный файл также включаются макросы из
Реализация связанных списков в ядре Linux
Реализация связанных списков в ядре Linux В ядре Linux для прохождения по связанным спискам используется унифицированный подход. При прохождении связанного списка, если не важен порядок прохода, эту операцию не обязательно начинать с головного элемента, на самом деле вообще
IPLabs Linux Team: начало русского Linux’а
IPLabs Linux Team: начало русского Linux’а Следующая веха на пути русского Linux’а – 1998 год, когда фирма IPLabs (точнее, ее подразделение – IPLabs Linux Team) совместно с Институтом логики (на самом деле это были одни и те же люди – Алексей Новодворский, Алексей Смирнов и Юрий Девяткин с
Утилита apt. Реализация для Linux Mint
Утилита apt. Реализация для Linux Mint В данном очерке рассмотрены особенности утилиты apt в реализации для дистрибутива Linux Mint и её отличия от семейства утилит, входящих в пакет apt, общий для всех deb based
О ядре баз данных
О ядре баз данных Программное обеспечение, которое отвечает за выполнение основных действий по извлечению информации, которая содержится в одном или нескольких файлах базы данных, называется ядром базы данных. Ядро базы данных часто называют просто базой данных, хотя
13.1.6. Группы потоков
13.1.6. Группы потоков Группа потоков — это механизм управления логически связанными потоками. По умолчанию все потоки принадлежат группе Default (это константа класса). Но если создать новую группу, то в нее можно будет помещать потоки.В любой момент времени поток может
Пул потоков CLR
Пул потоков CLR Заключительной темой нашего обсуждения в этой плаве, посвященной потокам, будет пул потоков CLR. При асинхронном вызове типов с помощью делегатов (посредством метода BeginInvoke()) нельзя сказать, что среда CLR буквально создает совершенно новый поток. В целях
4.5. Реализация потоков в Linux
4.5. Реализация потоков в Linux Потоковые функции, соответствующие стандарту POSIX, реализованы в Linux не так, как в большинстве других версий UNIX. Суть в том, что в Linux потоки реализованы в виде процессов. Когда вызывается функция pthread_create(), операционная система на самом деле
7.4. Информация о ядре
7.4. Информация о ядре В файловой системе /proc есть много элементов, содержащих информацию о настройках и состоянии ядра. Некоторые из них находятся на верхнем уровне файловой системы, а некоторые скрыты в каталоге
Закрытие потоков
Закрытие потоков Функции fclose и fcloseall закрывают поток или потоки. Функция fclose закрывает один заданный поток, fcloseall — все потоки, кроме потоков stdin, stdout, stderr, stdaux, stdprn.Если программа не выполняет закрытия потоков, потоки автоматически закрываются, когда программа завершается
Реализация NPTL для высших версий Linux
Реализация NPTL для высших версий Linux Новая библиотека потоков POSIX (Native POSIX Thread Library, NPTL) в Red Hat 9 (и, возможно, в более поздних дистрибутивах Linux) создает проблемы с Суперсервером и локально скомпилированными программами, а также с утилитами. Утилита gbak сообщает об ошибке «broken