Практические работы / Практическая работа 3
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»
Центр заочного обучения по программам бакалавриата
Кафедра «Математической кибернетики и информационных технологий»
Отчет
Практическая работа № 3
«Детальное изучение процессов. Наблюдение за многозадачным вычислительным процессом»
по дисциплине: «Операционные системы»
Выполнила: Иванова Иоанна, студентка группы БСТ17хх
Цель работы.
Получение информации о запущенных процессах
Получение информации об используемых процессами ресурсах
Представление результатов в различном виде
Исследование влияния многозадачного режима и приоритета процесса на время его выполнения
Задания на лабораторную работу.
Исследовать мультипрограммный вычислительный процесс на примере выполнения самостоятельно разработанных трех задач
Для одной из задач определить:
Номер процесса (PID) и имя пользователя, его запустившего (USER);
текущий приоритет процесса (PR) и приоритет, присвоенный ему командой NICE (NI);
VIRT — объем виртуальной памяти, которую использует процесс;
RES — объем физической памяти, занятой данным процессом;
SHR — общий объем разделяемой памяти;
S — текущий статус процесса: R — running; S — sleeping, Z — zombie;
%CPU — процент используемого времени центрального процессора;
%MEM — процент ОЗУ, используемой процессом;
TIME+ — продолжительность работы процесса с момента запуска
COMMAND — название команды (программы), которая инициировала процесс. количество потоков.
Для всех зарегистрированных в данный момент в системе процессов выведите в один файл строки:
ProcessID=PID : Parent_ProcessID=PPID : Average_Time=avg_atom.
Значения PPid и Pid возьмите из файлов status, значение avg_atom из файлов sched, которые находятся в директориях с названиями, соответствующими PID процессов в /proc. Отсортируйте эти строки по идентификаторам родительских процессов.
Монопольно выполнить каждую из трех задач, определить время их выполнения
Запустить одновременно (друг за другом) три задачи, определить время выполнения пакета.
Изменить приоритет процесса и установить, влияет ли значение приоритета на время выполнения приложения.
Ответить на контрольные вопросы.
Ход работы.
1) Подготовим три скрипта, которые будут выполнять одно и то же действие – обратный отсчет от 250000 до 0.
Первый скрипт (1.sh):
#!/bin/bash
echo -e "Запусукаю первый скрипт:"
var1=250000
while [ $var1 -gt -1 ]
do
echo "Первый скрипт:$var1"
var1=$[ $var1 - 1 ]
done
Второй скрипт (2.sh):
#!/bin/bash
echo -e "Запусукаю второй скрипт:"
var2=250000
while [ $var2 -gt -1 ]
do
echo "Второй скрипт $var2"
var2=$[ $var2 - 1 ]
done
Третий скрипт (3.sh):
#!/bin/bash
echo -e "Запусукаю третий скрипт:"
var3=250000
while [ $var3 -gt -1 ]
do
echo "Третий скрипт $var3"
var3=$[ $var3 - 1 ]
done
2) Запускаем любой из скриптов, для примера был выбран 3.sh. Запустим программу top, используемую для наблюдения за процессами в режиме реального времени (Рис. 1).
Рисунок 1. Работа программы top.
Номер процесса (PID) и имя пользователя, его запустившего (USER);
PID = 19179, USER = pavel;
текущий приоритет процесса (PR) и приоритет, присвоенный ему командой NICE (NI);
PR = 20, NI = 0;
VIRT — объем виртуальной памяти, которую использует процесс;
VIRT = 9608;
RES — объем физической памяти, занятой данным процессом;
RES = 3712;
SHR — общий объем разделяемой памяти;
SHR = 3268;
S — текущий статус процесса: R — running; S — sleeping, Z — zombie;
S – Sleeping;
%CPU — процент используемого времени центрального процессора;
%CPU = 0,3;
%MEM — процент ОЗУ, используемой процессом;
%MEM = 0,0;
TIME+ — продолжительность работы процесса с момента запуска
TIME+ = 0:00.43;
COMMAND — название команды (программы), которая инициировала процесс. количество потоков.
COMMAND = 3.sh.
3) Для выполнения данной задачи подготовим скрипт:
#!/bin/bash
status=""
#ps –A (Все процессы), -о pid (Указываем набор столбцов в ответе, т.е столбец pid)
#tail -n +2 (Выводим содержимое начиная со второй строки)
for pid in $(ps -A -o pid | tail -n +2)
do
file="/proc/"$pid"/status"
file1="/proc/"$pid"/sched"
#-E (Расширенное регулярное выражение), -h (Подавляет вывод имен файлов)
#-s (Подавляет сообщения о несуществующих файлах), -i (Игнорирует регистр символов)
ppid=$(grep -E -h -s -i "ppid:\s(.+)" $file | grep -o "[0-9]\+")
avg_atom=$(grep -E -h -s -i "avg_atom(.+)" $file1 | grep -o "[0-9.]\+")
# -z (Пустая строка)
if [[ -z $avg_atom ]]
then avg_atom=0
fi
if [[ $ppid != "" ]]
then status=$status"ProcessID="$pid" : Parent_ProcessID="$ppid" : Average_Time="$avg_atom$'\n'
fi
done
# sort -t " " -k2 (Отсортировать текст по идентификаторам родительского процесса)
# > /tmp/lr3ans3(Вывести/перезаписать результат в указанный файл)
echo "$status" | sort -t " " -k2 > /tmp/lr3ans3
Зарегистрированные в системе процессы отображены и отсортированы по идентификаторам родительских процессов.
Часть результата работы данного скрипта представлена на рисунке 2.
Рисунок 2. Зарегистрированные процессы на момент выполнения скрипта.
4) Монопольно запускаем каждый из созданных ранее скриптов, и определяем время их работы (Рис. 3).
Рисунок 3. Время работы 1.sh, 2.sh, 3.sh (сверху-вниз).
В результате выполнения получаем следующие результаты:
1.sh |
2.sh |
3.sh |
real 3.154 |
real 3.064 |
real 3.038 |
user 2.791 |
user 2.669 |
user 2.680 |
sys 0.352 |
sys 0.383 |
sys 0.345 |
real — реальное (общее) время выполнения;
user — время CPU, которое занял пользователь;
sys — время CPU, занятое системой.
5) Напишем небольшой скрипт, для одновременного запуска 1.sh, 2.sh, 3.sh.
#!/bin/bash
echo -e "Запускаю три скрипта одновременно"
#nice -20 ~/Рабочий\ стол/./1.sh ;nice -20 ~/Рабочий\ стол/./2.sh ;~/Рабочий\ стол/./3.sh
/usr/bin/time -o 111 -p ~/Рабочий\ стол/./1.sh &
/usr/bin/time -o 222 -p ~/Рабочий\ стол/./2.sh &
/usr/bin/time -o 333 -p ~/Рабочий\ стол/./3.sh
echo -e "Завершено"
exit
Для более точного определения времени, запускаем каждый скрипт работать в фон, не дожидаясь выполнения предыдущего, используя добавление & к команде. Также, для команды time будем использовать ключ –o, указав файл, в который будет записываться информация.
В результате выполнения получаем следующие результаты:
1.sh |
2.sh |
3.sh |
real 6.73 |
real 7.33 |
real 7.44 |
user 4.08 |
user 3.98 |
user 4.09 |
sys 2.12 |
sys 2.22 |
sys 2.18 |
По получившимся результатам можно сделать вывод, что при параллельном запуске время выполнения каждого скрипта увеличилось, примерно в два раза.
6) Изменим приоритет выполнения для скрипта 2.sh. Для этого исправим код, используемый в предыдущем пункте, добавив в него команду nice, и укажем значение:
#!/bin/bash
echo -e "Запускаю три скрипта одновременно"
#nice -20 ~/Рабочий\ стол/./1.sh ;nice -20 ~/Рабочий\ стол/./2.sh ;~/Рабочий\ стол/./3.sh
/usr/bin/time -o 111 -p ~/Рабочий\ стол/./1.sh &
/usr/bin/time -o 222 -p nice -n 20 ~/Рабочий\ стол/./2.sh &
/usr/bin/time -o 333 -p ~/Рабочий\ стол/./3.sh
echo -e "Завершено"
exit
Рисунок 4. Результат изменения приоритета для 2.sh.
После выполнения, получаем следующие результаты:
1.sh |
2.sh |
3.sh |
real 6.93 |
real 8.88 |
real 6.93 |
user 3.87 |
user 3.80 |
user 3.92 |
sys 0.69 |
sys 0.54 |
sys 0.61 |
Можно сделать вывод, что, изменив приоритет, мы увеличили время выполнения скрипта 2.sh, но, тем самым, уменьшили время выполнения 3.sh.
Контрольные вопросы.
В каком случае суммарное время выполнения задач больше: при последовательном или одновременном выполнении?
Исходя из результатов ранее выполненного задания, с параллельным выполнением трех скриптов, мы получили итоговый результат, равный 7.44 сек. Для проверки суммарного времени работы скриптов при последовательном выполнении, напишем скрипт (123.sh):
#!/bin/bash
echo -e "Запускаю три скрипта друг за другом"
~/Рабочий\ стол/./1.sh ; ~/Рабочий\ стол/./2.sh ; ~/Рабочий\ стол/./3.sh
echo -e "Завершено"
exit
Определим время выполнения (Рис. 5,6).
Рисунок 5. Запуск проверки времени выполнения 123.sh.
Рисунок 6. Результат выполнения.
В результате получаем, что суммарное время при последовательном выполнении составляет 10,211 сек., что значительно больше, чем при параллельном выполнении.
Как изменилось время выполнения каждой отдельной задачи при пакетном запуске приложений.
Исходя из ранее полученных результатов, можно сделать вывод, что время выполнения каждой задачи, при пакетном запуске, увеличилось примерно вдвое.
Как изменится время выполнения отдельной задачи при изменении ее приоритета? Окажет ли влияние изменение приоритета одной задачи на время выполнения другой задачи? Объяснить результаты.
Согласно 6 пункту, данной практической работы, изменив приоритет выполнения отдельной задачи, мы увеличили время ее выполнения, при этом время выполнения другой задачи уменьшилось.
Москва, 2020