Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Компьютерных систем и Программных технологий
Отчет
о лабораторной работе №4
«Управление процессами и нитями. Часть 2.»
по дисциплине «Системное программное обеспечение».
Работу выполнил студент группы 4081/2
Преподаватель:
Санкт-Петербург
2010
1. Цель работы.
Изучить основные принципы управления процессами и нитями в ОС QNX.
2. Программа работы.
1. Исследовать функцию порождения процессов spawn() и ее модификации, привести примеры использования.
2. Организовать создание процесса-сына так, чтобы он не становился zombie после своего завершения, если процесс-родитель не завершился или не выдал wait().
1. Предложите программы определения и установки текущего приоритета с помощью функций POSIX getprio() и setprio().
2. Измените и определите приоритеты посредством функций QNX: sched_setparam(), sched_getparam().
3. Найдите максимальную и минимальную границы приоритета для данной ОС, применяя функции sched_get_priority_min(), sched_get_priority_max().
1. Предложите программу, генерирующую множество процессов и позволяющую из командной строки задавать их количество, приоритеты и дисциплину планирования с помощью функции sched_setscheduler.
2. Проведите ряд экспериментов, подтверждающих, что планирование производится в соответствии c заданной вами дисциплиной.
3. Измените порядок выполнения процессов, используя функцию sched_yield(). Подтвердите результат экспериментально.
3. Выполнение работы.
3.1. Порождение процессов в QNX.
3.1.1. Исследовать функцию порождения процессов spawn() и ее модификации, привести примеры использования.
В отличие от применявшейся ранее функции execl(), которая по сути лишь замещает уже созданный процесс нужным, функция spawn() создает новый процесс со своим идентификатором и всеми остальными параметрами. Таким образом, если в случае применения функции execl() мы должны сначала создать сам процесс функцией fork(), то в случае, когда мы пользуемся функцией spawn() – нам достаточно вызвать лишь ее.
Различные виды функции spawn() и ее POSIX-аналоги приведены ниже.
Таблица 3.1.1. Разновидности функции spawn() и их аналоги.
Буквы, встречающиеся в окончании функций означают следующее:
l - cписок аргументов определён внутри вызова, заканчивается NULL;
e - задается окружение для запускаемого процесса;
p - путь к исполняемому файлу задаётся через переменную окружения;
v - cписок аргументов передаётся в функцию через указатель.
Текст программы spawnl.c.
#include <stdio.h>
#include <process.h>
#include <spawn.h>
main()
{
printf("\nMain started\n");
spawnl(P_NOWAITO,"./son_spawnl.out","son",NULL);
sleep(20);
printf("\nMain ended\n");
}
Текст программы son.c.
#include <stdio.h>
main()
{
printf("\nson started, son slept\n");
sleep(1);
printf("\nson ended\n");
}
Примеры вызовов (P_WAIT):
$ ./fl_spawnl.out
Main started
son started, son slept
son ended
Main ended
(P_OVERLAY)
$ ./fl_spawnl.out
Main started
son started, son slept
son ended
(P_NOWAIT)
Main started
son started, son slept
ps
PID TTY TIME CMD
…
1355825 ? 00:00:00 fl_spawnl.out
1359922 ? 00:00:00 son
$
son ended
pidin | grep Zombie
1359922 (Zombie)
$
Main ended
(P_NOWAITO)
Main started
son started, son slept
ps
PID TTY TIME CMD
…
1462321 ? 00:00:00 fl_spawnl.out
1466418 ? 00:00:00 son
$
son ended
pidin | grep Zombie
$
Main ended
3.1.2. Организовать создание процесса-сына так, чтобы он не становился zombie после своего завершения, если процесс-родитель не завершился и не выдал wait().
Если породивший процесс не выдал wait() или waitpid(), то порожденный процесс после окончания становится так называемым «зомби»-процессом (состояние zombie или death) и не завершается до тех пор, пока породивший процесс не выдаст wait() или не завершится сам. Для того, чтобы не ждать порожденного процесса, следует, например, установить признак _SPAWN_NOZOMBIE в функциях spawn(). В этом случае порожденные процессы при завершении не становятся «зомби»-процессами.
Приведем иллюстрацию сказанного.
#include <stdio.h>
#include <process.h>
#include <spawn.h>
main()
{
printf("\nMain started\n");
spawnl(P_NOWAITO,"./son_spawnl.out","son",NULL);
sleep(20);
printf("\nMain ended\n");
}
Результаты:
$
Main started
son started, son slept
ps
PID TTY TIME CMD
…
1720369 ? 00:00:00 fl_spawnl.out
1724466 ? 00:00:00 son
$
son ended
pidin | grep Zombie
$
Main ended
При установке флага P_NOWAITO устанавливается признак _SPAWN_NOZOMBIE.
3.2. Управление приоритетами.
3.2.1. Предложите программы определения и установки текущего приоритета с помощью функций POSIX getprio() и setprio().
Int setprio (pid_t pid, int prio)
Для изменения приоритета процесса можно воспользоваться командой setprio. Для процесса с идентификатором pid устанавливается приоритет prio. Возвращаемое значение – прошлый приоритет.
Int getprio (pid_t pid)
Функция getprio позволяет узнать приоритет процесса – он будет передан в возвращаемом значении. Аргументом является идентификатор процесса, приоритет которого мы хотим узнать.
Текст программы изменения приоритета ch_prio.c.
#include <stdio.h>
main ()
{
int pr, pid;
pid = getpid();
pr=getprio(pid);
printf("Priority is %d\n", pr);
setprio(pid,9);
pr=getprio(pid);
printf("New priority is %d\n",pr);
}
Результаты испытаний.
$ cc -o ch_prio.out ch_prio.c
$ ./ch_prio.out
Priority is 10
New priority is 9
3.2.2. Измените и определите приоритеты посредством функций QNX: sched_setparam(), sched_getparam().
Текст программы:
#include <stdio.h>
#include <sched.h>
main()
{
struct sched_param param;
int pr_prio=9;
sched_getparam(getpid(), ¶m);
printf("old priority: %d\n",param.sched_priority);
param.sched_priority = pr_prio;
sched_setparam(getpid(), ¶m);
printf("new priority: %d\n",param.sched_priority);
}
Результаты:
$ ./ch_prio.out
old priority: 10
new priority: 9
3.2.3. Найдите максимальную и минимальную границы приоритета для данной
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.