Programowanie współbieżne

Pamięć dzielona


Wykonanie:

Paweł Markiewicz


Laboratorium nr 9


Data: 09.12.2021


Zadanie 1
Napisać program który tworzy w pamięci dzielonej (posix) macierz kwadratową int *macA; o rozmiarze int N=12; oraz wypełnia pola o współrzędnych x,y wartościami x*y. Po wykonaniu operacji pamięć należy odłączyć. Do wykorzystania są między innymi funkcje takie jak: shm_open, ftruncate, mmap


#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>


#define FLAGS O_RDWR | O_CREAT


int main (int argc, char **argv)

{

int fd, *macA = NULL, n = 12, length = n * n * sizeof(int), i, j;


if (-1 == (fd = shm_open("/shm_matrix", FLAGS, 0666)))

perror("blad shm_open");

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

perror("blad ftruncate");

if (MAP_FAILED == (macA = mmap(NULL,length,PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)))

perror("blad mmap");

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

for (j = 0; j < 12; j++)

macA[12 * i + j] = i * j;

close(fd);

exit(0);

}

Zadanie 2


Napisać drugi programik, który podłączy się do wcześniej utworzonej pamięci i wypisze dowolny fragment macierzy. Do tego celu stworzyć osobną funkcję której parametry odpowiednio to wskaźnik do początku pamięci macA rozmiar boku pamięci macA współrzędne początku podmacierzy oraz rozmiar podmacierzy. Formatowanie na 3 znakach w funkcji printf to %3d.


#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>


#define FLAGS O_RDONLY


void show_matrix(int *macA, int msize, int x, int y, int size)

{

int i, j;

if (x + size > msize || y + size > msize)

return;


for (i = x; i < x + size; i++)

{

for (j = y; j < y + size; j++)

printf("[%3d] ", macA[msize * i + j]);

puts("");

}

}


int main (int argc, char **argv)

{

int fd, *macA = NULL, n = 12;

struct stat stat;


if (-1 == (fd = shm_open("/shm_matrix", FLAGS, 0666)))

perror("blad shm_open");

if (-1 == fstat(fd, &stat))

perror("blad fstat");

if (MAP_FAILED == (macA = mmap(NULL,stat.st_size,PROT_READ,MAP_SHARED, fd, 0)))

perror("blad mmap");

if (-1 == close(fd))

perror("blad mmap");

show_matrix(macA, 12, 0, 0, 12);

exit(0);

}