#include #include #include #include #include #include #include #include #include #include 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; }