Консультация № 186446
15.07.2012, 19:32
0.00 руб.
16.07.2012, 17:43
0 14 3
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
1) Что такое "Поток" и "Процесс" в Windows - это что-то программное или аппаратное - дело в том, что я никак не могу понять:
с одной стороны - Windows может управлять потоками - определять приоритет и т.д. - с другой - они как-то "самостоятельно" могут выполняются на разных ядрах и ОС может ими управлять...
В связи с вышесказанным возникает вопрос: так "Поток" - это программная фишка или аппаратная или программно-аппаратная, но в любом случае не ясно, какая "часть" тут реализована программно, а другая - аппаратно... К сожалению, я нигде не смог найти информацию по этим вопросам и поэтому обращаюсь к Вам! :)
2) Для чего используется регистр CS в Windows?
Большое спасибо!

Обсуждение

давно
Профессор
230118
3054
15.07.2012, 22:14
общий
это ответ
Здравствуйте, Илья!

Процессом обычно называют экземпляр выполняемой программы.

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

- Структура данных, содержащая всю информацию о процессе, в том числе список открытых дескрипторов различных системных ресурсов, уникальный идентификатор процесса, различную статистическую информацию и т.д.;

- Адресное пространство - диапазон адресов виртуальной памяти, которым может пользоваться процесс;

- Исполняемая программа и данные, проецируемые на виртуальное адресное пространство процесса.

Потоки

Процессы инертны. Отвечают же за исполнение кода, содержащегося в адресном пространстве процесса, потоки. Поток (thread) - некая сущность внутри процесса, получающая процессорное время для выполнения. В каждом процессе есть минимум один поток. Этот первичный поток создается системой автоматически при создании процесса. Далее этот поток может породить другие потоки, те в свою очередь новые и т.д. Таким образом, один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном пространстве процесса. Каждый поток имеет:

- Уникальный идентификатор потока;

- Содержимое набора регистров процессора, отражающих состояние процессора;

- Два стека, один из которых используется потоком при выполнении в режиме ядра, а другой - в пользовательском режиме;

- Закрытую область памяти, называемую локальной памятью потока (thread local storage, TLS) и используемую подсистемами, run-time библиотеками и DLL.

Планирование потоков

Чтобы все потоки работали, операционная система отводит каждому из них определенное процессорное время. Тем самым создается иллюзия одновременного выполнения потоков (разумеется, для многопроцессорных компьютеров возможен истинный параллелизм). В Windows реализована система вытесняющего планирования на основе приоритетов, в которой всегда выполняется поток с наибольшим приоритетом, готовый к выполнению. Выбранный для выполнения поток работает в течение некоторого периода, называемого квантом. Квант определяет, сколько времени будет выполняться поток, пока операционная система не прервет его. По окончании кванта операционная система проверяет, готов ли к выполнению другой поток с таким же (или большим) уровнем приоритета. Если таких потоков не оказалось, текущему потоку выделяется еще один квант. Однако поток может не полностью использовать свой квант. Как только другой поток с более высоким приоритетом готов к выполнению, текущий поток вытесняется, даже если его квант еще не истек.

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

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


Процесс включает в себя один или более потоков, которые фактически выполняют код в процессе (технически, выполняются не процессы, а потоки) и представлены в системе в виде объектов потоков ядра. Есть несколько причин, почему приложения создают потоки в дополнение к их исходному начальному потоку: 1) процессы, обладающие пользовательским интерфейсом, обычно создают потоки для того, чтобы выполнять свою работу и при этом сохранять отзывчивость основного потока к командам пользователя, связанными с вводом данных и управлением окнами; 2) приложения, которые хотят использовать несколько процессоров для масштабирования производительности или же которые хотят продолжать работать, в то время как потоки останавливают свою работу, ожидая синхронизации операций ввода/вывода, создают потоки, чтобы получить дополнительную выгоду от многопоточной работы.


давно
Посетитель
7438
7205
15.07.2012, 23:57
общий
это ответ
Здравствуйте, Илья!
2) Windows работает в защищенном режиме процессора, при котором в сегментных регистрах хранятся специальные структуры данных - селекторы. Которые являются идентификатором сегмента. Селектор указывает не на сам сегмент в памяти, а на его дескриптор, в таблице дескрипторов…
Каждая 16-битная величина в сегментных регистрах делится на три части, как показано ниже:
Код:
15         3  2   1   0
+--------------------+
| Index | TI | RPL|
+--------------------+
Бит TI в этом случае указывает, какая таблица дескрипторов должна использоваться (нуль соответствует глобальной таблице дескрипторов, единица — локальной таблице дескрипторов).
Поле Index является номером (индексом) дескриптора в таблице дескрипторов, который должен использоваться при вычислении линейного адреса. Поле RPL является запрошенным уровнем привилегий, используемым для контроля прав доступа программы к сегменту . Частным случаем RPL является текущий уровень привилегий — CPL, чьё значение в любой момент времени находится в сегментном регистре CS.
Ну и, наконец, регистр CS должен содержать селектор сегмента кода, иначе произойдет исключение при попытке выполнить команду. Атрибуты сегментов задаются в дескрипторах.
Это если вкратце, подробнее можно узнать, почитав про защищенный режим процессора. Информации в Интернете много, полагаю, найдете самостоятельно.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.07.2012, 09:43
общий
это ответ
Здравствуйте, Илья!
Процесс и поток - это скорее программные вещи, но их практическая реализация невозможна без поддержки на аппаратном уровне.
На аппаратные возможности прежде всего опираются две вещи:

1. Адресное пространство процесса. Потоки внутри процесса работают в виртуальном адресном пространстве, которое никак не
пересекается с другими процессами. За счёт этого процессы изолированы друг от друга. Трансляция виртуальных адресов в физические реализовано на аппаратном уровне. Для этого операционная система формирует специальные структуры данных и записывает их адрес в регистры процессора. Процессор по этим данным отображает заданные страницы памяти на виртуальные адреса процесса. Если поток обратится к адресу, который отсутствует в отображении, то процессор сгенерирует исключение и управление получит код операционной системы. Он выдаст пользователю сообщение о фатальном сбое в программе и уничтожит процесс.

2. Планирование потоков. Хотя поток выполняется "самостоятельно", операционная система программирует аппаратный таймер.
Когда таймер сработает, то управление опять получит код системы, который решит что делать дальше: оставить на выполнении текущий поток либо запустить другой, более приоритетный. Переключение потоков также происходит при участии аппаратных ресурсов, процессор имеет специальные команды для сохранения и загрузки контекста потока.

Если вы хотите более детально разобраться с этими вопросами, то очень рекомендую книгу Олифер, Олифер. Сетевые операционные системы. http://www.ozon.ru/context/detail/id/3562333
Неизвестный
16.07.2012, 12:17
общий
Огромное спасибо за ответы!!!
На самом деле, что-то здесь не сходится...
Дело в том, что в регистре CS хранится какая-то информация, которая не доступна для меня (уровень приложения), т.к. любое обращение к этому сегменту влечет за собой ошибку нарушения доступа. Более того, как я понял, в сегментно-страничной системе адресации у нас за "разграничения доступа"(код, данные, стек) отвечают на сами сегментные регистры (не важно, в каком сегментном регистре находится селектор), а параметры страниц. Дело в том, что доступ к командам осуществляется по тому же селектору, что и к данным (это доказано экспериментально), т.к, по моему мнению, в Windows программы хранятся как данные, только у этих страниц, на которых они хранятся, есть атрибут доступа на исполнение... Я прав?
Я проводил следующий эксперимент: у меня есть данные по адресу 0x101A34E0 и я попытался обратиться к этим данным не через сегмент, селектор котоорого содержится в регистре DS, а тот селектор, который содержится в регистре CS и тут же получил Access Violation.
Вы можете как-нибудь это объяснить?
И еще насчет потоков: как же ОС может разграничить потоки по разным процессорам? Мне кажется, что тут есть что-то еще... Ответ на этот вопрос я НИГДЕ не нашел и поэтому скачал тех. документацию Intel, но в ней быстро ответ не найдешь... Собственно, поэтому я говорил, что поток - это что-то "программно-аппаратное", т.е. работает на физическом ядре, но при этом управляется программно...
Ответы мне очень понравились, вот только остались дополнительные вопросы!
Все спасибо еще раз!!
Неизвестный
16.07.2012, 13:46
общий
Windows использует плоскую модель памяти, поэтому сегменты CS и DS отличаются только параметрами защиты:
Код:

P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0023 00000000 ffffffff Data RW Ac 3 Bg Pg P Nl 00000cf3

P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
001B 00000000 ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb

То есть CS указывает на Read/Execute сегмент. Возможность чтения необходима для прямого обращения к константам, которые компилятор может размещать прямо в коде.

Неизвестный
16.07.2012, 14:03
общий
Наличие нескольких процессоров никак не меняет дела. Каждый процессор периодически генерирует исключение по аппаратному таймеру. Код планировщика потоков всегда знает на каком процессоре он выполняется в данный момент, и в зависимости от ситуации запускает тот или иной поток на текущем процессоре.
Неизвестный
16.07.2012, 14:13
общий
Большое спасибо!
Т.е. получается так, что "сегмент данных, сегмент стека, сегмент кода" - это один и тот же сегмент, только если сегменты данных и стека - это один и тот же сегмент, то сегмент кода - это другой сегмент, который по своим границам такой же, как и данных и кода, но он отличается параметрами защиты (разрешено исполнение). Правильно?
А атрибуты страниц - это "дополнительное" разрешение на исполнение, т.е. чтобы код мог исполняться, необходимо, чтобы ссылка была на сегмент CS и страница "разрешала" исполнение. Правильно?
Кстати, а откуда Вы взяли эту информацию? :)
Неизвестный
16.07.2012, 14:47
общий
"сегмент данных, сегмент стека, сегмент кода" - это один и тот же сегмент

Да, по границам адресов все сегменты одинаковы.

А атрибуты страниц - это "дополнительное" разрешение на исполнение, т.е. чтобы код мог исполняться, необходимо, чтобы ссылка была на сегмент CS и страница "разрешала" исполнение. Правильно?

Да, правильно.

Содержимое дескрипторов сегментов можно посмотреть командой dg в отладчике ядра windbg.
http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
Неизвестный
16.07.2012, 14:53
общий
Большое спасибо!
Кстати, я тут такую интересную вещь наблюдал...
Дело в том, что у меня один и тот же поток выполнял цикл и при этом система как-то умудрилась распараллелить его по ядрам... КАК?!
Причем, это было только по Вин7, а под ХР такого не было...
Можете это как-нибудь объянить?
Неизвестный
16.07.2012, 15:20
общий
Насчёт распараллеливания я думаю вам показалось
Скорее всего наблюдался механизм балансировки нагрузки. Чтобы процессор 0 не приставился раньше положенного, система старается равномерно загрузить все процессоры работой. Поэтому когда в системе только один активный поток, то он поочерёдно исполняется на всех процессорах.
Неизвестный
16.07.2012, 15:22
общий
Вы знаете, я тоже так подумал. :)
Благодарю за ответ, покачто вопросов нет. :)
Неизвестный
16.07.2012, 15:44
общий
Все-таки возник еще один маленький вопросик: а если я пишу, к примеру, IRQ 4 - то здесь у меня 4 - это и приритет по прерыванию, и вектор прерывания. Верно?
давно
Посетитель
7438
7205
16.07.2012, 21:39
общий
Не совсем.
В защищенном режиме номера прерываний не равны векторам, т.к. младшие 0..1fh используются для исключений
Посмотрите, например, здесь
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.07.2012, 23:40
общий
Большое спасибо, вроде бы разобрался. :)
Форма ответа