45436

Понятие ядра и процесса, состояние процесса, подпроцессы. Межпроцессное взаимодействие

Доклад

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

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

Русский

2013-11-17

175.5 KB

4 чел.

  1.  Понятие ядра и процесса, состояние процесса, подпроцессы. Межпроцессное взаимодействие

Резидентная в RAM часть OS UNIX называется ядром. Программа ядра оформлена как выполняемый файл, который хранится в корневом каталоге корневой файловой системы OS UNIX и имеет имя, однозначно выделяющее его среди других файлов. Ядро считывается в RAM программой начальной загрузки, начиная с нулевого адреса. После загрузки ядро постоянно находится в RAM, обеспечивая управление подсистемами OS UNIX посредством соответствующих ядерных подпрограмм, системных таблиц и буферов.

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

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

ДИАГРАММА СОСТОЯНИЙ ПРОЦЕССА

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

В многозадачной  системе процесс может находиться в одном из основных состояний:

ВЫПОЛНЕНИЕ ­ активное состояние активного процесса, во время которого процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором (обладает главным ресурсом);

ОЖИДАНИЕ или БЛОКИРОВКА ­ пассивное состояние активного процесса; процесс заблокирован, т.е. не может выполняться по своим внутренним причинам, поскольку ждет некоторого события (например, окончания операции ввода/вывода, освобождение ресурса)

ГОТОВНОСТЬ ­ также пассивное состояние активного процесса; но в этом случае процесс заблокирован в связи с внешними по отношению к нему обстоятельствами: процесс имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого процесса или обработкой системного события.

Эти состояния являются состояниями активного процесса, при этом процесс обладает некоторыми ресурсами (по крайней мере, оперативной памятью).

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

ПРИОСТАНОВКА ­ состояние пассивного процесса, при котором процесс освобождает все захваченные ресурсы, выгружается на внешний носитель, но не уничтожается. Может использоваться при катастрофической нехватке ресурсов для разгрузки системы.

БЕЗДЕЙСТВИЕ ­ состояние пассивного процесса, при котором процесс находится в «режиме сна». Это состояние процесса в теории ОС появилось недавно (с появлением большого количества диалоговых систем). Большинство современных операционных систем могут переводить процесс в состояние бездействия ­ так называемый «режим сна» после реакции на команду пользователя (в диалоговых системах) или другое событие в ожидании следующего события (антивирусные программы). В таких системах процесс может иметь статус задачи, но при этом не быть исполняемой программой и активизироваться в определенный момент времени при наступлении некоторого события.

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

Рис.2.1. Диаграмма состояний процессов

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

Основные операции над процессами:

  1.  Порождение (инициирование)
  2.  Запуск
  3.  Уничтожение
  4.  Блокирование
  5.  Пробуждение
  6.  Принудительное прекращение
  7.  Изменение приоритета (передвижение по очереди)

Дополнительные операции:

  1.  Приостановка
  2.  Возобновление
  3.  Активизация
  4.  Переход к бездействию.

Описание операций:

0 1: Порождение процесса:

  •  Создание блока управления процессом (БУП);
  •  Размещение процесса в памяти;
  •  Постановка в очередь готовых процессов.

1 2: Запуск. При этом процессу предоставляется  время центрального процессора. Управление передается процессу.

2 1: Принудительное прекращение (чтобы предотвратить монопольный захват одним процессом процессорного времени). Система перехватывает управление.

        Может произойти по двум причинам:

  1.  истечение кванта времени;
  2.  появление задачи с большим приоритетом.

Квант ­ временной интервал, в течение которого процессу разрешено занимать процессор.

2 Þ 3: Блокировка. Процесс ожидает некоторого системного события, блокирует сам себя и передает управление системе. Может существовать несколько очередей блокированных процессов. Эти  очереди не связаны между собой.

2 Þ 0: Уничтожение процесса. Освобождение ресурсов и уничтожение БУП.

3 Þ 1: Пробуждение. Ожидаемое событие произошло, процесс может продолжить работу. Если процессор занят другим процессом или обработкой системного события, процесс ставится в очередь готовых процессов. Если процессор свободен, процесс запускается на выполнение без фактической постановки в очередь.

1 Þ 1: Изменение приоритета. Передвижение процесса по очереди.

3 Þ 4: Приостановка ­ освобождение ресурсов (с выгрузкой из оперативной памяти) без уничтожения БУП и с возможностью восстановления.

4 Þ 3: Возобновление ­ захват ресурсов и подготовка к дальнейшему выполнению.

1 Þ 5: Приостановка ­ освобождение ресурсов без уничтожения БУП

5 Þ 1: Возобновление ­ захват ресурсов и постановка в очередь готовых процессов.

4 Þ 5: Пробуждение в состоянии приостановки. Ожидаемое событие произошло, процесс может продолжить работу.

В случае использования состояния бездействия:

0 Þ * ­ порождение процесса.

* Þ 1 ­ активизация процесса.

* Þ 0 ­ уничтожение процесса.

Переход в состояние * ─ это переход в состояние бездействия. Он может быть совершен из любого из 3-х основных состояний процесса:  1 Þ *, 2 Þ *, 3 Þ *.

Активизация процесса происходит в следующих случаях:

  •  по команде пользователя в диалоговой системе;
  •  по вызову другой задачи;
  •  по прерыванию от внешнего инициативного устройства (напр., сигнал о свершении события – СРВ);
  •  при наступлении запланированного времени запуска.

Проблема синхронизации

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

Рис. 2.3. Пример необходимости синхронизации 

Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Рассмотрим, например (рисунок 2.3), программу печати файлов (принт-сервер). Эта программа печатает по очереди все файлы, имена которых последовательно в порядке поступления записывают в специальный общедоступный файл "заказов" другие программы. Особая переменная NEXT, также доступная всем процессам-клиентам, содержит номер первой свободной для записи имени файла позиции файла "заказов". Процессы-клиенты читают эту переменную, записывают в соответствующую позицию файла "заказов" имя своего файла и наращивают значение NEXT на единицу. Предположим, что в некоторый момент процесс R решил распечатать свой файл, для этого он прочитал значение переменной NEXT, значение которой для определенности предположим равным 4. Процесс запомнил это значение, но поместить имя файла не успел, так как его выполнение было прервано (например, в следствие исчерпания кванта). Очередной процесс S, желающий распечатать файл, прочитал то же самое значение переменной NEXT, поместил в четвертую позицию имя своего файла и нарастил значение переменной на единицу. Когда в очередной раз управление будет передано процессу R, то он, продолжая свое выполнение, в полном соответствии со значением текущей свободной позиции, полученным во время предыдущей итерации, запишет имя файла также в позицию 4, поверх имени файла процесса S.

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

Критическая секция

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

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

Рис. 2.4. Реализация критических секций с использованием блокирующих переменных 

Другим способом является использование блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят. На рисунке 2.4 показан фрагмент алгоритма процесса, использующего для реализации взаимного исключения доступа к разделяемому ресурсу D блокирующую переменную F(D). Перед входом в критическую секцию процесс проверяет, свободен ли ресурс D. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной F(D) устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной F(D) снова устанавливается равным 1.

Если все процессы написаны с использованием вышеописанных соглашений, то взаимное исключение гарантируется. Следует заметить, что операция проверки и установки блокирующей переменной должна быть неделимой. Поясним это. Пусть в результате проверки переменной процесс определил, что ресурс свободен, но сразу после этого, не успев установить переменную в 0, был прерван. За время его приостановки другой процесс занял ресурс, вошел в свою критическую секцию, но также был прерван, не завершив работы с разделяемым ресурсом. Когда управление было возвращено первому процессу, он, считая ресурс свободным, установил признак занятости и начал выполнять свою критическую секцию. Таким образом был нарушен принцип взаимного исключения, что потенциально может привести к нежелаемым последствиям. Во избежание таких ситуаций в системе команд машины желательно иметь единую команду "проверка-установка", или же реализовывать системными средствами соответствующие программные примитивы, которые бы запрещали прерывания на протяжении всей операции проверки и установки.

Реализация критических секций с использованием блокирующих переменных имеет существенный недостаток: в течение времени, когда один процесс находится в критической секции, другой процесс, которому требуется тот же ресурс, будет выполнять рутинные действия по опросу блокирующей переменной, бесполезно тратя процессорное время. Для устранения таких ситуаций может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события. На рисунке 2.5 показан фрагмент алгоритма процесса, использующего эти функции. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.

Обобщающее средство синхронизации процессов предложил Дейкстра, который ввел два новых примитива. В абстрактной форме эти примитивы, обозначаемые P и V, оперируют над целыми неотрицательными переменными, называемыми семафорами. Пусть S такой семафор. Операции определяются следующим образом:

V(S) : переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.

P(S) : уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.

Рис. 2.5. Реализация критической секции с использованием системных
функций WAIT(D) и POST(D)
 

В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Операция P заключает в себе потенциальную возможность перехода процесса, который ее выполняет, в состояние ожидания, в то время как V-операция может при некоторых обстоятельствах активизировать другой процесс, приостановленный операцией P (сравните эти операции с системными функциями WAIT и POST).

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

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

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


#define N 256


int e = N, f = 0, b = 1;

void Writer ()


{


while(1)


{


PrepareNextRecord(); /* подготовка новой записи   */


P(e);           /* Уменьшить число свободных буферов, если они есть */


              /* в противном случае - ждать, пока они освободятся */


P(b);           /* Вход в критическую секцию  */


AddToBuffer();  /* Добавить новую запись в буфер */


V(b);           /* Выход из критической секции   */


V(f);           /* Увеличить число занятых буферов */


}


}

void Reader ()


{


while(1)


{


P(f);             /* Уменьшить число занятых буферов, если они есть */


                 /* в противном случае ждать, пока они появятся    */


P(b);             /* Вход в критическую секцию                      */


GetFromBuffer();  /* Взять запись из буфера                         */


V(b);             /* Выход из критической секции                    */


V(e);             /* Увеличить число свободных буферов              */


ProcessRecord();  /* Обработать запись                              */


}


}

Тупики

Приведенный выше пример поможет нам проиллюстрировать еще одну проблему синхронизации - взаимные блокировки, называемые также дедлоками (deadlocks), клинчами (clinch) или тупиками. Если переставить местами операции P(e) и P(b) в программе "писателе", то при некотором стечении обстоятельств эти два процесса могут взаимно заблокировать друг друга. Действительно, пусть "писатель" первым войдет в критическую секцию и обнаружит отсутствие свободных буферов; он начнет ждать, когда "читатель" возьмет очередную запись из буфера, но "читатель" не сможет этого сделать, так как для этого необходимо войти в критическую секцию, вход в которую заблокирован процессом "писателем".

Рассмотрим еще один пример тупика. Пусть двум процессам, выполняющимся в режиме мультипрограммирования, для выполнения их работы нужно два ресурса, например, принтер и диск. На рисунке 2.6,а показаны фрагменты соответствующих программ. И пусть после того, как процесс А занял принтер (установил блокирующую переменную), он был прерван. Управление получил процесс В, который сначала занял диск, но при выполнении следующей команды был заблокирован, так как принтер оказался уже занятым процессом А. Управление снова получил процесс А, который в соответствии со своей программой сделал попытку занять диск и был заблокирован: диск уже распределен процессу В. В таком положении процессы А и В могут находиться сколь угодно долго.

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

Рис. 2.6. (a) фрагменты программ А и В, разделяющих принтер и диск;
(б) взаимная блокировка (клинч);(в) очередь к разделяемому диску;
(г) независимое использование ресурсов
 

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

Проблема тупиков включает в себя следующие задачи:

  •  предотвращение тупиков,
  •  распознавание тупиков,
  •  восстановление системы после тупиков.

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

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

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

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

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

Нити

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

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

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

Для этих целей современные ОС предлагают использовать сравнительно новый механизм многонитевой обработки (multithreading). При этом вводится новое понятие "нить" (thread), а понятие "процесс" в значительной степени меняет смысл.

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

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

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

Нити иногда называют облегченными процессами или мини-процессами. Действительно, нити во многих отношениях подобны процессам. Каждая нить выполняется строго последовательно и имеет свой собственный программный счетчик и стек. Нити, как и процессы, могут, например, порождать нити-потомки, могут переходить из состояния в состояние. Подобно традиционным процессам (то есть процессам, состоящим из одной нити), нити могут находится в одном из следующих состояний: ВЫПОЛНЕНИЕ, ОЖИДАНИЕ и ГОТОВНОСТЬ. Пока одна нить заблокирована, другая нить того же процесса может выполняться. Нити разделяют процессор так, как это делают процессы, в соответствии с различными вариантами планирования.

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

Итак, нити имеют собственные:

  •  программный счетчик,
  •  стек,
  •  регистры,
  •  нити-потомки,
  •  состояние.

Нити разделяют:

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

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

Широкое применение находит многонитевая обработка в распределенных системах. Смотрите об этом в разделе "Процессы и нити в распределенных системах".

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

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


 

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

17985. Хозяйственное право в системе права Украины 169.5 KB
  Лекция № 1 :€œХозяйственное право в системе права Украины€ План 1. Понятие и виды хозяйственной деятельности. 2.Понятие и виды хозяйственных отношений. 3. Методы государственного регулирования хозяйственных правоотношений. 4. Принципы хозяйственного права. 5. И...
17986. ЦЕНТРАЛЬНЫЙ БАНК И ДЕНЕЖНО-КРЕДИТНАЯ ПОЛИТИКА 435.5 KB
  ОПОРНЫЙ КОНСПЕКТ ЛЕКЦИЙ по дисциплине ЦЕНТРАЛЬНЫЙ БАНК И ДЕНЕЖНОКРЕДИТНАЯ ПОЛИТИКА Тема 1. НАЦИОНАЛЬНЫЙ БАНК УКРАИНЫ – ЦЕНТРАЛЬНЫЙ БАНК СТРАНЫ Назначение и правовой статус центральных банков. Основные задачи функции и принципы деятельности НБУ. ...
17987. ФИНАНСОВЫЙ МЕНЕДЖМЕНТ 1.33 MB
  конспект лекций по предмету Финансовый менеджмент Вступление В предлагаемом курсе лекций наложены основные методы и практические приемы которые применяются для эффективного управления формированием и использованием финансовых ресурсов предприяти...
17988. ЕКОНОМІКА ПРАЦІ І СОЦІАЛЬНО-ТРУДОВІ ВІДНОСИНИ 3.69 MB
  В.Г.СУМЦОВ І.Г.ФИЛИППОВА Г.С. БАЛАХНІН Є.В.ЯРМАК ЕКОНОМІКА ПРАЦІ І СОЦІАЛЬНОТРУДОВІ ВІДНОСИНИ Розглянуто сутність праці формування і використання трудового потенціалу людського капіталу зайнятості населення ринку праці безробіття та його соціальноекономічних...
17989. 4D Брендинг 1.55 MB
  Томас Гэд 4D Брендинг От автора ПРОИЗНЕСИТЕ СЛОВО брэндинг и оно прозвучит как магическое заклинание. Коммерческая нирвана успокоение по мере того как перед вашими глазами проходят логотипы потребительских брэндов: CocaCola Heineken Marlboro Nescafe. Волшебные названия и и
17990. 22 НЕПРЕЛОЖНЫХ ЗАКОНА МАРКЕТИНГА 898.5 KB
  Д.ТРАУТ. 22 НЕПРЕЛОЖНЫХ ЗАКОНА МАРКЕТИНГА Нарушайте их на свой страх и риск Введение Миллиарды долларов были попусту истрачены на маркетинговые программы которые заранее были обречены на провал независимо от того насколько они были умными и блестящими или от т...
17991. Экология. Конспект лекций 929.5 KB
  Экология ЛЕКЦИЯ №1 Научнотехнический прогресс и состояние окружающей среды. Предмет и задачи дисциплины. Понятие об еэкологическом кризисе.Причины возникновения природоохранных экологических и ресурсныхпроблем человечества. Основные причины экологического кри
17992. 500 cоветов секретарю 2.74 MB
  Ольга Энговатова 500 cоветов секретарю Введение Секретарь – первый с кем встречается посетитель приходя в фирму учреждение организацию предприятие. Он как бы представляет фирму. Через него идет прием посетителей и ведутся телефонные переговоры. Именно
17993. Іноземна мова зі спеціальності Економіка і підприємництво та Менеджмент 791.5 KB
  МЕТОДИЧНІ ВКАЗІВКИ І ЗАВДАННЯ ДЛЯ САМОСТІЙНОЇ РОБОТИ з дисципліни Іноземна мова зі спеціальності для студентів Інституту післядипломної освіти і дистанційного навчання ІПОДН спеціальностей Економіка і підприємництво та Менеджмент Методичні вказівки і