Как ОС определяет идентичность потока, вызывающего GetCurrentThreadId()?

Я пытаюсь понять, как ОС выясняет, какой поток является текущим (например, когда поток вызывает gettid() или же GetCurrentThreadId()). Поскольку адресное пространство процесса является общим для всех потоков, сохранение идентификатора потока там невозможно. Это должно быть что-то уникальное для каждого потока (т.е. храниться в его контексте). Если бы я был разработчиком ОС, я бы сохранил его в каком-то внутреннем регистре ЦП, читаемом только в режиме ядра. Я много гуглил, но не нашел подобного вопроса (как будто это было супер очевидно).

Так как же это реализовать в реальных операционных системах, таких как Linux или Windows?

3 ответа

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

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

У вас будет какая-то структура данных для представления текущего процесса, а у ядра будут некоторые средства идентификации текущего процесса (например, указатель в адресном пространстве ядра на этот процесс). На некоторых процессорах имеется регистр текущей задачи, который указывает на структуру, определенную спецификацией процессора. Операционная система обычно может добавлять свои собственные данные в конец этой структуры.

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

Тогда get ID идентификаторов работает так же, как и раньше. Но теперь Get Process ID имеет дополнительный шаг, который я должен перевести поток в процесс, чтобы получить его идентификатор (который может быть даже включен в блок потока).

Вы ищете Блок управления резьбой (TCB).

Это структура данных, которая содержит информацию о потоках.

Легкий материал для чтения можно найти здесь по теме: https://www.cs.duke.edu/courses/fall09/cps110/slides/threads2.3.ppt

Но я бы порекомендовал получить копию Modern Operating Systems от Andrew S. Tanenbaum, если вы заинтересованы в ОС.

Глава 2 Раздел 2.2 Темы:

Реализация потоков в пространстве пользователя - "Когда потоки управляются в пространстве пользователя, каждому процессу нужна своя собственная таблица потоков, чтобы отслеживать потоки в этом процессе".

Реализация потоков в ядре - "Ядро имеет таблицу потоков, которая отслеживает все потоки в системе".

Просто редактирование, которое вы также можете прочитать "РАСПИСАНИЕ". В общем случае вы можете сказать, что ядро ​​решает, какой поток / процесс должен использовать ЦП. Таким образом, ядро ​​знает, какой поток / процесс совершил системный вызов. Я не буду вдаваться в подробности, потому что это зависит от того, о какой ОС мы говорим.

Я полагаю, что это уже очень хорошо объяснено в этом вопросе: как ядро ​​различает поток и процесс

Если вы хотите узнать больше, вы также можете найти в Google структуру задач ядра и посмотреть, какая информация хранится о каждом типе процессов, запущенных в пространстве пользователя.

Другие вопросы по тегам