Самодел 2003 (1114718), страница 16
Текст из файла (страница 16)
int party_len;
char buf[BUFLEN];
int len
int i;
/* создаем сокет */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("can't create socket\n");
return 0;
}
/* связываем сокет */
memset(&own_addr, 0, sizeof(own_addr));
own_addr.sin_family = AF_INET;
own_addr.sin_addr.s_addr = INADDR_ANY;
own_addr.sin_port = htons(PORTNUM);
if (bind(sockfd, (struct sockaddr *) &own_addr,
sizeof(own_addr)) < 0){
printf("can't bind socket!");
return 0;
}
/* начинаем обработку запросов на соединение */
if (listen(sockfd, BACKLOG) < 0) {
printf("can't listen socket!");
return 0;
}
while (1) {
memset(&party_addr, 0, sizeof(party_addr));
party_len = sizeof(party_addr);
/* создаем соединение */
if ((newsockfd = accept(sockfd, (struct sockaddr *)&party_addr,
&party_len)) < 0) {
printf("error accepting connection!");
return 0;
}
if (!fork()) {
/*это – сын, он обрабатывает запрос и посылает ответ*/
close(sockfd);
/* этот сокет сыну не нужен */
if ((len = recv(newsockfd,&buf,BUFLEN, 0)) < 0) {
printf("error reading socket!");
return 0;
}
/* разбираем текст запроса */
printf("received: %s \n", buf);
if (strncmp(buf, "GET /", 5)) {
/*плохой запрос!*/
if (send(newsockfd, BRSTR,
strlen(BRSTR)+ 1, 0) != strlen(BRSTR) + 1){
printf("error writing socket!");
return 0;
}
shutdown(newsockfd, 1);
close(newsockfd);
return 0;
}
for (i=5; buf[i] && (buf[i] > ' '); i++);
buf[i] = 0;
/* открываем файл */
if ((filefd = open(buf+5, O_RDONLY)) < 0) {
/* нет файла! */
if (send(newsockfd, FNFSTR,
strlen(FNFSTR) + 1, 0) != strlen(FNFSTR) + 1) {
printf("error writing socket!");
return 0;
}
shutdown(newsockfd, 1);
close(newsockfd);
return 0;
}
/* читаем из файла порции данных и посылаем их клиенту */
while (len = read(filefd, &buf, BUFLEN))
if (send(newsockfd, buf, len, 0) < 0) {
printf("error writing socket!");
return 0;
}
close(filefd);
shutdown(newsockfd, 1);
close(newsockfd);
return 0;
}
/* процесс – отец. Он закрывает новый сокет и продолжает прослушивать старый */
close(newsockfd);
}
// while (1)
}
Лекция 11. Планирование
Основные задачи планирования
планирование включает в себя следующие тапы:
-
Планирование очереди процессов на начало обработки (проблема – принципы организации этой очереди)
-
Планирование распределения времени ЦП между процессами (оптимальная загрузка процесса + обеспечение использования ресурсов каждым процессом, приоритеты. По идее, сюда же можно внести обработку прерываний)
-
Планирование свопинга
-
Планирование обработки прерываний
-
Планирование очереди запросов на обмен
-
определение уровнЯ многопроцессности
-
Дисциплина обслуживания очереди :
-
-
простейшая – FIFO
-
по приоритету
-
с учетом предполагаемого времени выполнения процесса, объема операций ввода/вывода и так далее.
Основной проблемой планирования все же является планирование распределения времени ЦП между процессами . Раасмотрим основные особенности.
Квант времени – непрерывный период процессорного времени.
Приоритет процесса – числовое значение, показывающее степень привилегированности процесса при использовании ресурсов ВС (в частности, времени ЦП).
Для грамотного планирования надо решить две задачи:
– определить величину кванта
– определить стратегию обслуживания очереди готовых к выполнению процессов
Если величина кванта не ограничена – невытесняющая стратегия планирования времени ЦП (применяется в пакетных системах). Никто принудительно не скидывает процесс с ЦП. Разработчики берут на себя функции диспетчера.
Вытесняющая стратегия - величина кванта ограничена.
Рассмотрим, как решается проблема с определения кванта времени.
Кванты постоянной длины.
•Время ожидания кванта процессом ~ q(n-1)
•Параметры: длина очереди и величина кванта.
•Дисциплина обслуживания очереди, например, FIFO.
•Переключение процессов – операция, требующая времени.
Проблема: как определить длину кванта. Слишком маленький – не хватит времени на переключение, большой - некоторые успеют выполниться полностью.
Кванты переменной длины
Величина кванта может меняться со временем
• Вначале «большой» квант q=A,на следующем шаге q=A-t, q=A-2t,…, до q=B (B<A). Преимущество для коротких задач.
• Вначале q=B, далее q=B+t,…, до q=A. Уменьшение накладных расходов на переключение задач, когда несколько задач выполняют длительные вычисления.
Если процесс интенсивно пользуется операциями ввода/вывода, то он может использовать выделенный квант не до конца.
Алгоритмы, основанные на приоритетах
Вычисление приоритета основывается на статических и динамических характеристиках. Изменение приоритета может происходить по инициативе процесса, пользователя, ОС. Правила назначения приоритета процессов определяют эффективность работы системы.
Планирование по наивысшему приоритету (highest priority first - HPF).
При появлении в очереди готовых процессов процесса с более высоким приоритетом, чем у текущего наступает момент смены процесса.
Возможно два варианта:
- относительный приоритет (ожидание исчерпания кванта у текущего процесса)
- абсолютный приоритет (немедленная смена текущего процесса)
Пример использования стратегии HPF.
Выбор самого короткого задания (shortest job first - SJF).
Время выполнения – характеристика, на которой основан приоритет. Приоритет обратно пропорционален ожидаемому времени обработки.
Этот вариант
удобен для “коротких” процессов.
1) Класс подходов, использующих линейно возрастающий приоритет.
Процесс при входе в систему получает некий приоритет, который возрастает с коэффициентом A во время ожидания в очереди готовых процессов, и с коэффициентом B во время выполнения.
Из выбора A и В - разные правила планирования:
- Если 0<A<=B обслуживание очереди по дисциплине FIFO
- Если 0>B>=A обслуживание очереди по дисциплине LIFO
Нелинейные функции изменения приоритета
Например, приоритет убывает по линейному закону с течением времени. Когда достигается некое максимальное время, приоритет скачком возрастает до некоторой большой величины. Это благоприятствует коротким процессам, и при этом соблюдается условие, что ни одному процессу не придется ждать обслуживания слишком долго.
Разновидности круговорота.
Простой круговорот (RR – round robin) не использует никакой статистической или динамической информации о приоритетах. (см. рисунок выше)
При круговороте со смещением каждому процессу соответствует своя длина кванта, пропорциональная его приоритету.
«Эгоистический» круговорот. Если параметры A и B : 0<=B<A.
Процесс, войдя в систему ждет пока его приоритет не достигнет приоритета работающих процессов, а далее выполняется в круговороте.
Приоритет выполняемых процессов увеличивается с коэффициентом B<A, следовательно, ожидающие процессы их догонят.
При B=0 «эгоистический» круговорот практически сводится к простому.
Очереди с обратной связью (feedback – FB).
Используется N очередей. Новый процесс ставится в первую очередь, после получения кванта он переносится во вторую и так далее. Процессор обслуживает непустую очередь с наименьшим номером.
В FB поступивший процесс неявно получает наивысший приоритет и выполняется подряд в течении нескольких квантов до прихода следующего, но не более чем успел проработать предыдущий.
«-» Работа с несколькими очередями – издержки.
«+» Удобны для коротких заданий: не требуется предварительная информация о времени выполнения процессов.
Смешанные алгоритмы планирования
На практике концепции квантования и приоритетов часто используются совместно.
К примеру, в основе – концепция квантования, а определение кванта и/или дисциплина обслуживания очередей базируется на приоритетах.
Планирование в системах реального времени
Системы реального времени являются специализированными системами в которых все функции планирования ориентированы на обработку некоторых событий за время, не превосходящее некоторого предельного значение.
Системы реального времени бывают “Жесткие” и ”мягкие ”.
В первом случае время завершения выполнения каждого из процессов должно быть гарантировано для всех сценариев функционирования системы.
Это может быть обеспечено за счет :
- полного тестирования всевозможных сценариев
- построения статического расписания
- выбора математически просчитанного алгоритма динамического планирования
Периодические запросы – все моменты запроса периодического процесса можно определить заранее.
Пусть {Ti} набор периодических процессов с периодами – pi , предельными сроками выполнения di и требованиями ко времени выполнения ci.
Для проверки возможного составления расписания анализируется расписание на отрезке времени равному наименьшему общему множителю периодов этих процессов.
Необходимое условие наличия расписания:
Сумма коэффициентов использования = ci / pi <= k, где k - количество доступных процессоров.
2)Алгоритмы с динамическим изменением приоритетов.
Параметр deadline – конечный срок выполнения.
Выбор процесса на выполнение по правилу:
выбирается процесс, у которого текущее значение разницы между конечным сроком выполнения и временем, необходимым для его непрерывного выполнения, является наименьшим.
Таким образом, можно сфтрмулировать общие критерии для сравнения алгоритмов планирования
-
использование времени ЦП
-
пропускная способность (кол-во процессов в единицу времени)
-
время ожидания (в очереди готовых)
-
время оборота (полное время от момента поступления до завершения)
-
время отклика (для интерактивных программ – время от поступления в систему до момента первого обращения к терминалу
-
предельный срок выполнения процесса
-
и т.д.
Планирование в ОС UNIX
Используется принцип кругового планирования в рамках очередей каждого приоритета.
Если процесс не завершается или не блокируется в рамках 1 секунды – он вытесняется.
В общем случае значение приоритета есть функция
P=F (CPU, nice), т.е. в вычислении приоритета используются две изменяемые составляющие – CPU (системная) и nice (пользовательская). Учитывается история выполнения, величины CPU и nice ограничены.
Пересчет приоритета процесса происходит в момент выбора процесса для выполнения на ЦП 1 раз в секунду.
Процессам назначается базовый приоритет, чтобы их можно было разделять на фиксированные группы уровней приоритетов.
Эти группы используются для оптимизации доступа к блочным устройствам (например, к диску) и обеспечения быстрого отклика операционной системы на системные вызовы.
Группы приоритетов
(в порядке убывания)
- программа свопинга
- управление байт-ориентированными устройствами ввода/вывода
- пользовательские процессы
Иерархия обеспечивает эффективное использование устройств ввода/вывода
СPUj (i) - время использования ЦП процессом j за время i;
Pj (i) - приоритет процесса j в начале кванта i (приоритет выше, если значение меньше);