Управление процессами и нитями. Основные принципы управления процессами и нитями в ОС QNX

Страницы работы

Фрагмент текста работы

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных систем и Программных технологий

Отчет

о лабораторной работе №4

«Управление процессами и нитями. Часть 2.»

по дисциплине «Системное программное обеспечение».

Работу выполнил студент группы 4081/2

Преподаватель:

Санкт-Петербург

2010


1. Цель работы.

Изучить основные принципы управления процессами и нитями в ОС QNX.

2. Программа работы. 

  1. Порождение процессов в QNX

1. Исследовать функцию порождения процессов spawn() и ее модификации,  привести примеры использования.

2. Организовать создание процесса-сына так, чтобы он не становился zombie после своего завершения, если процесс-родитель не завершился или не выдал wait().

  1. Управление приоритетами.

1. Предложите программы определения и установки текущего приоритета с помощью функций POSIX getprio() и setprio().

2. Измените и определите приоритеты посредством функций QNX: sched_setparam(), sched_getparam().

3. Найдите максимальную и минимальную границы приоритета для данной ОС, применяя функции sched_get_priority_min(), sched_get_priority_max().

  1. Планирование и диспетчеризация

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

2. Проведите ряд экспериментов, подтверждающих, что планирование производится в соответствии c заданной вами дисциплиной.

3. Измените порядок выполнения процессов, используя функцию sched_yield(). Подтвердите результат экспериментально.

  1. Управление нитями

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(), &param);

printf("old priority: %d\n",param.sched_priority);

param.sched_priority = pr_prio;

sched_setparam(getpid(), &param);

printf("new priority: %d\n",param.sched_priority);

}

Результаты:

$ ./ch_prio.out

old priority: 10

new priority: 9

3.2.3. Найдите максимальную и минимальную границы приоритета для данной

Похожие материалы

Информация о работе