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

Enter new priority of process:

13

Priority 13 of process with pid 11780132

# ps -l -p 11780132

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

00000200 -    0  11780132  7401499  -  13   0    -  600K -     ?    00:00:00 ./test

Инструменты контроля и изменения политики планирования. К ним относятся функции получения сведений о предельных значениях приоритета при разных политиках: sched_get_priority_min(), sched_get_priority_max().

limprio.cпрограмма, определяющая предельные значения приоритета при разных политика диспетчеризации (FIFO, RR, OTHER, SPORADIC).

#include <stdlib.h>

#include <sched.h>

main( int argc, char* argv[])

{    

printf("policy\t\tminprio\t\tmaxprio\n");

printf("FIFO\t\t%i\t\t%i\n", sched_get_priority_min(SCHED_FIFO), sched_get_priority_max(SCHED_FIFO));

printf("RR\t\t%i\t\t%i\n", sched_get_priority_min(SCHED_RR), sched_get_priority_max(SCHED_RR));

printf("OTHER\t\t%i\t\t%i\n", sched_get_priority_min(SCHED_OTHER), sched_get_priority_max(SCHED_OTHER));

printf("SPORADIC\t%i\t\t%i\n", sched_get_priority_min(SCHED_SPORADIC), sched_get_priority_max(SCHED_SPORADIC));

}

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

# make limprio

cc     limprio.c   -o limprio

# ./limprio

policy          minprio         maxprio

FIFO            1               255

RR              1               255

OTHER           1               255

SPORADIC        1               255

Для пользователя root значения приоритетов  при разных политиках диспетчеризации меняются от 1-255, для обычных пользователей от 1-63.

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

Функции sched_setscheduler() и sched_getscheduler позволяют задать дисциплину планирования, а также  анализировать текущую дисциплину планирования.

Для управления политиками диспетчеризации в QNX используется механизм (в том числе позволяющий контролировать приоритеты процессов, то есть управлять всей системой планирования) на основе семейства методов, описанных в заголовочном файле sched.h.

sched.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 <semaphore.h>

#include <unistd.h>

#include <sys/stat.h>

#define SIZE 32780

#define MAX_NUM_OF_PROCESSES 10

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

{

int i, policy, num_of_processes, fd, fda;

int pid [MAX_NUM_OF_PROCESSES];

int priority[MAX_NUM_OF_PROCESSES];

char *buffer, * address;

char argum[5];

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]);

}

//create a new memory object for data array

fd = shm_open("buffer", O_RDWR | O_CREAT, 0777);

if (fd ==-1)

{

fprintf(stderr, "shm_open: open failed: %s\n", strerror(errno));

return EXIT_FAILURE;

}

//set the memory object's size

if(ftruncate(fd, SIZE) == -1)

{

fprintf(stderr, "ftruncate: %s\n", strerror(errno));

return EXIT_FAILURE;

}

//map the memory object

buffer = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);