sonyps4.ru

Потоки. Нити исполнения

Когда говорят о процессах, то тем самым хотят отметить, что операци­онная система поддерживает их обособленность: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу назначаются свои ресур­сы – файлы, окна, семафоры и так далее. Такая обособленность нужна для того, чтобы защитить один процесс от другого, поскольку они, совместно используя все ре­сурсы ВМ, конкурируют друг с другом. В общем случае процессы могут быть никак не связаны между собой и даже могут принадлежать раз­ным пользователям, разделяющим одну вычислительную машину. Другими сло­вами, в случае процессов ОС считает их совершенно несвязанными и независимыми. При этом именно ОС берет на себя роль арбитра в конкуренции между процессами по поводу ресурсов.

Однако желательно иметь еще и возможность задействовать внутренний парал­лелизм, который может быть в самих процессах. Такой внутренний параллелизм встречается достаточно часто, а его использование позволяет ускорить реализацию процессов. Например, некоторые операции, выполняемые приложением, могут требо­вать для своего исполнения достаточно длительного использования центрального процессора. В этом случае при интерактивной работе с приложением пользова­тель вынужден долго ожидать завершения заказанной операции и не может управ­лять приложением до тех пор, пока операция не выполнится до самого конца. Такие ситуации встречаются достаточно часто, например, при обработке боль­ших изображений в графических редакторах. Если же программные модули, исполняющие такие длительные операции, оформлять в виде самостоятельных «подпроцессов» (так называемых легковесных или облегченных процессов), которые будут выполняться парал­лельно с другими подобными «подпроцессами», то у пользователя по­является возможность параллельно выполнять несколько операций в рамках од­ного приложения (процесса). Такие «подпроцессы» принято называть потоками или «нитями» (thread) . «Подпроцессы» (потоки) называют легковесными потому, что операционная система не должна для них организовывать полноценную вирту­альную машину. Потоки не имеют своих собственных ресурсов, они развива­ются в том же виртуальном адресном пространстве, могут пользоваться теми же файлами, виртуальными устройствами и иными ресурсами, что и данный про­цесс. Единственное, что им необходимо иметь, – это процессорный ресурс. В од­нопроцессорной машине потоки разделяют между собой процессорное время так же, как это делают обычные процессы, а в многопроцессорной машине могут выполняться одновременно, если не встречают конкуренции из-за об­ращения к иным ресурсам.

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

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

Итак, сущность «поток» была введена для того, чтобы именно с помощью этих единиц распределять процессорное время между возможными работами. Сущ­ность «процесс» предполагает, что при диспетчеризации нужно учитывать все ресурсы, закрепленные за ним. А при манипулировании потоками можно менять только их контекст, если происходит переключение с одного потока на другой в рам­ках одного процесса. Все остальные вычислительные ресурсы при этом не затра­гиваются. Каждый процесс всегда состоит по крайней мере из одного потока, и только в случае наличия внутреннего параллелизма становится возможным «расще­пление» этого одного потока на несколько параллельных.

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

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

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

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

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

Резюме

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

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

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

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

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

Порядок взаимосвязи процессов определяется правилами синхро­низации. Часть программы, в которой осуществляется доступ к разделяемым данным, называется критической секцией (критической областью) программы. Ситуации, когда два или более процессов обрабатывают разделяемые данные, и конечный результат зависит от соотношения скоростей процессов, называются гонками. Исключение эффекта гонок по отношению к некоторому ресурсу обеспечивается различными способами взаимного исключения, такими как использование механизмов блокирующих переменных, семафоров, мьютексов.

Существенной проблемой синхронизации процессов являются их взаимные блокировки или тупики. Проблема взаимоблокировок требует решения задач предотвращения взаимоблокировок, распознавания взаимоблокировок и восстановления системы после взаимоблокировок. Высокоуровневым средством синхронизации процессов, исключающим взаимоблокировки, является так называемый монитор, который представляет собой набор процедур, переменных и структур данных.

Потоки («нити») представляют собой «легковесную» (или «облегченную») форму процессов. Потоки в отличие от процессов не имеют своих собственных ресурсов, они развива­ются в том же виртуальном адресном пространстве, могут пользоваться теми же файлами, виртуальными устройствами и иными ресурсами, что и данный про­цесс. Единственное, что им необходимо иметь, – это процессорный ресурс. Многопоточность обеспечивает возможность параллельного вы­полнения несколько видов операций в одной прикладной программе. Параллель­ные вычисления способствуют более эффективному использованию ресур­сов центрального процессора и существенно уменьшают суммарное время выполнения программ.

Контрольные вопросы и задания

1. Дайте определение понятиям «вычислительный процесс» и «ресурс».

2. Как классифицируются процессы и ресурсы?

3. Решение каких задач включает в себя планирование процессов?

4. Перечислите виды состояний процессов.

5. Что такое контекст и дескриптор процесса?

6. Каковы возможные причины выхода процесса из состояния выполнения?

7. Охарактеризуйте наиболее распространенные алгоритмы плани-рования процессов.

8. В чем заключается сущность алгоритмов планирования процес-сов, основанных на квантовании?

9. Опишите различия между относительными и абсолютными прио-ритетами.

10. Дайте определение понятиям вытесняющая и невытесняющая многозадачность.

11. Дайте определение понятию «прерывание».

12. Какие этапы реализуются механизмом обработки прерываний?

13. Приведите примеры внешних прерываний.

14. Какими событиями вызываются внутренние прерывания?

15. Поясните понятие программного прерывания.

16. Охарактеризуйте применяемые дисциплины обслуживания прерываний.

17. В чем заключается механизм синхронизации процессов?

18. Что такое «критическая область» программы и с какими целями она используется?

19. С помощью каких механизмов осуществляется взаимодействие процессов?

20. В чем различие понятий очередей процессов и взаимоблоки-ровок процессов?

21. Перечислите способы преодоления тупиковых ситуаций при взаимодействии процессов.

22. Опишите понятие монитора как высокоуровневого средства синхронизации процессов.

23. В чем различие понятий «процесс» и «поток»?

24. С какой целью в ОС используется механизм потоков («нитий»)?

Процессы и потоки (нити)

Контрольная

Информатика, кибернетика и программирование

Процессы и потоки (нити). 2.1 Процессы 2.1.1 Понятие процесса Процесс (задача) - программа, находящаяся в режиме выполнения. С каждым процессом связывается его адресное пространство, из которого он может читать и в которое он может писать данн...

Процессы и потоки (нити).

2.1 Процессы

2.1.1 Понятие процесса

Процесс (задача) - программа, находящаяся в режиме выполнения.

С каждым процессом связывается его адресное пространство, из которого он может читать и в которое он может писать данные.

Адресное пространство содержит:

  • саму программу
  • данные к программе
  • стек программы

С каждым процессом связывается набор регистров , например:

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

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

Некоторые поля таблицы :

Управление процессом

Управление памятью

Управление файлами

Регистры

Счетчик команд

Указатель стека

Состояние процесса

Приоритет

Параметры планирования

Идентификатор процесса

Родительский процесс

Группа процесса

Время начала процесса

Использованное процессорное время

Указатель на текстовый сегмент

Указатель на сегмент данных

Указатель на сегмент стека

Корневой каталог

Рабочий каталог

Дескрипторы файла

Идентификатор пользователя

Идентификатор группы

2.1.2 Модель процесса

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

Рассмотрим схему с четырьмя работающими программами.

В каждый момент времени активен только один процесс

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

2.1.3 Создание процесса

Три основных события, приводящие к созданию процессов (вызов fork или CreateProcess

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

    В UNIX каждому процессу присваивается идентификатор процесса (PID - Process IDentifier )

    2.1.4 Завершение процесса

    Четыре события, приводящие к остановке процесса (вызов exit или ExitProcess ):

    • Плановое завершение (окончание выполнения)
    • Плановый выход по известной ошибке (например, отсутствие файла)
    • Выход по неисправимой ошибке (ошибка в программе)
    • Уничтожение другим процессом

    Таким образом, приостановленный процесс состоит из собственного адресного пространства, обычно называемого образом памяти (core image ), и компонентов таблицы процессов (в числе компонентов и его регистры).

    2.1.5 Иерархия процессов

    В UNIX системах заложена жесткая иерархия процессов. Каждый новый процесс созданный системным вызовом fork, является дочерним к предыдущему процессу. Дочернему процессу достаются от родительского переменные, регистры и т.п. После вызова fork, как только родительские данные скопированы, последующие изменения в одном из процессов не влияют на другой, но процессы помнят о том, кто является родительским.

    В таком случае в UNIX существует и прародитель всех процессов - процесс init .

    Дерево процессов для систем UNIX

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

    2.1.6 Состояние процессов

    Три состояния процесса:

    • Выполнение (занимает процессор)
    • Готовность (процесс временно приостановлен, чтобы позволить выполняться другому процессу)
    • Ожидание (процесс не может быть запущен по своим внутренним причинам, например, ожидая операции ввода/вывода)

    Возможные переходы между состояниями.

    1. Процесс блокируется, ожидая входных данных

    2. Планировщик выбирает другой процесс

    3. Планировщик выбирает этот процесс

    4. Поступили входные данные

    Переходы 2 и 3 вызываются планировщиком процессов операционной системы, так что сами процессы даже не знают о этих переходах. С точки зрения самих процессов есть два состояния выполнения и ожидания.

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

    2.2 Потоки (нити, облегченный процесс)

    2.2.1 Понятие потока

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

    Сравнение многопоточной системы с однопоточной

    2.2.2 Модель потока

    С каждым потоком связывается :

    • Счетчик выполнения команд
    • Регистры для текущих переменных
    • Стек
    • Состояние

    Потоки делят между собой элементы своего процесса:

    • Адресное пространство
    • Глобальные переменные
    • Открытые файлы
    • Таймеры
    • Семафоры
    • Статистическую информацию.

    В остальном модель идентична модели процессов.

    В POSIX и W indows есть поддержка потоков на уровне ядра.

    В Linux есть новый системный вызов clone для создания потоков, отсутствующий во всех остальных версиях системы UNIX .

    В POSIX есть новый системный вызов pthread _ create для создания потоков.

    В W indows есть новый системный вызов Createthread для создания потоков.

    2.2.3 Преимущества использования потоков

    1. Упрощение программы в некоторых случаях, за счет использования общего адресного пространства.
    2. Быстрота создания потока, по сравнению с процессом, примерно в 100 раз.
    3. Повышение производительности самой программы, т.к. есть возможность одновременно выполнять вычисления на процессоре и операцию ввода/вывода. Пример: текстовый редактор с тремя потоками может одновременно взаимодействовать с пользователем, форматировать текст и записывать на диск резервную копию.

    2.2.4 Реализация потоков в пространстве пользователя, ядра и смешанное

    А - потоки в пространстве пользователя

    B - потоки в пространстве ядра

    В случае А ядро о потоках ничего не знает. Каждому процессу необходима таблица потоков , аналогичная таблице процессов.

    Преимущества случая А :

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

    Недостатки случая А :

    • Отсутствие прерывания по таймеру внутри одного процесса
    • При использовании блокирующего (процесс переводится в режим ожидания, например: чтение с клавиатуры, а данные не поступают) системного запроса все остальные потоки блокируются.
    • Сложность реализации

    Мультиплексирование потоков пользователя в потоках ядра

    Поток ядра может содержать несколько несколько потоков пользователя.

    2.2.5 Особенности реализации Windows

    Используется четыре понятия:

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

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

    PAGE 7


    А также другие работы, которые могут Вас заинтересовать

    77702. Конструкции дисководов CD-ROM 5.39 MB
    В этом заключается принципиальное отличие дисководов компактдисков от накопителей на жестких и гибких дисков в которых носители вращаются с постоянной угловой скоростью. Необходимость поддержания постоянной линейной скорости обусловлена исключительно тем что при воспроизведении звуковых компактдисков данные должны поступать в декодирующее устройство в постоянном и строго определенном темпе независимо от того с какого витка рожки они считываются. Механическая часть дисководов CDROM Конструкция дисководов компактдисков приведена на рис.
    77703. Устройства записи информации со сменными дисками 2.29 MB
    Однако в ближайшее время их скорее всего заменят пишущие DVDнакопители которые работают быстрее позволяют записывать прожигать 47Гбайт DVDносители что значительно удобнее 700Мбайт CDдисков и кроме того обеспечивают обратную совместимость с CDносителями поскольку могут работать как обычные накопители CDRW. Так МОнакопитель Fujitsu работает медленнее накопителей CDRW и DVDRW а по цене сильно проигрывает первым и сравним со вторыми. В том случае когда требуется иметь постоянно под рукой пятьдесять сменных...
    77705. Флэш-память. От ROM к Flash 572.5 KB
    Внимание которое уделяется флэш-памяти вполне объяснимо ведь это самый быстрорастущий сегмент полупроводникового рынка. Ежегодно рынок флэш-памяти растет более чем на 15 что превышает суммарный рост всей остальной полупроводниковой индустрии.
    77706. Технологии развития современной памяти 115 KB
    Всего за несколько десятилетий в области технологий хранения данных произошли разительные перемены а появление флешпамяти без преувеличения можно назвать революцией. Сегодня принцип хранения информации в электронных устройствах конечно отличается от условных расчётов Фейнмана но размер единичного элемента хранения известен около 40 нм в коммерческих устройствах на основе флешпамяти. Технологии устройств памяти следующего поколения будут использовать новые материалы обладать временем доступа в единицы наносекунд и хранить информацию...
    77707. Трёхмерная графитовая память 35.5 KB
    На сделанных сканирующим электронным микроскопом снимках видны графитовая полоска неизменённой ячейки памяти вверху и содержащей бит данных Выход нашли исследователи из Университета Райса Rice University в Хьюстоне которые показали что родственник графена графит может быть адаптирован для создания быстрых высокоёмких устройств хранения обладающих преимуществами по сравнению с флэшпамятью которой комплектуется сегодня множество мобильных устройств. Ячейки памяти могут быть расположены в виде вертикальных массивов что в...
    77709. Современные тенденции развития носителей информации 697 KB
    Интерфейс IDE Что бы ни говорили сторонники SCSI широкое распространение IDEустройств на сегодняшний день свершившийся факт. В идеале каждое IDEустройство стоит подключать к отдельному каналу в этом пожалуй заключается основное преимущество SCSI. И это одно из главных преимуществ IDE перед SCSI. SCSI Smll Computer System Interfce Несмотря на кажущееся засилье устройств с интерфейсом IDE EIDE по объемам выпуска за SCSI жесткими дисками всетаки остается около 27 рынка.

    .
    Для того чтобы, структурировать свое понимание – что представляют собой threads (это слово переводят на русский язык как «нити» почти везде, кроме книг по Win32 API, где его переводят как «потоки») и чем они отличаются от процессов, можно воспользоваться следующими двумя определениями:

    • Thread – это виртуальный процессор , имеющий свой собственный набор регистров, аналогичных регистрам настоящего центрального процессора. Один из наиважнейших регистров у виртуального процессора, как и у реального – это индивидуальный указатель на текущую инструкцию (например, индивидуальный регистр EIP на процессорах семейства x86),
    • Процесс – это в первую очередь адресное пространство . В современной архитектуре создаваемое ядром ОС посредством манипуляции страничными таблицами. И уже во вторую очередь на процесс следует смотреть как на точку привязки «ресурсов» в ОC. Если мы разбираем такой аспект, как многозадачность для того, чтобы понять суть threads, то нам не нужно в этот момент думать о «ресурсах» ОС типа файлов и к чему они привязаны.
    Очень важно понять, что thread – это концептуально именно виртуальный процессор и когда мы пишем реализацию threads в ядре ОС или в user-level библиотеке, то мы решаем именно задачу «размножения» центрального процессора во многих виртуальных экземплярах, которые логически или даже физически (на SMP, SMT и multi-core CPU платформах) работают параллельно друг с другом.
    На основном, концептуальном уровне, нет никакого «контекста». Контекст – это просто название той структуры данных, в которую ядро ОС или наша библиотека (реализующая threads) сохраняет регистры виртуального процессора , когда она переключается между ними, эмулируя их параллельную работу. Переключение контекстов – это способ реализации threads , а не более фундаментальное понятие, через которое нужно определять thread.
    При подходе к определению понятия thread через анализ API конкретных ОС обычно вводят слишком много сущностей – тут тебе и процессы, и адресные пространства, и контексты, и переключения этих контекстов, и прерывания от таймера, и кванты времени с приоритетами, и даже «ресурсы», привязанные к процессам (в противовес threads). И все это сплетено в один клубок и зачастую мы видим, что идем по кругу, читая определения. Увы, это распространенный способ объяснять суть threads в книгах, но такой подход сильно путает начинающих программистов и привязывает их понимание к конкретике реализации.
    Понятное дело, что все эти термины имеют право на существование и возникли не случайно, за каждым из них стоит какая-то важная сущность. Но среди них нужно выделить главные и второстепенные (введенные для реализации главных сущностей или навешанные на них сверху, уже на следующих уровнях абстракции).
    Главная идея thread – это виртуализация регистров центрального процессора – эмуляция на одном физическом процессоре нескольких логических процессоров, каждый из которых имеет свое собственное состояние регистров (включая указатель команд) и работает параллельно с остальными.
    Главное свойство процесса в контексте этого разговора – наличие у него своих собственных страничных таблиц, образующих его индивидуальное адресное пространство . Процесс не является сам по себе чем-то исполнимым.
    Можно говорить в определении, что «у каждого процесса в системе всегда есть по крайней мере один thread». А можно сказать иначе –адресное пространство логически лишено смысла для пользователя , если оно не видно хотя бы одному виртуальному процессору (thread). Поэтому логично, что все современные ОС уничтожают адресное пространство (завершают процесс) при завершении работы последнего thread, работающего на данном адресном пространстве. И можно не говорить в определении процесса, что в нем есть «по крайней мере, один thread». Тем более, что на нижнем системном уровне процесс (как правило) может существовать как объект ОС даже не имея в своем составе threads.
    Если Вы посмотрите исходники, например, ядра Windows, то Вы увидите, что адресное пространство и прочие структуры процесса конструируются до создания в нем начальной нити (начальной thread для этого процесса). По сути, изначально в процессе не существует threads вообще. В Windows можно даже создать thread в чужом адресном пространстве через user-level API…
    Если смотреть на thread как на виртуальный процессор – то его привязка к адресному пространству представляет собой загрузку в виртуальный регистр базы станичных таблиц нужного значения. :) Тем более, что на нижнем уровне именно это и происходит – каждый раз при переключении на thread, связанную с другим процессом, ядро ОС перезагружает регистр указателя на страничные таблицы (на тех процессорах, которые не поддерживают на аппаратном уровне работу со многими пространствами одновременно).

    4.1 Процессы

    4.1.1 Понятие процесса

    Процесс (задача) - программа, находящаяся в режиме выполнения.

    С каждым процессом связывается его адресное пространство, из которого он может читать и в которое он может писать данные.

    Адресное пространство содержит:

      саму программу

      данные к программе

      стек программы

    С каждым процессом связывается набор регистров, например:

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

      указатель стека

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

    Некоторые поля таблицы:

    Управление процессом

    Управление памятью

    Управление файлами

    Регистры

    Счетчик команд

    Указатель стека

    Состояние процесса

    Приоритет

    Параметры планирования

    Идентификатор процесса

    Родительский процесс

    Группа процесса

    Время начала процесса

    Использованное процессорное время

    Указатель на текстовый сегмент

    Указатель на сегмент данных

    Указатель на сегмент стека

    Корневой каталог

    Рабочий каталог

    Дескрипторы файла

    Идентификатор пользователя

    Идентификатор группы

    4.1.2 Модель процесса

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

    Рассмотрим схему с четырьмя работающими программами.

    В каждый момент времени активен только один процесс

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

    4.1.3 Создание процесса

    Три основных события, приводящие к созданию процессов (вызов fork или CreateProcess ):

      Работающий процесс подает системный вызов на создание процесса

      Запрос пользователя на создание процесса

    Во всех случаях, активный текущий процесс посылает системный вызов на создание нового процесса.

    В UNIX каждому процессу присваивается идентификатор процесса (PID - Process IDentifier)

    4.1.4 Завершение процесса

    Четыре события, приводящие к остановке процесса (вызов exit или ExitProcess ):

      Плановое завершение (окончание выполнения)

      Плановый выход по известной ошибке (например, отсутствие файла)

      Выход по неисправимой ошибке (ошибка в программе)

      Уничтожение другим процессом

    Таким образом, приостановленный процесс состоит из собственного адресного пространства, обычно называемого образом памяти (core image ), и компонентов таблицы процессов (в числе компонентов и его регистры).

    4.1.5 Иерархия процессов

    В UNIX системах заложена жесткая иерархия процессов. Каждый новый процесс созданный системным вызовом fork, является дочерним к предыдущему процессу. Дочернему процессу достаются от родительского переменные, регистры и т.п. После вызова fork, как только родительские данные скопированы, последующие изменения в одном из процессов не влияют на другой, но процессы помнят о том, кто является родительским.

    В таком случае в UNIX существует и прародитель всех процессов - процесс init .

    Дерево процессов для систем UNIX

    4.1.6 Состояние процессов

    Три состояния процесса:

      Выполнение (занимает процессор)

      Готовность (процесс временно приостановлен, чтобы позволить выполняться другому процессу)

      Ожидание (процесс не может быть запущен по своим внутренним причинам, например, ожидая операции ввода/вывода)

    Возможные переходы между состояниями.

    1. Процесс блокируется, ожидая входных данных

    2. Планировщик выбирает другой процесс

    3. Планировщик выбирает этот процесс

    4. Поступили входные данные

    Переходы 2 и 3 вызываются планировщиком процессов операционной системы, так что сами процессы даже не знают о этих переходах. С точки зрения самих процессов есть два состояния выполнения и ожидания.

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

    4.2 Потоки (нити, облегченный процесс)

    4.2.1 Понятие потока

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

    4.2.2 Модель потока

    С каждым потоком связывается:

      Счетчик выполнения команд

      Регистры для текущих переменных

      Состояние

    Потоки делят между собой элементы своего процесса:

      Адресное пространство

      Глобальные переменные

      Открытые файлы

    • Семафоры

      Статистическую информацию.

    В остальном модель идентична модели процессов.

    В POSIX и Windows есть поддержка потоков на уровне ядра.

    4.2.3 Преимущества использования потоков

      Упрощение программы в некоторых случаях, за счет использования общего адресного пространства.

      Быстрота создания потока, по сравнению с процессом, примерно в 100 раз.

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

    4.2.4 Реализация потоков в пространстве пользователя, ядра и смешанное

    B - потоки в пространстве ядра

    В случае А ядро о потоках ничего не знает. Каждому процессу необходима таблица потоков , аналогичная таблице процессов.

    Преимущества случая А :

      Такую многопоточность можно реализовать на ядре не поддерживающим многопоточность

      Более быстрое переключение, создание и завершение потоков

      Процесс может иметь собственный алгоритм планирования.

    Недостатки случая А :

      Отсутствие прерывания по таймеру внутри одного процесса

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

      Сложность реализации

    Логическая реализация относится к средствам связи ориентированным на организацию взаимодействия различных процессов. Однако, усилия, направленные на ускорение решения задач в классических ОС привели к появлению совершенно иных механизмов, к изменению самого понятии процесса.

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

    Ввести массив А

    Ввести массив В

    Ввести массив С

    Вывести массив С

    При выполнении такой программы в рамках одного процесса этот процесс будет 4 раза блокироваться ожидая окончания операции ввода/вывода. Но этот алгоритм обладает внутренним параллелизмом. Вычисление суммы массивов А+В можно было бы выполнять параллельно с ожиданием окончания операции ввода массива С. Такое совмещение опереций можно реализовать использую два взаимодействующих процессов. Для простаты считаем что процессы взаимодействуют через разделяемую память.

    Процесс 1 процесс 2

    Создать процесс

    Переключение контекста

    Выделение общей памяти

    Ожидание ввода А и В

    Переключение контекста

    Выделение общей памяти

    Переключение контекста

    Переключение контекста

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

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

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

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



    Процесс находится в состоянии исполнения если одна из его нитей находится в состояние исполнения. Процесс находится в состояние ожидания если все его нити находятся в состоянии ожидания. Наконец, процесс находится в состоянии завершил исполнение если все его нити находятся в состоянии завершил исполнение.

    Пока одна нить процесса заблокирована,

    другая нить того же процесса может выполняться. Нити разделяют Ц.П. так же как это делали традиционные процессы в соответствии с рассмотренными алгоритмами планирования. Т.к. нити одного процесса разделяют существенно больше ресурсов чем различные процессы то операции создания новой нити и переключения контекста между нитями одного процесса занимают значительно меньше времени, чем аналогичные операции другого процесса в целом.

    Различают ОС поддерживающие нити на уровне ядра и на уровне библиотеки. ОС поддерживающая нити на уровне ядра использует планирование Ц.П. в терминах нити а управление памятью и другими ресурсами остается в терминах процесса. В ОС поддерживающей нити на уровне библиотек пользователей и планирование Ц.П. и управление ресурсами осуществляется в терминах процесс.

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

    Управление памятью.

    Деятельность ОС по распределению памяти между пользовательскими процессами и компонентами ОС называется управлением памятью, а часть ОС, которая отвечает за управление памятью называется менеджером памяти.



    Загрузка...