Ответ на ваш вопрос полностью зависит от системы. Однако большинство процессоров ничего не знают о потоках. Они только поддерживают процессы. Потоки обычно реализуются созданными отдельными процессами, которые используют одно и то же адресное пространство.
Когда вы выполняете вызов системной службы для получения идентификатора потока, он будет реализован в том же общем виде, что и системная служба для получения идентификатора процесса. Представьте, как функция получения идентификатора процесса может работать в системе, не поддерживающей потоки. И для простоты предположим, что это один процессор.
У вас будет какая-то структура данных для представления текущего процесса, а ядро будет иметь некоторые средства идентификации текущего процесса (например, указатель в адресном пространстве ядра на этот процесс). На некоторых процессорах есть регистр текущей задачи, который указывает на структуру, определенную спецификацией процессора. Операционная система обычно может добавлять свои данные в конец этой структуры.
Итак, теперь я хочу обновить эту операционную систему для поддержки потоков. Для этого у меня должна быть структура данных, описывающая поток. В этих структурах у меня есть указатель на структуру, которая определяет процесс.
Затем получить идентификатор потока работает так же, как раньше работало получение идентификатора процесса. Но теперь у Get Process ID есть дополнительный шаг, который я должен перевести поток в процесс, чтобы получить его идентификатор (который может даже быть включен в блок потока).
person
user3344003
schedule
22.03.2018
gettid()
). Теоретически ОС может поместитьthreadId
в нижнюю часть стека при планировании потока (на данный момент она знаетthreadId
), но проблема в том, что указатель стека (SP/ESP/RSP) вx86
содержит адрес вершины стека. и информация для определения дна стека не хранится где-либо еще в регистрах. Поправьте меня если я ошибаюсь. - person raiks   schedule 22.03.2018