
- •Завдання
- •Теоретичні відомості
- •Завдання 1
- •Лістинг програми
- •Результат роботи програми
- •Завдання 2
- •Лістинг програми
- •Результат роботи програми
- •Завдання 3
- •Лістинги програм
- •Результати виконання програм
- •Завдання 4
- •Лістинги програм
- •Результати виконання програм
- •Завдання 5
- •Лістинги програм
- •Результати виконання програм
- •Завдання 6
- •Результат виконання завдання
- •Висновок
Результати виконання програм
Програма а:
Програма б:
Завдання 4
Розподілена пам’ять.
а. Визначити чи є матриця А симетричної щодо головної діагоналі. Вхідні дані: ціле додатнє число n, масив чисел А розмірності nxn. Використати не менше 4 процесів для вирішення завдання.
б. Дано послідовність натуральних чисел a0 ... an-1. Створити багатопоточний додаток для пошуку всіх ai, які є простими числами.
Лістинги програм
Програма а:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<unistd.h>
#include <sys/wait.h>
struct Mymem
{
int isSymmetric;
} *mem;
int main()
{
int shmid = shmget(IPC_PRIVATE, 2, IPC_CREAT|0666);
if (shmid < 0 ) {
printf("Fatal Error\n");
return 0;
}
mem = (Mymem *)shmat(shmid, NULL, 0);
int pid, n, st;
pid = fork();
if (pid == 0) {
printf("Enter N: ");
scanf("%d", &n);
}
wait(NULL);
int m[n][n], i, j, a, b;
srand(time(0));
puts("Matrix:");
pid = fork();
if (pid == 0) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
m[i][j] = rand() % 2;
printf("%3d", m[i][j]);
}
puts("");
}
}
wait(NULL);
a = n/2;
if (n % 2 == 0) {
b = a;
} else {
b = a+1;
}
int isSymmetric = 1;
pid = fork();
if (pid == 0) {
for (i = 0; i < a; i++) {
for (j = 0; j < n; j++) {
isSymmetric = isSymmetric && (m[i][j] == m[j][i]);
}
}
mem->isSymmetric = isSymmetric;
}
if (pid != 0) {
for (i = a; i < b; i++) {
for (j = 0; j < n; j++) {
isSymmetric = isSymmetric && (m[i][j] == m[j][i]);
}
}
wait(NULL);
if (isSymmetric && mem->isSymmetric) {
puts("Symmetric");
} else {
puts("No symmetric");
}
}
return 1;
}
Програма б:
#include<stdio.h>
#include<sched.h>
#include<unistd.h>
#include<stdlib.h>
#include<time.h>
#define NUMSTACK 5000
int isPrime(int);
int func(void *);
int center(int);
int a[100];
char stack[2][NUMSTACK];
int number = 1;
int length;
int main()
{
printf("Enter N: ");
scanf("%d", &length);
int i;
srand(time(0));
puts("Array:");
for (i = 0; i < length; i++) {
a[i] = rand() % 14;
printf("%5d", a[i]);
}
printf("\n");
clone(func, (void*)(stack[0]+NUMSTACK-1), CLONE_VM|CLONE_VFORK, NULL);
clone(func, (void*)(stack[1]+NUMSTACK-1), CLONE_VM|CLONE_VFORK, NULL);
return 1;
}
int func(void *param)
{
printf("Thread # %d\n", number);
int start, end, i;
if (number == 1) {
start = 0;
end = center(length);
} else {
start = center(length);
end = length;
}
for (i = start; i < end; i++) {
if (isPrime(a[i])) {
printf("%5d", a[i]);
}
}
printf("\n");
number++;
}
int center(int number)
{
int n = number/2;
int b;
if (number % 2 == 0) {
b = n;
} else {
b = n+1;
}
}
int isPrime(int number)
{
if (number == 0) {
return 0;
}
int i;
for (i = 2; i < number; i++) {
if (number % i == 0)
return 0;
}
return 1;
}