From 099491dffab66e0ce2b137073ce33ea90322ecc4 Mon Sep 17 00:00:00 2001 From: pajjilykk Date: Tue, 21 Apr 2026 10:50:28 +0700 Subject: [PATCH] init --- Makefile | 29 +++++++++++++ lab1 | Bin 0 -> 17512 bytes main.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 Makefile create mode 100755 lab1 create mode 100644 main.cpp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..514e865 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +# Компилятор +CXX = g++ + +# Флаги +CXXFLAGS = -Wall -Wextra -O2 -std=c++17 + +# Линковка (для shm, fork, etc.) +LDFLAGS = -lrt + +# Имя программы +TARGET = lab1 + +# Исходник +SRC = main.cpp + +# ========================== + +all: $(TARGET) + +$(TARGET): $(SRC) + $(CXX) $(CXXFLAGS) $(SRC) -o $(TARGET) $(LDFLAGS) + +run: $(TARGET) + ./$(TARGET) + +clean: + rm -f $(TARGET) + +rebuild: clean all diff --git a/lab1 b/lab1 new file mode 100755 index 0000000000000000000000000000000000000000..b10999bfce5f0649a3c303de4c868284c0cd957c GIT binary patch literal 17512 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..4ed4f53 --- /dev/null +++ b/main.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +#define MAX 100000 +#define MAX_DEPTH 3 + +struct SharedData { + int arr[MAX]; +}; + +// ================= MERGE ================= +void merge(int *arr, int l, int m, int r) { + int *temp = new int[r - l + 1]; + + int i = l, j = m + 1, k = 0; + + while (i <= m && j <= r) { + if (arr[i] < arr[j]) + temp[k++] = arr[i++]; + else + temp[k++] = arr[j++]; + } + + while (i <= m) temp[k++] = arr[i++]; + while (j <= r) temp[k++] = arr[j++]; + + for (int x = 0; x < k; x++) + arr[l + x] = temp[x]; + + delete[] temp; +} + +// ================= LOCAL SORT ================= +void local_sort(int *arr, int l, int r) { + if (l >= r) return; + int m = (l + r) / 2; + local_sort(arr, l, m); + local_sort(arr, m + 1, r); + merge(arr, l, m, r); +} + +// ================= PARALLEL SORT ================= +void parallel_sort(int *arr, int l, int r, int depth) { + if (l >= r) return; + + int m = (l + r) / 2; + + cout << "PID " << getpid() + << " depth=" << depth + << " range=[" << l << "," << r << "]\n"; + + if (depth >= MAX_DEPTH) { + local_sort(arr, l, r); + return; + } + + pid_t left = fork(); + + if (left == 0) { + parallel_sort(arr, l, m, depth + 1); + _exit(0); + } + + pid_t right = fork(); + + if (right == 0) { + parallel_sort(arr, m + 1, r, depth + 1); + _exit(0); + } + + waitpid(left, NULL, 0); + waitpid(right, NULL, 0); + + merge(arr, l, m, r); +} + +// ================= MAIN ================= +int main() { + key_t key = ftok("shmfile", 65); + int shmid = shmget(key, sizeof(SharedData), 0666 | IPC_CREAT); + + SharedData *data = (SharedData*) shmat(shmid, (void*)0, 0); + + int n = 20000; + + srand(time(NULL)); + + for (int i = 0; i < n; i++) + data->arr[i] = rand() % 100000; + + timeval start, end; + + gettimeofday(&start, NULL); + + parallel_sort(data->arr, 0, n - 1, 0); + + gettimeofday(&end, NULL); + + double time_spent = + (end.tv_sec - start.tv_sec) + + (end.tv_usec - start.tv_usec) / 1e6; + + cout << "\nExecution time: " << time_spent << " sec\n"; + + // Проверка + for (int i = 1; i < n; i++) { + if (data->arr[i - 1] > data->arr[i]) { + cout << "ERROR: not sorted!\n"; + break; + } + } + + cout << "Sorted correctly\n"; + + shmdt(data); + shmctl(shmid, IPC_RMID, NULL); + + return 0; +}