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], ¶m);
sched_setscheduler(pid[i], policy, ¶m);
}
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”), вследсвии чего было решено использовать другие программы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.