Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osi.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
316.33 Кб
Скачать
  1. Нити. Семафоры. Потоки. Жизненный цикл потока. Операции над потоками.

Семафор - механизм реализации взаимоисключения процессов. Пример работы двух параллельных асинхронных процессов: Даны 2 процесса: "производитель" и "потребитель". "Производитель" вырабатывает какое-либо число и записывает его в ячейку памяти. "потребитель" считывает число, производит какие-либо вычисления и результат выводит на печать. Идеально, когда оба процесса работают с одинаковой скоростью. В том случае, если скорость "потребителя" больше, чем скорость "производителя", мы наблюдаем: "потребитель" считывает из памяти одно и тоже число несколько раз, следовательно, на распечатке будет дублирование какого-либо результата. Если скорость "потребителя" меньше скорости "производителя", наблюдаем: "производитель" записывает число в память, но предыдущее число не было считано потребителем, => на распечатке некоторые результаты будут отсутствовать. Чтобы этого не допустить в ОС работают семафоры как для "производителя", так и для "потребителя". Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам.

Вот некоторые из проблем, которые могут решать семафоры.

запрет одновременного выполнения заданных участков кода;

поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен одновременный доступ).

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

Потоки

– средство, которое помогает организовать одновременное выполнение несколь-

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

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

(или относительно автономно) от главного потока выполнения программы.

Жизненный цикл потока

При выполнении программы объект класса Thread может быть в одном из

четырех основных состояний: “новый”, “работоспособный”, “неработоспособ-

ный” и “пассивный”. При создании потока он получает состояние “новый” (NEW)

и не выполняется. Для перевода потока из состояния “новый” в состояние “рабо-

тоспособный” (RUNNABLE) следует выполнить метод start(), который вызы-

вает метод run() – основной метод потока.

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

● Создание потока

– запуск потоковой функции;

– передача аргументов в потоковую функцию.

● Завершение работы потока

– при завершении потоковой функции;

– по инициативе завершаемого потока;

– по инициативе другого потока.

● Получение возвращенного потоком значения

  1. Перенаправление команд. Понятие конвейера.

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

команда1 | команда2

Выполняет команду1 используя её поток вывода как поток ввода при выполнении команды2, что равносильно использованию двух перенаправлений и временного файла:

команда1 > ВременныйФайл

команда2 < ВременныйФайл

rm ВременныйФайл

Хороший пример командных конвейеров — это объединение echo с другой командой для получения интерактивности в неинтерактивных средах, к примеру:

echo -e "ИмяПользователя\nПароль" | ftp localhost

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

Перенаправление обычно осуществляется вставкой специального символа > между командами. Обычно синтаксис выглядит так:

команда1 > файл1

выполняет команду1, помещая стандартный вывод в файл1.

команда1 < файл1

выполняет команду1, используя в качестве источника ввода файл1 (вместо клавиатуры).

команда1 < файл1 > файл2

совмещает два предыдущих варианта. Выполняет команду1 вводя из файла1 и выводя в файл2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]