Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
1.Понятие ОС. Многоуровневость современных машин.
2.Понятие ОС. Функции ОС. POSIX.
Существуют две группы определений ОС: «набор программ, управляющих оборудованием» и «набор программ, управляющих другими программами».
Операцио́нная систе́ма— комплекс управляющих и обрабатывающих программ, которые, с одной стороны, выступают как интерфейс между устройствами вычислительной системы и прикладными программами, а с другой стороны — предназначены для управления устройствами, управления вычислительными процессами, эффективного распределения вычислительных ресурсов между вычислительными процессами и организации надёжных вычислений.
Многоуровневость современных машин.
Основная идея многоуровневой архитектуры состоит в следующем:
1. Полная функциональность операционной системы разделяется на уровни, например уровень управления аппаратурой, уровень управления памятью, уровень файловой системы, уровень управления процессами и т. п.
2. Для каждого уровня определяются интерфейс взаимодействия, т. е. некоторый набор правил, согласно которым следует обращаться за услугами данного уровня.
3. Взаимодействие уровней строится таким образом, что каждый уровень может обращаться за услугами только к соседнему нижележащему уровню через его интерфейс.
4. Внутренние структуры данных каждого уровня не доступны другим уровням, а реализации процедур уровня скрыты и не зависят от реализаций процедур внутри других уровней.
Обязательным условием для разбиения функциональности на уровни является взаимодействие только между соседними уровнями. В многоуровневых системах за-прещаются прямые обращения к любым уровням, минуя соседний уровень
Упрощенная архитектура операционной системы UNIX:

На верхнем уровне иерархии операционной системы находятся процессы пользовательского режима, которые взаимодействуют с ядром операционной системы через интерфейс системных вызовов. Интерфейс системных вызовов перенаправляет запросы процессов подсистемам ядра. Подсистемы ядра обеспечивают выполнение процессов пользовательского режима и через уровень управления аппаратурой взаимодействуют с аппаратурой ЭВМ.
Ядро UNIX включает традиционные подсистемы, такие как файловая подсистема, подсистема ввода-вывода, подсистема управления процессами и памятью,
Функции ОС.
1. Выполнение по запросу программ тех достаточно элементарных (низкоуровневых) действий, которые являются общими для большинства программ и часто встречаются почти во всех программах (ввод и вывод данных, запуск и остановка других программ, выделение и освобождение дополнительной памяти и др.).
2. Загрузка программ в оперативную память и их выполнение.
3. Стандартизованный доступ к периферийным устройствам (устройства ввода-вывода).
4. Управление оперативной памятью (распределение между процессами, организация виртуальной памяти).
5. Управление доступом к данным на энергонезависимых носителях.
6. Обеспечение пользовательского интерфейса.
7. Сетевые операции, поддержка стека сетевых протоколов.
8. Параллельное или псевдопараллельное выполнение задач (многозадачность).
9. Эффективное распределение ресурсов вычислительной системы между процессами.
10. Разграничение доступа различных процессов к ресурсам.
11. Организация надёжных вычислений (невозможности одного вычислительного процесса намеренно или по ошибке повлиять на вычисления в другом процессе), основана на разграничении доступа к ресурсам.
12. Взаимодействие между процессами: обмен данными, взаимная синхронизация.
13. Защита самой системы, а также пользовательских данных и программ от действий пользователей (злонамеренных или по незнанию) или приложений.
14. Многопользовательский режим работы и разграничение прав доступа
POSIX - это стандарт, описывающий интерфейс между операционной системой и прикладной программой. Фактически, этот стандарт описывает то, как программа должна вызывать системные функции для того, чтобы свободно запускаться под всеми операционными системами, отвечающими данному стандарту.
ñ Создание и управление процессами
Сигналы Исключения плавающей точки Нарушение сегментации Запрещенные директивы Ошибки шины Таймеры Операции над файлами (директориями) Каналы Библиотека C (Стандартный С) Интерфейс и контроль ввода/вывода Триггеры процессов
ñ Планировка приоритетов
Сигналы реального времени Таймеры и синхронизация Семафоры Передача сообщений Разделяемая память Асинхронный и синхронный ввод/вывод Интерфейс блокировки памяти
ñ Создание, контроль и завершение выполнения потоков
Планировщик потоков Синхронизация потоков Обработка сигналов
3.Режимы работы процессора. Реальный режим работы процессора.
4.Режимы работы процессора. Защищенный режим работы процессора.
Реальный режим работы процессора:
В этом режиме программа, выполняющаяся в данный момент имела полный доступ ко всей наличествующей оперативной памяти.
Для работы с памятью используются две шины: шина адреса и шина данных. Ширина шины адреса определяет максимальный объём физической памяти, непосредственно адресуемой процессором. Ширина шины данных, соответственно максимальный объем адресуемой памяти.
Все регистры процессора были 16-битными, отсюда возникла проблема представления 20-разрядного физического адреса памяти при помощи содержимого 16-разрядных регистров. Для разрешения этой проблемы используется двухкомпонентный логический адрес: компоненты сегмента памяти и компоненты смещения внутри сегмента. Для получения 20-разрядного физического адреса к сегментной компоненте приписывается справа четыре нулевых бита (для расширения до 20 разрядов), затем полученное число складывается с компонентой смещения. Перед сложением к компоненте смещения слева дописывается четыре нулевых бита (также для расширения до 20 разрядов).
Логический адрес принято записывать в форме <сегмент:смещение>.
Например, пусть у нас есть логический адрес 1234h:0123h. Сегментная компонента равна 1234h, компонента смещения - 0123h. Вычислим физический адрес, соответствующий нашему логическому адресу:
расширяем до 20 бит сегментную компоненту, дописывая справа 4 нулевых бита, получаем число 12340h;
расширяем до 20 бит компоненту смещения, дописывая слева 4 нулевых бита, получаем число 00123h;
для получения физического адреса складываем полученные числа: 12340h + 00123h = 12453h.
Очевидно, что одному физическому адресу может соответствовать несколько логических. Например, физическому адресу 12453h соответствует логический адрес 1245h:0003h.

Выделим три основных недостатка схемы адресации памяти реального режима:
ограниченное адресное пространство;
свободный доступ для любых программ к любым областям данных, что представляет потенциальную опасность для целостности операционной системы,
трудность реализовать многозадачность.
Защищенный режим (Protected Mode)
Ключевыми особенностями защищенного режима являются: виртуальное адресное пространство, защита и многозадачность.
В защищенном режиме программа оперирует адресами, которые могут относиться к физически отсутствующим ячейкам памяти, поэтому такое адресное пространство называется виртуальным. Размер виртуального адресного пространства программы может превышать емкость физической памяти и достигать 64Тбайт. Для адресации виртуального адресного пространства используется сегментация и страничная организация памяти.
У каждой программы в защищенном режиме есть свой, личный набор сегментов: данных, кода, стека и прочего. При попытке влезть в чужой сегмент, происходит Segmentation fault.
Встроенные средства переключения задач обеспечивают многозадачность в защищенном режиме. Микропроцессор способен быстро переключаться из одной среды выполнения в другую, имитируя параллельную работу нескольких задач.
Защита задач обеспечивается следующими средствами: контроль пределов сегментов, контроль типов сегментов, контроль привилегий, привилегированные инструкции и защита на уровне страниц. Контроль пределов и типов сегментов обеспечивает целостность сегментов кода и данных. Программа не имеет права обращаться к виртуальной памяти, выходящей за предел того или иного сегмента. Программа не имеет права обращаться к сегменту данных как к коду и наоборот.
5.Процессы. Состояния процессов. Операции над процессами.
Процесс — это выполняющаяся программа включая текущие значения счетчиков команд(регистр процессора, содержащий адрес текущей выполняемой команды), регистров и переменных.
Процесс характеризует некоторую совокупность набора исполняющихся команд, ассоциированных с ним ресурсов и текущего момента его выполнения, находящуюся под управлением операционной системы.
Все процессы система регистрирует в таблице процессов, присваивая каждому уникальный номер — идентификатор процесса (process identificator, PID). Процессы получают доступ к ресурсам системы (опреативной памяти, файлам, внешним устройствам и т. п.) и могут изменять их содержимое. Доступ регулируется с помощью идентификатора пользователя и идентификатора группы, которые система присваивает каждому процессу.

При рождении процесс получает в свое распоряжение адресное пространство, в которое загружается программный код процесса; ему выделяются стек и системные ресурсы; устанавливается начальное значение программного счетчика этого процесса и т. д.
Родившийся процесс переводится в состояние готовность. Всякий новый процесс, появляющийся в системе, попадает в состояние готовность. Операционная система, пользуясь каким-либо алгоритмом планирования, выбирает один из готовых процессов и переводит его в состояние исполнение. В состоянии исполнение происходит непосредственное выполнение программного кода процесса. Выйти из этого состояния процесс может по трем причинам: операционная система прекращает его деятельность; он не может продолжать свою работу, пока не произойдет некоторое событие, и операционная система переводит его в состояние ожидание; в результате возникновения прерывания в вычислительной системе (например, прерывания от таймера по истечении предусмотренного времени выполнения) его возвращают в состояние готовность.
Из состояния ожидание процесс попадает в состояние готовность после того, как ожидаемое событие произошло, и он снова может быть выбран для исполнения.
При завершении своей деятельности процесс из состояния исполнение попадает в состояние закончил исполнение.
Операции над процессами:
1. Создание процесса
Процесс не может перейти из одного состояния в другое самостоятельно. Изменением состояния процессов занимается операционная система, совершая операции над ними:
создание процесса – завершение процесса;
приостановка процесса (перевод из состояния исполнение в состояние готовность) – запуск процесса (перевод из состояния готовность в состояние исполнение);
блокирование процесса (перевод из состояния исполнение в состояние ожидание) – разблокирование процесса (перевод из состояния ожидание в состояние готовность).
Одноразовые операции:
Три основных события, приводящие к созданию процессов:
инициализация системы,
работающий процесс подает системный запрос на создание процесса,
запрос пользователя на создание процесса.
В UNIX-подобных системах сужествует только один запрос, направленный на создание нового процесса: fork().Процесс, вызывающий функцию fork, называется родительским (процесс-родитель), вновь создаваемый процесс называется порожденным (процесс-потомок). Дочерний процесс ничем не отличается от родительского, но во-первых, эти процессы имеют разные PID, под которыми они зарегистрированы в таблице процессов, а во-вторых, различается возвращаемое значение fork(): родительский процесс получает в качестве результата fork() идентификатор процесса-потомка, а процесс-потомок получает «0».
2.Завершение процесса
События, приводящие к остановке процесса:
плановое завершение (окончание выполнения),
плановый выход по известной ошибке (например, отсутствие файла),
выход по неисправимой ошибке (ошибка в программе),
уничтожение другим процессом.
Зачастую причиной завершения процесса становится плановое завершение. В таком случае по завершении программы, процесс выполняет системный запрос дабы сообщить системе о том, что он закончил свою работу. В UNIX-подобных системах этот системный запрос — exit().
Вторая причина — неустранимая ошибка. Примером может служить попытка скомпилировать несуществующий исходник.
Третья причина — выход по неисправимой ошибке, такой ошибкой может быть обращение к несуществующей памяти или деление на ноль.
Четвертая причина — системный запрос, выполненный другим процессом на завершение процесса. В UNIX такой запрос — kill().
Многоразовые операции
Запуск процесса.
Приостановка процесса.
Блокирование процесса.
Разблокирование процесса.
6.Процессы. Процессы в UNIX. Принцип работы оболочки-терминала.
Создание и завершение процесса
Процесс порождается с помощью системного вызова fork(). При этом вызове происходит проверка на наличие свободной памяти, доступной для размещения нового процесса. Если требуемая память доступна, то создается процесс-потомок текущего процесса, представляющий собой точную копию вызывающего процесса. При этом в таблице процессов для нового процесса строится соответствующая структура
Для завершения процесса используется системный вызов exit(), при котором освобождаются все используемые ресурсы, такие как память и структуры таблиц ядра. Кроме того, завершаются и процесс-потомки, порожденные данным процессом. Затем из памяти удаляются сегменты кода и данных, а сам процесс переходит в состояние зомби (для таких процессов в таблицах ядра сохраняются некоторые записи, но в конечном счете его судьбу решает его родительский процесс). И наконец родительский процесс должен очистить все ресурсы, занимаемые дочерними процессами.
Взаимодействие процессов
-сокеты (sockets). Программы подключаются к сокету и выдают запрос на привязку к нужному адресу. Затем данные передаются от одного сокета к другому в соответствии с указанным адресом.
-Сигнал
-Каналы
-очередь сообщений представляет собой механизм, когда один процесс предоставляет блок данных с установленными флагами, а другой процесс разыскивает блок данных, флаги которого установлены в требуемых значениях.
-Семафоры представляют собой средство передачи флагов от одного процесса к другому. "Подняв" семафор, процесс может сообщить, что он находится в определенном состоянии. Любой другой процесс в системе может отыскать этот флаг и выполнить необходимые действия.
-Совместно используемая память позволяет процессам получить доступ к одной и той же области физической памяти.
В общем случае терминал – это точка входа пользователя в систему, обладающая способностью передавать текстовую информацию.
Основная среда взаимодействия с UNIX – командная строка. Суть её в том, что каждая строка, передаваемая пользователем системе, – это команда, которую та должна выполнить. Пока не нажата клавиша Enter, строку можно редактировать, затем она отсылается системе.
Команды интерпретируются и выполняются специальной программой – командной оболочкой (или «shell», по-английски). Через командную оболочку производится управление пользовательскими процессами – для этого используются средства межпроцессного обмена.
Командная оболочка непосредственно связана с терминалом, через который осуществляется передача управляющих последовательностей и текста
Командная оболочка – это обычный процесс в операционной системе UNIX. Когда пользователь вводит команду (например, по нажатию Enter), командная оболочка выполняет следующие действия:
-анализ команды: выделение имени, параметров и аргументов;
-если это встроенная команда, для неё вызывается функция-обработчик;
-если это внешняя команда:
производится поиск программы с соответвующим именем;
создаётся дочерний процесс оболочки (системный вызов fork);
в дочернем процессе запускается необходимая команда с расшифрованными параметрами и аргументами (системный вызов exec);
оболочка контролирует выполнение дочернего процесса, передаёт ему сигналы и ввод пользователя, ожидает его завершения (системный вызов wait);
-результаты работы возвращаются пользователю, отображается приглашение – он может вводить следую команду.
Каждый процесс при завершении возвращает своему родительскому процессу специальный код завершения программы. Этот код может использоваться для получения результата выполнения программы и для проверки корректности её выполнения (возврата кода ошибки).
7.Процессы. Блок управления процессом. Контекст процесса.
Для того чтобы операционная система могла выполнять операции над процессами, каждый процесс представляется в ней некоторой структурой данных. Блок управления процессом является моделью процесса для операционной системы. Эта структура содержит информацию, специфическую для данного процесса:
состояние, в котором находится процесс;
программный счетчик процесса или, другими словами, адрес следующей команды;
содержимое регистров процессора;
данные, необходимые для планирования использования процессора и управления памятью (приоритет процесса, размер и расположение адресного пространства и т. д.);
учетные данные (идентификационный номер процесса, какой пользователь инициировал его работу, общее время использования процессора данным процессом и т. д.);
сведения об устройствах ввода-вывода, связанных с процессом.
Содержимое всех регистров процессора (включая значение программного счетчика) будем называть регистровым контекстом процесса, а все остальное – системным контекстом процесса. Совокупность регистрового, системного и пользовательского контекстов процесса для краткости принято называть просто контекстом процесса.
С каждым классом устройств ввода-вывода связана область памяти, называемая вектором прерываний. Вектор прерываний содержит адрес процедуры обработки прерываний.
Многозадачность в современных операционных системах реализуется следующим образом (лекции):
некий процесс выполняется в данный момент,
происходит прерывание по таймеру,
процессор ищет соответствующий вектор прерываний, считывает адрес обработчика и начинает выполнять команды по этому адресу,
программа по адресу из вектора производит сохранение контекста в блок управления процессом,
производится вызов программы-планировщика, которая выбирает следующий готовый процесс,
производится загрузка контекста выбранного процесса,
выполняется команда завершения прерывания.
Суть многозадачности — переключение контекста процесса в момент прерывания по таймеру.
Переключение контекста — в многозадачных ОС и средах, процесс прекращения выполнения процессором одной задачи (процесса, потока, нити) с сохранением всей необходимой информации и состояния в стек (сегмент кода, флаги, счетчик команд - регистр процессора, содержащий адрес текущей выполняемой команды), необходимых для последующего продолжения с прерванного места, и восстановления и загрузки состояния задачи, к выполнению которой переходит процессор.
Прерывание— сигнал, сообщающий процессору о наступлении какого-либо события
С точки зрения программы пользователя, прерывания — это не что иное, как нарушение обычной последовательности исполнения.
Прерывание вызывает ряд событий, которые происходят как в аппаратном, так и в программном обеспечении.
- Перед тем как ответить на прерывание, процессор должен завершить исполнение текущей команды
- Процессор производит проверку наличия прерывания, обнаруживает его и посылает устройству, приславшему это прерывание, уведомляющий сигнал об успешном приеме. Этот сигнал позволяет устройству снять свой сигнал прерывания.
- Теперь процессору нужно подготовиться к передаче управления обработчику прерываний. Сначала необходимо сохранить всю важную информацию, чтобы в дальнейшем можно было вернуться к тому месту текущей программы, где она была приостановлена. Минимальная требуемая информация — это слово состояния программы и адрес очередной выполняемой команды, который находится в программном счетчике. Эти данные заносятся в системный управляющий стек.
- Далее в программный счетчик процессора загружается адрес входа программы обработки прерываний, которая отвечает за обработку данного прерывания. Если для обработки прерываний имеется несколько программ, то процессор должен определить, к какой из них следует обратиться. Эта информация может содержаться в первоначальном сигнале прерывания; в противном случае для получения необходимой информации процессор должен по очереди опросить все устройства, чтобы определить, какое из них отправило прерывание. Если для обработки прерываний имеется несколько программ, то процессор должен определить, к какой из них следует обратиться. Эта информация может содержаться в первоначальном сигнале прерывания; в противном случае для получения необходимой информации процессор должен по очереди опросить все устройства, чтобы определить, какое из них отправило прерывание.
-Обычно обработчик прерываний начинает свою работу с записи в стек содержимого всех регистров.
Обновляется и программный счетчик, указывая на начало программы обработки прерывания.
- Теперь обработчик прерываний может начать свою работу. В процесс обработки прерывания входит проверка информации состояния, имеющая отношение к операциям ввода-вывода или другим событиям, вызвавшим прерывание. Сюда может также входить пересылка устройствам ввода-вывода дополнительных инструкций или уведомляющих сообщений.
- После завершения обработки прерываний из стека извлекаются сохраненные ранее значения, которые вновь заносятся в регистры, возобновляя таким образом то состояние, в котором они пребывали до прерывания
- Последний этап — восстановление из стека слова состояния программы и содержимого программного счетчика. В результате следующей будет выполняться команда прерванной программы
Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти. Элементы таблицы векторов прерываний называются векторами прерываний(массив котором лежит инструкция которая говорит какой обработчик надо использовать). В первом слове элемента таблицы записана компонента смещения, а во втором - сегментная компонента адреса обработчика прерывания.
Интерфейс между ОС и программами пользователя определяется набором системных вызовов, предоставляемых операционной системой. Реальный механизм взаимодействия процессов с ядром -- это системные вызовы. Когда процесс запрашивает какую-либо услугу ядра (например, открытие файла, запуск нового процесса или выделение дополнительной памяти), используется механизм системных вызовов т. к.процесс сам не имеет доступа в пространство ядра. Он не может обращаться к памяти ядра и не может вызывать функции в ядре. Микропроцессор ограничивает такого рода доступ на аппаратном уровне (вот почему режим исполнения ядра называется защищенным, или привилегированным).
8.Потоки. Реализация потоков.
Более крупная единица работы, обычно носящая название процесса, или задачи, требует для своего выполнения нескольких более мелких работ, для обозначения которых используют термины «поток», или «нить».
Поток (thread) определяет последовательность исполнения кода в процессе.
Процесс ничего не исполняет, он просто служит контейнером потоков.
Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах.
Потоки возникли в операционных системах как средство распараллеливания вычислений. На создание каждого процесса ОС тратит определенные системные ресурсы, которые в данном случае неоправданно дублируются — каждому процессу выделяются собственное виртуальное адресное пространство, физическая память, закрепляются устройства ввода-вывода и т. п.
Из всего вышеизложенного, следует, что в операционной системе наряду с процессами нужен другой механизм распараллеливания вычислений, который учитывал бы тесные связи между отдельными ветвями вычислений одного и того же приложения. Для этих целей современные ОС предлагают механизм многопоточной обработки (multithreading). При этом вводится новая единица работы — поток выполнения, а понятие «процесс» в значительной степени меняет смысл. Понятию «поток» соответствует последовательный переход процессора от одной команды программы к другой. ОС распределяет процессорное время между потоками. Процессу ОС назначает адресное пространство и набор ресурсов, которые совместно используются всеми его потоками.

Любой поток состоит из двух компонентов:
объекта ядра, через который операционная система управляет потоком. Там же хранится статистическая информация о потоке(дополнительные потоки создаются также ядром);
стека потока, который содержит параметры всех функций и локальные переменные, необходимые потоку для выполнения кода.
Главное отличие процессов от потоков, состоит в том, что процессы изолированы друг от друга, так используют разные адресные пространства, а потоки, могут использовать одно и то же пространство (внутри процесса) при этом, выполняя действия не мешая друг другу. В этом и заключается удобство многопоточного программинга: разбив приложение на несколько последовательных потоков, мы можем увеличить производительность, упростить пользовательский интерфейс и добиться масштабируемости.
9.Межпроцессное взаимодействие. Сигналы.
10. Межпроцессное взаимодействие. Каналы. Каналы в UNIX.
Межпроцессное взаимодействие— набор способов обмена данными между множеством потоков в одном или более процессах.
Проблемы межпроцессного взаимодействия:
обмен информацией между процессами,
недопущение конфликтных ситуаций,
согласование действий процессов.
Сигналы в UNIX, являются одним из способов взаимодействия между процессами Фактически, сигнал — это аппарат ос, который осуществляет прерывание работы процессора на программном уровне.
Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.
Сигналы посылаются:
с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);
ядром системы:
при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
ошибочных системных вызовах;
для информирования о событиях ввода-вывода;
одним процессом другому (или самому себе), с помощью системного вызова kill(), в том числе: из шелла, утилитой /bin/kill.
Сигналы не могут быть посланы завершившемуся процессу, находящемуся в состоянии «зомби»(дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы).
Главное отличие сигналов от других средств взаимодействия между процессами заключается в том, что их обработка программой обычно происходит сразу же после поступления сигнала (или не происходит вообще), независимо от того, что программа делает в данный момент.
Сигнал прерывает нормальный порядок выполнения инструкций в программе и передает управление специальной функции – обработчику сигнала. Если обработка сигнала не приводит к завершению процесса, то по выходе из функции-обработчика выполнение процесса возобновляется с той точки, в которой оно было прервано. У программ также есть возможность приостановить обработку поступающих сигналов временно, на период выполнения какой-либо важной операции. В традиционной терминологии приостановка получения определенных сигналов называется блокированием. Если для поступившего сигнала было установлено блокирование, сигнал будет передан программе, как только она разблокирует данный тип сигналов. Этим блокирование отличается от игнорирования сигнала, при котором сигналы соответствующего типа никогда не передаются программе. Следует помнить, что не все сигналы могут быть проигнорированы. Например, при получении программой сигнала принудительного завершения SIGKILL система ничего не сообщает программе, а просто прекращает ее работу.
Таким образом, преимущество сигналов перед другими средствами взаимодействия с программой заключается в том, что посылать программе сигналы можно в любой момент ее
работы, не дожидаясь наступления каких-то особых условий. Источником сигналов может быть как сама операционная система, так и другие программы пользователя. Если вам показалось, что сигналы похожи на прерывания, то вы совершенно правы. Для реализации сигналов действительно используются программные прерывания.
Хотя сигналы и могут быть
полезны для синхронизации процессов или для обработки исключительных ситуаций или ошибок, они совершенно не подходят для передачи данных от одного процесса к
другому. Для решения этих проблем система UNIX обеспечивает конструкцию, которая называется программными каналами (pipe).
Канал — поток данных между двумя или несколькими процессами, имеющий интерфейс, аналогичный чтению или записи в файл. Каналы можно представлять в виде специализированных файлов, которые не хранят информацию, а лишь накапливают её до следующей операции чтения из канала другим процессом, образуя очередь.
Канал создаётся по запросу и существует только в ходе работы двух процессов, другие процессы в системе не могут обратиться к этому каналу. Если процесс на одной из сторон канала завершается и закрывает канал, другому процессу посылается специальный сигнал — SIGPIPE.
1.По умолчанию в UNIX каждому процессу при запуске ставится в соответствие три открытых файла: стандартного ввода, стандартного вывода и стандартного вывода для ошибок. С помощью средств командной строки такие потоки для разных процессов могут быть объединены так, что, к примеру, вывод одного процесса будет подаваться на ввод другого. То есть процесс работает с тремя потоками данных одинаково вне зависимости от того, обычные это файлы или же кананлы. В более общем смысле такие потоки называют неименованными каналами.
2. Другой вид каналов в UNIX — именованные каналы — представляют собой особый тип файлов. Сообщения считываются в том же порядке, в каком они были записаны. Каналы обращаются с данными в порядке "первый вошел - первым вышел" (first-in first-out, или сокращенно FIFO). Другими словами, данные, которые помещаются в канал первыми, первыми и считываются на другом конце канала.
Главное достоинство каналов — простота и удобство использования привычного файлового интерфейса. С другой стороны, данные в каналах передаются в одном направлении и последовательно, что ограничивает сферу применения каналов.
11. Межпроцессное взаимодействие. Разделяемая память.
Самый простой способ «обойти» разделение виртуальных пространств процессов — использование разделяемой памяти. Это специальный механизм, с помощью которого средствами операционной системы два процесса могут обращаться к общему участку физической памяти — каждый через свое адресное пространство.

Самое важное, что такое взаимодействие не требует каких-либо накладных расходов, процессы обмениваются информацией со скоростью обращения к памяти.
Программы, взаимодействующие таким образом, должны изначально содержать соответствующий код — с помощью специальных системных вызовов обе программы должны обозначить участки своих адресных пространств, предназначенные для обмена информацией. Другая сложность состоит в том, что разделяемая память сама по себе не содержит средств синхронизации, программы должны согласованно изменять общий участок памяти, чтобы не испортить данные; обычно для этих целей применяются семафоры и аналогичные механизмы синхронизации.
12.Синхронизация процессов. Природа синхронизации процессов.
В операционных системах процессы, работающие совместно, могут сообща использовать некое общее хранилище данных. Каждый процесс может считывать из общего хранилища данных и записывать туда информацию. Таким хранилищем может быть участок разделяемой памяти или файл общего доступа.
Рассмотрим простой пример: спулер печати. Если процессу требуется вывести на печать файл, он помещает имя файла в специальный каталог спулера. Другой процесс, демон печати, периодически проверяет наличие файлов, которые нужно печатать, печатает файл и удаляет его имя из каталога.
Пусть каталог спулера — это большое число сегментов, пронумерованных 0, 1, 2, ..., в каждом из которых может храниться имя файла. Также есть две совместно используемые, общедоступные переменные:
out, указывающая на следующий файл для печати,
in, указывающая на следующий свободный сегмент.
Допустим ситуацию, что два процесса A и B одновременно решают поставить файл в очередь на печать.

Процесс A считывает значение переменной in и запоминает его (значение 7). После этого происходит прерывание по таймеру и процессор переключается на процесс B. Процесс B тоже считывает значение переменной in и опять же его запоминает как «7». В данный момент оба процесса считают, что следующий свободный сегмент — седьмой.
Затем происходит прерывание по таймеру и процессор переключается обратно на процесс А и он продолжает с того места, где его перехватили, а именно с того момента, когда он собирался поместить имя нужного файла в спулер и меняет значение in на 8. На этом процесс А завершается.
Тем временем, управление передается процессу В, который сохраняет в каталоге спулера имя нужного ему файла. Так он до сих пор считает, что следующая свободная ячейка — №7, он в нее помещает нужное имя файла, затем как ни в чем не бывало поменяет значение in на 8.
Демон, в свою очередь, ничего подозрительного не заметит и распечатает файл, нужный процессу В в ячейке №7, а процесс А останется ни с чем, хотя будет считать, что его файл распечатан.
Состояние состязания — ситуация, в которой два и более процесса считывают или записывают данные одновременно и конечный результат зависит от того, какой из них был первым.
формулируем проблему исключения состязаний на абстрактном уровне. Некоторый промежуток времени процесс занят внутренними расчетами и другими задачами, не приводящими к состоянию состязания. В другие моменты времени процесс обращается к совместно используемым данным, называется критической областью. Если удастся избежать одновременного нахождения в критических областях, мы сможем избежать состязаний.

Для решения проблемы попадания в критическую область есть два способа:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |


