Files
OS-LABS/main.cpp
T
2026-04-21 11:04:11 +07:00

153 lines
3.1 KiB
C++

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/time.h>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <sstream>
using namespace std;
#define MAX 100000
#define MAX_DEPTH 3
struct SharedData {
int arr[MAX];
};
string now() {
timeval tv;
gettimeofday(&tv, NULL);
ostringstream oss;
oss << tv.tv_sec << "."
<< setfill('0') << setw(6) << tv.tv_usec;
return oss.str();
}
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;
}
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);
}
void parallel_sort(int l, int r, int depth, int shmid) {
SharedData *data = (SharedData*) shmat(shmid, NULL, 0);
int *arr = data->arr;
string start_time = now();
cout << "START PID=" << getpid()
<< " PPID=" << getppid()
<< " depth=" << depth
<< " range=[" << l << "," << r << "]"
<< " time=" << start_time << "\n";
if (l >= r) {
string end_time = now();
cout << "END PID=" << getpid()
<< " range=[" << l << "," << r << "]"
<< " time=" << end_time << "\n";
shmdt(data);
return;
}
int m = (l + r) / 2;
if (depth >= MAX_DEPTH) {
local_sort(arr, l, r);
string end_time = now();
cout << "END PID=" << getpid()
<< " depth=" << depth
<< " range=[" << l << "," << r << "]"
<< " time=" << end_time << "\n";
shmdt(data);
return;
}
pid_t left = fork();
if (left == 0) {
parallel_sort(l, m, depth + 1, shmid);
_exit(0);
}
pid_t right = fork();
if (right == 0) {
parallel_sort(m + 1, r, depth + 1, shmid);
_exit(0);
}
waitpid(left, NULL, 0);
waitpid(right, NULL, 0);
merge(arr, l, m, r);
string end_time = now();
cout << "END PID=" << getpid()
<< " depth=" << depth
<< " range=[" << l << "," << r << "]"
<< " time=" << end_time << "\n";
shmdt(data);
}
int main() {
key_t key = ftok("shmfile", 65);
int shmid = shmget(key, sizeof(SharedData), 0666 | IPC_CREAT);
SharedData *data = (SharedData*) shmat(shmid, NULL, 0);
int n = 20000;
srand(time(NULL));
for (int i = 0; i < n; i++)
data->arr[i] = rand() % 100000;
cout << "Before:\n";
for (int i = 0; i < 20; i++)
cout << data->arr[i] << " ";
cout << "\n\n";
parallel_sort(0, n - 1, 0, shmid);
cout << "\nAfter:\n";
for (int i = 0; i < 20; i++)
cout << data->arr[i] << " ";
cout << "\n";
shmdt(data);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}