Неименованные программные каналы
Неименованный программный канал в Unix является однонаправленным синхронным средством связи, используемым двумя родственными процессами для обмена данными и синхронизации друг друга.
Если при организации взаимодействия между процессами с помощью программного канала данные должны пересылаться в обоих направлениях, то необходимо организовать два канала.
При организации взаимодействия процессов через программный канал один процесс записывает данные с одного конца канала, а другой процесс считывает данные с другого конца этого канала.
Программные каналы аналогичны файлам, хотя и несколько отличаются от них - попытка записи в «полный» канал приводит к приостановке процесса записи до тех пор, пока канал снова не окажется в состоянии принимать данные, т.е. пока данные не будут прочитаны с другого конца канала. Аналогичная ситуация возникает при попытке чтения из «пустого» канала.
Такие приостановки процессов являются главным средством синхронизации в параллельных программах на языке Си.
Свойства программных каналов:
· до создания нового процесса каналы должны быть установлены в порождающем процессе;
· должны быть назначены дескрипторы каналов, указывающие концы канала для чтения и записи (аналогично дескрипторам файлов).
· порожденный процесс «наследует» каналы, файлы и данные от порождающего его процесса.
· дескрипторы файлов и каналов в порожденном процессе являются копиями дескрипторов файлов и каналов порождающего процесса.
Рассмотрим процесс создания программного канала между родственными процессами подробнее.
Для организации программного канала необходимо выполнить следующие действия:
1) Установить программный канал системным вызовом pipe(p) ДО создания нового процесса:
int p;
pipe(p);
В результате выполнения системного вызова pipe() в p[0] содержится дескриптор №3 (это дескриптор для чтения из программного канала). Для удобства будем его обозначать p[R]. В p[1] содержится дескриптор №4 (это дескриптор для записи в программный канал). Для удобства будем его обозначать p[W].
Замечание. Для того чтобы можно было воспользоваться обозначениями p[R] и p[W], в программе необходимо использовать следующие определения:
#define R 0
#define W 1
После выполнения системного вызова pipe() программный канал установлен и определены дескрипторы №3 и №4 (первые свободные дескрипторы)
2). После установки программного канала системным вызовом fork() создается параллельный процесс. При этом происходит дублирование сегмента данных и вновь созданному (порожденному) процессу передается информация о созданном программном канале и соответствующих ему дескрипторах.
Пересылка файлов через программный канал между родственными процессами.
В приводимой ниже программе показана установка программного канала (системный вызов pipe()), создание параллельного процесса (системный вызов fork()), закрытие лишних дескрипторов и пересылка файла (его имя запрашивает порожденный процесс) от потомка к предку.
#include <stdio.h>
int main(void) /* pipe1.c */
/* Пересылка файла между родственными */
/* процессами через программный канал */
{
int fd[2], N, F, L, status;
char A[20], IN[512], OUT[512];
int f;
pipe(fd); /* установка программного канала */
/* до создания параллельного процесса */
printf("PIPE READY:"):
printf("fd[0]= %d fd[1]= %d \n", fd[0], fd[1]);
/*создание параллельного процесса*/
switch(fork())
{
case -1: /* Ошибка при порождении процесса */
puts("Ошибка ... fork()\n");
exit(0);
case 0: /* Это потомок . . . */
close(fd[0]); /* Потомок не будет читать */
/* из программного канала */
printf("Введите имя файла:");
scanf("%s", A);
f = open(A, 0); /* Открытие файла в режиме чтения (0) */
while(( N = read(f, IN, 512)) != 0)
write(fd[1], IN, N); /* Запись в канал */
exit(2);
default: /* Коды предка */
close(fd[1]); /* Предок писать в канал не будет */
while(( L = read(fd[0], OUT, 512)) == 512)
printf("%s", OUT);
printf("%s\n", OUT);
wait(&status);
}
}
25. Уровни планирования.
Уровни планирования
Существует два вида планирования в вычислительных системах:
· планирование заданий;
· планирование использования процессора.
Планирование заданий появилось в системах пакетной обработки после того, как для хранения сформированных пакетов заданий начали использоваться магнитные диски. Магнитные диски, будучи устройствами прямого доступа, позволяют загружать задания в компьютер в произвольном порядке, а не только в том, в котором они были записаны на диск. Изменяя порядок загрузки заданий в вычислительную систему, можно повысить эффективность ее использования. Процедуру выбора очередного задания для загрузки в машину, т.е. для порождения соответствующего процесса, называют планированием заданий.
Планирование использования процессора впервые возникает в мультипрограммных вычислительных системах, где в состоянии готовность могут одновременно находиться несколько процессов. Именно для процедуры выбора из них одного процесса, который получит процессор в свое распоряжение, т.е. будет переведен в состояние исполнение, используется это словосочетание.
26. Критерии планирования и требования к алгоритмам планирования.
Критерии планирования и требования к алгоритмам
Для каждого уровня планирования процессов можно предложить много различных алгоритмов. Выбор конкретного алгоритма определяется классом задач, решаемых вычислительной системой, и целями, которых мы хотим достичь, используя планирование. К числу таких целей можно отнести:
§ Справедливость: гарантировать каждому заданию или процессу определенную часть времени использования процессора в компьютерной системе, стараясь не допустить возникновения ситуации, когда процесс одного пользователя постоянно занимает процессор, в то время как процесс другого пользователя фактически не приступал к выполнению.
§ Эффективность: постараться занять процессор на все 100% рабочего времени, не позволяя ему простаивать в ожидании процессов готовых к исполнению. В реальных вычислительных системах загрузка процессора колеблется от 40 до 90 процентов.
§ Сокращение полного времени выполнения (turnaround time): обеспечить минимальное время между стартом процесса или постановкой задания в очередь для загрузки и его завершением.
§ Сокращение времени ожидания (waiting time): минимизировать время, которое проводят процессы в состоянии готовность и задания в очереди для загрузки.
§ Сокращение времени отклика (response time): минимизировать время, которое требуется процессу в интерактивных системах для ответа на запрос пользователя.
Независимо от поставленных целей планирования желательно также, чтобы алгоритмы обладали следующими свойствами:
§ Были предсказуемыми. Одно и то же задание должно выполняться приблизительно за одно и то же время. Применение алгоритма планирования не должно приводить, к примеру, к извлечению корня квадратного из 4 за сотые доли секунды при одном запуске и за несколько суток при втором запуске.
§ Имели минимальные накладные расходы, связанные с их работой. Если на каждые 100 миллисекунд, выделенных процессу для использования процессора, будет приходиться 200 миллисекунд на определение того, какой именно процесс получит процессор в свое распоряжение, и на переключение контекста, то такой алгоритм, очевидно, использовать не стоит.
§ Равномерно загружали ресурсы вычислительной системы, отдавая предпочтение тем процессам, которые будут занимать малоиспользуемые ресурсы.
§ Обладали масштабируемостью, т.е. не сразу теряли работоспособность при увеличении нагрузки. Например, рост количества процессов в системе в два раза не должен приводить к увеличению полного времени выполнения процессов на порядок.
27. Параметры планирования.
К статическим параметрам процессов относятся характеристики, как правило, присущие заданиям уже на этапе загрузки:
§ Каким пользователем запущен процесс или сформировано задание.
§ Насколько важной является поставленная задача, т. е. каков приоритет ее выполнения.
§ Сколько процессорного времени запрошено пользователем для решения задачи.
§ Каково соотношение процессорного времени и времени, необходимого для осуществления операций ввода-вывода.
§ Какие ресурсы вычислительной системы (оперативная память, устройства ввода-вывода, специальные библиотеки и системные программы и т. д.) и в каком количестве необходимы заданию.
Для среднесрочного планирования в качестве таких характеристик может выступать следующая информация:
§ Сколько времени прошло со времени выгрузки процесса на диск или его загрузки в оперативную память.
§ Сколько оперативной памяти занимает процесс.
§ Сколько процессорного времени было уже предоставлено процессу.
28. Вытесняющее и невытесняющее планирование.
. Вытесняющее и невытесняющее планирование
Процесс планирования осуществляется частью операционной системы, называемой планировщиком. Планировщик может принимать решения о выборе для исполнения нового процесса, из числа находящихся в состоянии готовность, в следующих четырех случаях:
1. Когда процесс переводится из состояния исполнение в состояние завершение.
2. Когда процесс переводится из состояния исполнение в состояние ожидание.
3. Когда процесс переводится из состояния исполнение в состояние готовность (например, после прерывания от таймера).
4. Когда процесс переводится из состояния ожидание в состояние готовность (завершилась операция ввода-вывода или произошло другое событие). Подробно процедура такого перевода была рассмотрена нами в разделе «Введение в управление процессами» (параграф 6.3.5 «Переключение контекста»), где мы показали, почему при этом возникает возможность смены процесса, находящегося в состоянии исполнение.
Если планирование осуществляется только в случаях 1 и 2, говорят, что имеет место невытесняющее (nonpreemptive) планирование. В противном случае говорят о вытесняющем (preemptive) планировании. Термин “вытесняющее планирование” возник потому, что исполняющийся процесс помимо своей воли может быть вытеснен из состояния исполнение другим процессом.
29. Алгоритмы планирования First-Come, First-Served (FCFS) и Round Robin (RR).