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

sched2.c

#include <stdlib.h>

#include <stdio.h>

#include <sched.h>

#include <sys/types.h>

#include <process.h>

#include <string.h>

#include <errno.h>

#include <sys/mman.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/stat.h>

#define MAX_NUM_OF_PROCESSES 10

int main( int argc, char *argv[])

{

int i, policy, num_of_processes;

int pid [MAX_NUM_OF_PROCESSES];

int priority[MAX_NUM_OF_PROCESSES];

struct sched_param param;

if(argc<4)

{

fprintf(stderr, " Need %s num_of_processes policy priority_of_processes\n", argv[0]);

return EXIT_FAILURE; 

}

if(atoi(argv[1]) > MAX_NUM_OF_PROCESSES)

{

fprintf(stderr, " number of processes must be lower than %d\n", MAX_NUM_OF_PROCESSES );

return EXIT_FAILURE; 

}

param.sched_priority = 63;

sched_setparam(0, &param);

policy = atoi(argv[2]);

for(i=0; i<argc-3; i++)

{

priority[i] = atoi(argv[i+3]);

}

num_of_processes = i;

for(i = num_of_processes; i <=atoi(argv[1]); i++)

{

priority[i] = atoi(argv[num_of_processes+2]);

}

num_of_processes = atoi(argv[1]);

system("ps -l");

sleep(2);

for( i =0; i < num_of_processes; i++)

{

pid[i] = spawnl( P_NOWAIT, "./prog", "prog", NULL );

param.sched_priority = priority[i];

sched_setparam(pid[i], &param);

sched_setscheduler(pid[i], policy, &param);

}

sleep(20);

system("ps -l");

for (i =0; i < num_of_processes; i++)

{

kill(pid[i], SIGKILL);

}    

return EXIT_SUCCESS;

}    

prog2.c

#include <stdlib.h>

#include <stdio.h>

int main( int argc, char *argv[])

{

while(1){};

return EXIT_SUCCESS;

}          

Анализ правильной работы дисциплины планирования осуществлялся по общему времени  работы каждого процесса.

Примеры работы:

./sched2 3 1 45 50 45

F S  UID    PID   PPID    C PRI NI ADDR    SZ WCHAN TTY     TIME CMD

00000000 -   0   725028  561180  -  63  0    -  600K -     ?   00:00:00 ./sched

00000000 -   0   741413  725028  -  45  0    -  536K -     ?   00:00:00 prog

00000000 -   0   741414  725028  -  50  0    -  600K -     ?   00:00:20 prog

00000000 -   0   741415  725028  -  45  0    -  600K -     ?   00:00:00 prog

Дисциплина планирования FIFO, 1 процесс (наивысший приоритет) занял все отведенное время процессора.

./sched2 3 1 45 30 45

F S  UID    PID   PPID    C PRI NI ADDR    SZ WCHAN TTY     TIME CMD

00000000 -   0   815247  561190  -  63  0    -  600K -     ?   00:00:00 ./sched

00000000 -   0   831531  815247  -  45  0    -  536K -     ?   00:00:20 prog

00000000 -   0   831532  815247  -  30  0    -  600K -     ?   00:00:00 prog

00000000 -   0   831533  815247  -  45  0    -  600K -     ?   00:00:00 prog

Дисциплина планирования FIFO, 0 процесс занял все отведенное время процессора (стоял в очереди первый на исполнение).

./sched2 3 2 45 30 45

F S  UID    PID   PPID    C PRI NI ADDR    SZ WCHAN TTY     TIME CMD

00000000 -   0   815140  561184  -  63  0    -  600K -     ?   00:00:00 ./sched

00000000 -   0   831525  815140  -  45  0    -  536K -     ?   00:00:10 prog

00000000 -   0   831526  815140  -  30  0    -  600K -     ?   00:00:00 prog

00000000 -   0   831527  815140  -  45  0    -  600K -     ?   00:00:10 prog

Дисциплина планирования RR, процессорное время поровну распередилилось между 0 и 2 процессом.

./sched2 3 2 45 30

F S  UID    PID   PPID    C PRI NI ADDR    SZ WCHAN TTY     TIME CMD

00000000 -   0   578142  418425  -  63  0    -  600K -     ?   00:00:00 ./sched

00000000 -   0   612547  578142  -  45  0    -  536K -     ?   00:00:20 prog

00000000 -   0   612548  578142  -  30  0    -  600K -     ?   00:00:00 prog

00000000 -   0   612549  578142  -  30  0    -  600K -     ?   00:00:00 prog