From bdb432dc3980a9ce1b7ddfb5921d97eadddbbdc1 Mon Sep 17 00:00:00 2001 From: pajjilykk Date: Thu, 23 Apr 2026 10:36:29 +0700 Subject: [PATCH] add gitignore --- .gitignore | 1 + Makefile | 36 +++--- export.py | 152 ++++++++++++++++++++++++++ lab1 | Bin 27504 -> 29952 bytes log.txt | 36 ++++++ main.cpp | 278 ++++++++++++++++++++++++++++------------------- process_log.xlsx | Bin 0 -> 5725 bytes req.txt | 1 + 8 files changed, 381 insertions(+), 123 deletions(-) create mode 100644 .gitignore create mode 100644 export.py create mode 100644 log.txt create mode 100644 process_log.xlsx create mode 100644 req.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c12220 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.xlsx diff --git a/Makefile b/Makefile index 514e865..64e7164 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,16 @@ -# Компилятор -CXX = g++ +CXX := g++ +PYTHON := python3 +PIP := $(PYTHON) -m pip -# Флаги -CXXFLAGS = -Wall -Wextra -O2 -std=c++17 +CXXFLAGS := -Wall -Wextra -O2 -std=c++17 +LDFLAGS := -lrt -# Линковка (для shm, fork, etc.) -LDFLAGS = -lrt +TARGET := lab1 +SRC := main.cpp +LOG_FILE := log.txt +XLSX_FILE:= process_log.xlsx -# Имя программы -TARGET = lab1 - -# Исходник -SRC = main.cpp - -# ========================== +.PHONY: all run log excel export report deps clean rebuild all: $(TARGET) @@ -23,7 +20,18 @@ $(TARGET): $(SRC) run: $(TARGET) ./$(TARGET) +log: $(TARGET) + ./$(TARGET) > $(LOG_FILE) + +excel export: log + $(PYTHON) export.py --input $(LOG_FILE) --output $(XLSX_FILE) + +report: excel + +deps: + $(PIP) install -r req.txt + clean: - rm -f $(TARGET) + rm -f $(TARGET) $(XLSX_FILE) rebuild: clean all diff --git a/export.py b/export.py new file mode 100644 index 0000000..27d6e53 --- /dev/null +++ b/export.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +import argparse +import re +import sys +from dataclasses import dataclass +from typing import Dict, Iterable, List, Tuple + +from openpyxl import Workbook +from openpyxl.styles import Font + + +LINE_RE = re.compile( + r"^(START|END)\s+PID=(\d+)\s+PPID=(\d+)\s+depth=(\d+)\s+range=\[(\d+),(\d+)\]\s+time=([0-9.]+)$" +) + + +@dataclass +class ProcessLog: + pid: int + ppid: int + start: float + finish: float | None = None + first_seen_order: int = 0 + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Convert process START/END log to a ptree-like Excel report." + ) + parser.add_argument( + "-i", + "--input", + default="-", + help="Input log file path (default: stdin)", + ) + parser.add_argument( + "-o", + "--output", + default="process_log.xlsx", + help="Output Excel file path (default: process_log.xlsx)", + ) + return parser.parse_args() + + +def read_lines(input_path: str) -> Iterable[str]: + if input_path == "-": + for line in sys.stdin: + yield line.rstrip("\n") + return + + with open(input_path, "r", encoding="utf-8") as f: + for line in f: + yield line.rstrip("\n") + + +def parse_processes(lines: Iterable[str]) -> Dict[int, ProcessLog]: + processes: Dict[int, ProcessLog] = {} + order = 0 + + for raw in lines: + m = LINE_RE.match(raw.strip()) + if not m: + continue + + event, pid_s, ppid_s, _depth_s, _l_s, _r_s, ts_s = m.groups() + pid = int(pid_s) + ppid = int(ppid_s) + ts = float(ts_s) + + if event == "START": + processes[pid] = ProcessLog( + pid=pid, ppid=ppid, start=ts, finish=None, first_seen_order=order + ) + order += 1 + else: + if pid in processes: + processes[pid].finish = ts + + return processes + + +def tree_rows(processes: Dict[int, ProcessLog]) -> List[Tuple[int, ProcessLog]]: + complete = {pid: p for pid, p in processes.items() if p.finish is not None} + + children: Dict[int, List[int]] = {} + for pid in complete: + children[pid] = [] + for pid, node in complete.items(): + if node.ppid in complete: + children[node.ppid].append(pid) + + for pid in children: + children[pid].sort(key=lambda cpid: complete[cpid].start) + + roots = [pid for pid, node in complete.items() if node.ppid not in complete] + roots.sort(key=lambda pid: complete[pid].start) + + ordered: List[Tuple[int, ProcessLog]] = [] + + def dfs(pid: int, depth: int) -> None: + ordered.append((depth, complete[pid])) + for ch in children[pid]: + dfs(ch, depth + 1) + + for root_pid in roots: + dfs(root_pid, 0) + + remaining = [pid for pid in complete if pid not in {p.pid for _, p in ordered}] + remaining.sort(key=lambda pid: complete[pid].start) + for pid in remaining: + dfs(pid, 0) + + return ordered + + +def export_excel(rows: List[Tuple[int, ProcessLog]], output_path: str) -> None: + wb = Workbook() + ws = wb.active + ws.title = "process_logs" + + ws.append(["PPID", "PID", "START", "FINISH", "DURATION"]) + for cell in ws[1]: + cell.font = Font(bold=True) + + for depth, node in rows: + if node.finish is None: + continue + duration = node.finish - node.start + pid_display = f"{' ' * depth}{node.pid}" + ws.append([node.ppid, pid_display, node.start, node.finish, duration]) + + ws.column_dimensions["A"].width = 12 + ws.column_dimensions["B"].width = 20 + ws.column_dimensions["C"].width = 18 + ws.column_dimensions["D"].width = 18 + ws.column_dimensions["E"].width = 14 + ws.freeze_panes = "A2" + + wb.save(output_path) + + +def main() -> int: + args = parse_args() + processes = parse_processes(read_lines(args.input)) + rows = tree_rows(processes) + export_excel(rows, args.output) + print(f"Saved to {args.output}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/lab1 b/lab1 index b5f66d81c56623465ee2bbd071951a7501d4b904..e568c81a87956aa89eb10cd4f5d3340a1b56e281 100755 GIT binary patch literal 29952 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 diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..913ac00 --- /dev/null +++ b/log.txt @@ -0,0 +1,36 @@ +Before: +61348 28446 8318 49147 24393 15112 24969 66655 3374 5666 48922 778 11600 6589 6406 56105 71867 17651 21741 7869 + +START PID=44192 PPID=44191 depth=0 range=[0,19999] time=1776745157.209104 +START PID=44193 PPID=44192 depth=1 range=[0,9999] time=1776745157.209289 +START PID=44194 PPID=44192 depth=1 range=[10000,19999] time=1776745157.209369 +START PID=44195 PPID=44193 depth=2 range=[0,4999] time=1776745157.209470 +START PID=44197 PPID=44193 depth=2 range=[5000,9999] time=1776745157.209540 +START PID=44196 PPID=44194 depth=2 range=[10000,14999] time=1776745157.209546 +START PID=44198 PPID=44194 depth=2 range=[15000,19999] time=1776745157.209581 +START PID=44199 PPID=44195 depth=3 range=[0,2499] time=1776745157.209631 +START PID=44200 PPID=44197 depth=3 range=[5000,7499] time=1776745157.209689 +START PID=44201 PPID=44196 depth=3 range=[10000,12499] time=1776745157.209717 +START PID=44202 PPID=44195 depth=3 range=[2500,4999] time=1776745157.209722 +START PID=44204 PPID=44197 depth=3 range=[7500,9999] time=1776745157.209779 +START PID=44205 PPID=44196 depth=3 range=[12500,14999] time=1776745157.209848 +START PID=44203 PPID=44198 depth=3 range=[15000,17499] time=1776745157.209874 +END PID=44200 PPID=44197 depth=3 range=[5000,7499] time=1776745157.209961 +END PID=44199 PPID=44195 depth=3 range=[0,2499] time=1776745157.210015 +END PID=44201 PPID=44196 depth=3 range=[10000,12499] time=1776745157.210100 +END PID=44202 PPID=44195 depth=3 range=[2500,4999] time=1776745157.210110 +END PID=44204 PPID=44197 depth=3 range=[7500,9999] time=1776745157.210143 +END PID=44205 PPID=44196 depth=3 range=[12500,14999] time=1776745157.210214 +END PID=44203 PPID=44198 depth=3 range=[15000,17499] time=1776745157.210242 +END PID=44195 PPID=44193 depth=2 range=[0,4999] time=1776745157.210294 +END PID=44197 PPID=44193 depth=2 range=[5000,9999] time=1776745157.210304 +END PID=44196 PPID=44194 depth=2 range=[10000,14999] time=1776745157.210415 +START PID=44206 PPID=44198 depth=3 range=[17500,19999] time=1776745157.210418 +END PID=44193 PPID=44192 depth=1 range=[0,9999] time=1776745157.210535 +END PID=44206 PPID=44198 depth=3 range=[17500,19999] time=1776745157.210718 +END PID=44198 PPID=44194 depth=2 range=[15000,19999] time=1776745157.210864 +END PID=44194 PPID=44192 depth=1 range=[10000,19999] time=1776745157.211079 +END PID=44192 PPID=44191 depth=0 range=[0,19999] time=1776745157.211362 + +After: +4 10 13 28 36 40 54 55 59 62 68 78 81 81 83 85 90 91 91 92 diff --git a/main.cpp b/main.cpp index 3d35770..9312bd4 100644 --- a/main.cpp +++ b/main.cpp @@ -1,152 +1,212 @@ +#include +#include +#include #include +#include +#include +#include +#include #include #include +#include #include #include -#include -#include -#include -#include -#include +#include -using namespace std; +namespace { -#define MAX 100000 -#define MAX_DEPTH 3 +constexpr int kDefaultN = 20000; +constexpr int kDefaultMaxDepth = 3; +constexpr int kPreviewCount = 20; -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; +std::string now() { + timeval tv{}; + gettimeofday(&tv, nullptr); + std::ostringstream oss; + oss << tv.tv_sec << "." << std::setfill('0') << std::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]; +void log_start(int l, int r, int depth) { + std::cout << "START PID=" << getpid() << " PPID=" << getppid() << " depth=" << depth + << " range=[" << l << "," << r << "] time=" << now() << '\n' + << std::flush; +} - int i = l, j = m + 1, k = 0; +void log_end(int l, int r, int depth) { + std::cout << "END PID=" << getpid() << " PPID=" << getppid() << " depth=" << depth + << " range=[" << l << "," << r << "] time=" << now() << '\n' + << std::flush; +} + +void merge_range(int* arr, int l, int m, int r) { + std::vector temp; + temp.reserve(r - l + 1); + + int i = l; + int j = m + 1; while (i <= m && j <= r) { - if (arr[i] < arr[j]) temp[k++] = arr[i++]; - else temp[k++] = arr[j++]; + if (arr[i] <= arr[j]) { + temp.push_back(arr[i++]); + } else { + temp.push_back(arr[j++]); + } } - while (i <= m) temp[k++] = arr[i++]; - while (j <= r) temp[k++] = arr[j++]; + while (i <= m) { + temp.push_back(arr[i++]); + } + while (j <= r) { + temp.push_back(arr[j++]); + } - for (int x = 0; x < k; x++) arr[l + x] = temp[x]; - - delete[] temp; + std::copy(temp.begin(), temp.end(), arr + l); } -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"; - +void local_sort(int* arr, int l, int r) { 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; + const int m = l + (r - l) / 2; + local_sort(arr, l, m); + local_sort(arr, m + 1, r); + merge_range(arr, l, m, r); +} - if (depth >= MAX_DEPTH) { +void parallel_sort(int* arr, int l, int r, int depth, int max_depth) { + log_start(l, r, depth); + + if (l >= r) { + log_end(l, r, depth); + return; + } + + const int m = l + (r - l) / 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); + log_end(l, r, depth); return; } pid_t left = fork(); - if (left == 0) { - parallel_sort(l, m, depth + 1, shmid); - _exit(0); + parallel_sort(arr, l, m, depth + 1, max_depth); + _exit(EXIT_SUCCESS); + } + + if (left < 0) { + std::perror("fork left"); + local_sort(arr, l, m); } pid_t right = fork(); - if (right == 0) { - parallel_sort(m + 1, r, depth + 1, shmid); - _exit(0); + parallel_sort(arr, m + 1, r, depth + 1, max_depth); + _exit(EXIT_SUCCESS); } - waitpid(left, NULL, 0); - waitpid(right, NULL, 0); + if (right < 0) { + std::perror("fork right"); + local_sort(arr, m + 1, r); + } - merge(arr, l, m, r); + int left_status = 0; + if (left > 0 && waitpid(left, &left_status, 0) < 0) { + std::perror("waitpid left"); + local_sort(arr, l, m); + } else if (left > 0 && (!WIFEXITED(left_status) || WEXITSTATUS(left_status) != 0)) { + local_sort(arr, l, m); + } - string end_time = now(); + int right_status = 0; + if (right > 0 && waitpid(right, &right_status, 0) < 0) { + std::perror("waitpid right"); + local_sort(arr, m + 1, r); + } else if (right > 0 && (!WIFEXITED(right_status) || WEXITSTATUS(right_status) != 0)) { + local_sort(arr, m + 1, r); + } - cout << "END PID=" << getpid() - << " depth=" << depth - << " range=[" << l << "," << r << "]" - << " time=" << end_time << "\n"; - - shmdt(data); + merge_range(arr, l, m, r); + log_end(l, r, depth); } -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; +bool parse_positive_int(const char* value, int& out) { + try { + size_t consumed = 0; + const int parsed = std::stoi(value, &consumed); + if (value[consumed] != '\0') { + return false; + } + if (parsed <= 0) { + return false; + } + out = parsed; + return true; + } catch (const std::invalid_argument&) { + return false; + } catch (const std::out_of_range&) { + return false; + } +} + +} // namespace + +int main(int argc, char* argv[]) { + int n = kDefaultN; + int max_depth = kDefaultMaxDepth; + + if (argc >= 2 && !parse_positive_int(argv[1], n)) { + std::cerr << "Invalid array size: " << argv[1] << '\n'; + return EXIT_FAILURE; + } + if (argc >= 3 && !parse_positive_int(argv[2], max_depth)) { + std::cerr << "Invalid max depth: " << argv[2] << '\n'; + return EXIT_FAILURE; + } + + const size_t shm_size = static_cast(n) * sizeof(int); + const int shmid = shmget(IPC_PRIVATE, shm_size, IPC_CREAT | 0600); + if (shmid < 0) { + std::perror("shmget"); + return EXIT_FAILURE; + } + + int* arr = static_cast(shmat(shmid, nullptr, 0)); + if (arr == reinterpret_cast(-1)) { + std::perror("shmat"); + shmctl(shmid, IPC_RMID, nullptr); + return EXIT_FAILURE; + } + + std::mt19937 rng(std::random_device{}()); + std::uniform_int_distribution dist(0, 99999); + for (int i = 0; i < n; ++i) { + arr[i] = dist(rng); + } + + std::cout << "Before:\n"; + for (int i = 0; i < std::min(n, kPreviewCount); ++i) { + std::cout << arr[i] << ' '; + } + std::cout << "\n\n"; + + parallel_sort(arr, 0, n - 1, 0, max_depth); + + std::cout << "\nAfter:\n"; + for (int i = 0; i < std::min(n, kPreviewCount); ++i) { + std::cout << arr[i] << ' '; + } + std::cout << '\n'; + + if (shmdt(arr) < 0) { + std::perror("shmdt"); + } + if (shmctl(shmid, IPC_RMID, nullptr) < 0) { + std::perror("shmctl IPC_RMID"); + } + + return EXIT_SUCCESS; } diff --git a/process_log.xlsx b/process_log.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..434c96415b66ed13671c46bb5a9cc38f355944e2 GIT binary patch literal 5725 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 G1o$7WP7O-{ literal 0 HcmV?d00001 diff --git a/req.txt b/req.txt new file mode 100644 index 0000000..794cc3d --- /dev/null +++ b/req.txt @@ -0,0 +1 @@ +openpyxl