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

if( buffer == MAP_FAILED)

{

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

return EXIT_FAILURE;

}

//create a new memory object for data array

fda = shm_open("address", O_RDWR | O_CREAT, 0777);

if (fda ==-1)

{

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

return EXIT_FAILURE;

}

//set the memory object's size

if(ftruncate(fda, 10) == -1)

{

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

return EXIT_FAILURE;

}

//map the memory object

address = mmap(0, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fda, 0);

if( address == MAP_FAILED)

{

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

return EXIT_FAILURE;

}

num_of_processes = atoi(argv[1]);

//sprintf( address, "0");

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

{

itoa(i, argum, 10);

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

param.sched_priority = priority[i];

sched_setparam(pid[i], &param);

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

}

sleep(10);

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

{

kill(pid[i], SIGKILL);

}    

printf("\n%s\n", buffer);

shm_unlink("buffer");

shm_unlink("address");

return EXIT_SUCCESS;

}          

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

#include <fcntl.h>

#include <unistd.h>

#include <sys/stat.h>

# define SIZE 32780

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

{

int proc, fd, fda, position;

int k =0;

char *buffer, *address;

char temp[10];

sem_t *mySem;

proc = atoi(argv[1]);

//create a new memory object for data array

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

if (fd ==-1)

{

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

return EXIT_FAILURE;

}

//map the memory object

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

if( buffer == MAP_FAILED)

{

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

return EXIT_FAILURE;

}

//create a new memory object for data array

fda = shm_open("address", O_RDWR, 0777);

if (fda ==-1)

{

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

return EXIT_FAILURE;

}

//map the memory object

address = mmap(0, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fda, 0);

if( address == MAP_FAILED)

{

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

return EXIT_FAILURE;

}

while(1)

{

position = atoi(address);

if (position >= SIZE) break;

*(buffer + position) = *argv[1];

position++;

itoa(position, temp, 10);

sprintf(address, temp);

//          sched_yield();

}

printf("%s\n", address);

munmap(buffer, sizeof(buffer));

munmap(address, sizeof(address));

return EXIT_SUCCESS;

}    

Программа sched создает  процессы и их приоритеты в соотвествии с заданными пользователем настроиками. Анализ работы дисциплины планирования должен был осуществляться через специальную область разделяемой памяти “buffer”, установленного размера. Планировалось, что процессы будут записывать в каждом цикле в разделяемую память свое значение, зависящее он номера процесса, тоесть нулевои процесс записывал бы в область памяти “0”, первый – “1” и т.д. Позиция куда должен был бы осуществлять запись текущии процесс, определялась смещением относительно начала области разделяемой памяти “buffer”. Число смещения

(позиция) хранилась в отдельной области памяти “address”.  Записи в отведенные области памяти происходили некорректно из-за неправильного межпроцессорного обмена (проблема корректной записи позиции смещения в случае обращения и записи значения в область памяти “address”), вследсвии чего было решено использовать другие программы.