From e34a60c91e66a716cfc436b21483179190800f07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:57:33 +0000 Subject: [PATCH 1/7] add interview prep guide documentation Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/ac5f7616-3a2f-48cd-a17b-dc23b3aae7ea --- README.md | 1 + docs/INTERVIEW_PREP_GUIDE.md | 188 +++++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 docs/INTERVIEW_PREP_GUIDE.md diff --git a/README.md b/README.md index 880c8fc..254fa3b 100644 --- a/README.md +++ b/README.md @@ -278,6 +278,7 @@ USER sysuser - **[TESTING.md](TESTING.md)** - Edge cases, test strategy, debugging guide - **[TECHNICAL_ANALYSIS.md](docs/TECHNICAL_ANALYSIS.md)** - Technical Q&A, elevator pitch, behavioral prep - **[CV_FEEDBACK.md](docs/CV_FEEDBACK.md)** - Technical recruiter analysis (language recommendations) +- **[INTERVIEW_PREP_GUIDE.md](docs/INTERVIEW_PREP_GUIDE.md)** - Word-ready walkthrough of every file with what/why/talking points All source files include Doxygen-style comments with `@brief`, `@param`, and `@return` annotations. diff --git a/docs/INTERVIEW_PREP_GUIDE.md b/docs/INTERVIEW_PREP_GUIDE.md new file mode 100644 index 0000000..5d5c652 --- /dev/null +++ b/docs/INTERVIEW_PREP_GUIDE.md @@ -0,0 +1,188 @@ +# Interview Prep Guide (Word-Ready) – Linux System Programming Portfolio + +Copy-paste this into a Word doc and keep the headings; each section states **what the code does**, **why it was built that way**, and **how to say it out loud**. + +--- + +## 30-Second Pitch (say this first) +- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ~400K items/sec using per-consumer condition variables.” +- **Why**: “I wanted to demonstrate production-grade systems fundamentals—process lifecycle, signals, and concurrency—without hiding behind frameworks.” +- **How to say it**: Confident, concise, end with a number (“~400K items/sec”) and a principle (“correctness before features”). + +--- + +## Architecture Snapshot (for whiteboard) +- **Components**: `shell` (process/signal management), `queue` (concurrency), `tests` (throughput harness), `build/CI` (Makefile, Docker, GitHub Actions). +- **Flow**: Shell parses → forks children → pipes/dup2 wiring → signal handling prevents zombies. Queue serializes state with one mutex, parks consumers on per-thread `cnd_t`, producers hand off directly. +- **Why this split**: Keeps the repo teachable—two focused subsystems that surface classic OS/CS interview topics. + +--- + +## File-by-File Talk Track +Use these bullets verbatim with recruiters. Each entry includes **What**, **Why**, **How to talk about it**. + +### Top-Level +- **`README.md`** + - *What*: Portfolio overview, quick start commands, performance table, and feature bullets. + - *Why*: Gives recruiters an immediate “so what” (throughput metric + skills) before code dive. + - *How*: “I front-loaded measurable impact and architecture so reviewers can qualify me in 30 seconds.” + +- **`Makefile`** + - *What*: Professional build targets (`all`, `test`, `check`, `debug`, `format`, `install`). + - *Why*: Mirrors production CI knobs; enforces warnings-as-errors and consistent flags. + - *How*: “I treat the build as a product—strict flags, reproducible targets, and a `check` target for CI.” + +- **`Dockerfile`** + - *What*: Two-stage build; compiles/tests in `gcc:11` then ships minimal `debian:bullseye-slim` with non-root user. + - *Why*: Guarantees toolchain parity and small runtime surface; security via non-root execution. + - *How*: “I bake tests into the image build so bad code can’t ship, and I drop privileges in the runtime stage.” + +- **`.github/workflows/ci.yml`** + - *What*: CI that installs toolchain, builds, runs tests, verifies binaries, and checks clang-format (dry-run). + - *Why*: Proves reproducibility and style consistency on every push/PR. + - *How*: “CI mirrors `make check` locally—no drift between my laptop and GitHub runners.” + +### Shell +- **`src/shell/myshell.c`** + - *What*: Core shell logic—fork/exec pipelines, `<`/`>` redirection, background support, SIGCHLD reaping, SIGINT delegation. + - *Why*: Demonstrates process control and correct signal semantics; caps pipelines at 10 to keep FD management safe. + - *How*: “Parent ignores SIGINT so children receive it; SIGCHLD handler loops with `waitpid(WNOHANG)` to avoid zombies; pipes are closed in every child to prevent FD leaks.” + +- **`src/shell/shell_main.c`** + - *What*: Minimal REPL: reads a line, tokenizes, calls `process_arglist`, frees resources. + - *Why*: Separates parsing/driver from execution to keep the core shell testable and focused. + - *How*: “I kept the driver tiny—parsing is explicit, memory ownership is clear, and all roads lead to the core process function.” + +- **`docs/instructions_systems.txt`** (legacy assignment brief) + - *What*: Original course assignment spec for the shell (signals, pipes, required behavior). + - *Why*: Documents the constraints the implementation was built to satisfy. + - *How*: “I preserved the assignment brief to show compliance context and to clarify intentionally omitted features like full job control.” + +### Queue +- **`src/queue/queue.c`** + - *What*: Thread-safe FIFO with one mutex, per-waiter condition variables, and relaxed atomic throughput counter. + - *Why*: Single lock keeps correctness simple; per-waiter `cnd_t` avoids the thundering herd; relaxed atomics keep telemetry cheap. + - *How*: “Consumers park with their own condition variable; producers hand off directly under the lock—O(1) wakeups, no broadcast storms.” + +- **`include/queue.h`** + - *What*: Public API (`initQueue`, `enqueue`, `dequeue`, `visited`, `destroyQueue`). + - *Why*: Clean, minimal surface for reusability across tests/clients. + - *How*: “Tiny API on purpose—easy to audit and drop into other C projects.” + +### Tests & QA +- **`tests/queue_test.c`** + - *What*: Producer/consumer harness (2P/2C) measuring throughput and verifying visited count. + - *Why*: Exercises synchronization under concurrency and produces a brag-worthy metric. + - *How*: “Workload is symmetric to expose race conditions; timing uses `CLOCK_MONOTONIC` to avoid wall-clock skew.” + +- **`tests/TESTING.md`** + - *What*: Edge-case catalog for queue and shell; includes Docker smoke tests and Valgrind guidance. + - *Why*: Shows test philosophy and acknowledges untested gaps (e.g., destroy during use). + - *How*: “I list what’s covered and what’s intentionally not—demonstrates prioritization and risk awareness.” + +### Documentation +- **`docs/TECHNICAL_ANALYSIS.md`** + - *What*: Q&A, talking points, and behavioral narratives for the project. + - *Why*: Prepared answers improve interview confidence; links code to story. + - *How*: “I pre-baked answers about signals, race conditions, and trade-offs so I can respond crisply.” + +- **`docs/CV_FEEDBACK.md`** + - *What*: Recruiter-style critique of the resume framing this project. + - *Why*: Ensures language resonates with hiring signals (impact, metrics, clarity). + - *How*: “I treat feedback as a spec—adjust wording to match what recruiters scan for.” + +--- + +## Engineering Decisions (What/Why/How to Say) +- **Per-waiter condition variables (queue)**: + - *What*: Each waiting consumer has its own `cnd_t`; producers signal exactly one. + - *Why*: Avoids wake-all storms and context-switch waste; simpler than futexes/lock-free. + - *How*: “I traded theoretical peak throughput for predictable O(1) wakeups and simpler correctness.” + +- **Single mutex for queue state**: + - *What*: One `mtx_t` guards both item and wait queues. + - *Why*: Eliminates lock-ordering risk; plenty fast for demonstrated load. + - *How*: “Correctness first—if profiling shows contention, I’d shard or go lock-free.” + +- **SIGINT handling strategy (shell)**: + - *What*: Parent ignores SIGINT; children inherit default; background children can ignore when requested. + - *Why*: Matches common shell UX—Ctrl+C kills foreground job, not the shell. + - *How*: “I delegate SIGINT to children and restore defaults in `finalize()` to avoid surprising users.” + +- **SIGCHLD reaping with `SA_RESTART`**: + - *What*: Handler loops `waitpid(-1, …, WNOHANG)` and preserves `errno`. + - *Why*: Prevents zombies without blocking; `SA_RESTART` reduces EINTR hassles. + - *How*: “I made the handler async-signal-safe and defensive—errno is restored to avoid corrupting callers.” + +- **Pipeline cap at 10 commands**: + - *What*: Guardrail via `MAX_PIPE_CMDS`. + - *Why*: Avoids unbounded FD growth and simplifies static pipe array allocation. + - *How*: “Explicit limits show I think about resource ceilings; easy to raise with a ring buffer if needed.” + +- **Docker multi-stage build**: + - *What*: Build/test in builder stage; slim runtime with non-root user. + - *Why*: Reproducible builds and least-privilege runtime. + - *How*: “Security and parity baked into the image; tests run before artifacts ship.” + +- **CI formatting check as dry-run**: + - *What*: clang-format `--dry-run --Werror` to detect drift without rewriting. + - *Why*: Keeps PRs clean; avoids CI mutating code. + - *How*: “Style is enforced automatically, but humans stay in control of diffs.” + +--- + +## CS Concepts (Define + Connect to Code) +- **Mutex (`mtx_t`)**: Mutual exclusion primitive; here, serializes queue state to prevent races. +- **Condition Variable (`cnd_t`)**: Wait/notify mechanism; used per-consumer to avoid broadcast storms. +- **Atomic Operations (`atomic_fetch_add`, relaxed order)**: Lock-free telemetry counter; correctness doesn’t depend on ordering, so relaxed is sufficient. +- **Producer-Consumer Pattern**: Coordinated work handoff; queue pairs producers and consumers via wait queue + item queue. +- **Fork/Exec Model**: `fork()` duplicates process; `execvp()` overlays child with target program—used per pipeline stage. +- **Pipes & `dup2`**: Anonymous pipes connect stdout of one process to stdin of the next; `dup2` wires FDs reliably. +- **Signals (SIGINT, SIGCHLD, `SA_RESTART`)**: Async notifications; shell ignores SIGINT in parent, reaps SIGCHLD to avoid zombies, relies on restart semantics to reduce EINTR. +- **Zombie Processes**: Children that ended but weren’t waited on; prevented by SIGCHLD handler. +- **Background vs. Foreground Jobs**: Background skips parent wait; foreground waits synchronously—mirrors shell UX. +- **Build Reproducibility**: Same flags and steps in Makefile, Docker, and CI ensure deterministic outputs. + +--- + +## Metrics & Proof Points +- Queue throughput: **~400–465K items/sec** on GitHub runners (2 producers/2 consumers, 100 items each). +- Warnings-as-errors: `-Wall -Wextra -Werror`, `-O2`. +- Tests: `make test` (queue harness), `make check` (build + test), CI mirrors these. +- Security: Non-root container runtime; no `system()` calls—uses `execvp` directly. + +--- + +## Quick Answers to Common Prompts +- **“Why not lock-free?”** → “Mutex version is simpler and already fast enough; I’d switch after profiling shows contention.” +- **“How do you prevent zombies?”** → “SIGCHLD handler loops `waitpid(WNOHANG)`, preserves errno, and uses `SA_NOCLDSTOP`.” +- **“How do you avoid lost wakeups?”** → “Condition wait/notify happens under the mutex; consumers enqueue their wait node before sleeping.” +- **“Biggest limitation?”** → “Shell lacks full job control and detailed pipeline exit codes; queue is unbounded and destroy isn’t safe under active load.” +- **“How would you scale the queue?”** → “Shard by hash, or adopt a Michael-Scott lock-free queue; optionally batch enqueues to amortize lock cost.” + +--- + +## Walkthrough Script (3–5 minutes) +1. Start with the 30-second pitch (metrics + scope). +2. Open `README.md` to show performance table and architecture bullets. +3. Walk `queue.c`: one mutex, per-waiter `cnd_t`, relaxed atomic counter; mention tests and throughput. +4. Walk `myshell.c`: SIGINT strategy, SIGCHLD handler, pipe wiring, background guardrails. +5. Mention CI/Docker: tests run in build stage; non-root runtime. +6. Close with limitations + how you’d harden (job control, bounded queue, richer error reporting). + +--- + +## Behavioral Hooks (tie code to soft skills) +- **Trade-off thinking**: “Chose simplicity over lock-free; added explicit limits; documented gaps.” +- **Ownership**: “Every allocation in enqueue is freed in dequeue; signal handlers restore errno.” +- **Testing mindset**: “Edge cases documented in `tests/TESTING.md`; CI + Docker ensures parity.” +- **Security awareness**: “Non-root container, no shell injection, explicit FD cleanup.” + +--- + +## Last-Minute Checklist Before Interview +- Run `make check` locally (mirrors CI). +- Skim `myshell.c` signal blocks and `queue.c` wait-path to refresh wording. +- Keep the throughput number ready (~400–465K items/sec) and the O(1) wakeup story. +- Prepare one improvement you’d ship next (job control or bounded queue). + From ecb79bb67e552d20876252a29c7ba1cad3f403cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:58:08 +0000 Subject: [PATCH 2/7] clarify docker image and throughput note Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/ac5f7616-3a2f-48cd-a17b-dc23b3aae7ea --- docs/INTERVIEW_PREP_GUIDE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/INTERVIEW_PREP_GUIDE.md b/docs/INTERVIEW_PREP_GUIDE.md index 5d5c652..a0433ac 100644 --- a/docs/INTERVIEW_PREP_GUIDE.md +++ b/docs/INTERVIEW_PREP_GUIDE.md @@ -33,7 +33,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* - *How*: “I treat the build as a product—strict flags, reproducible targets, and a `check` target for CI.” - **`Dockerfile`** - - *What*: Two-stage build; compiles/tests in `gcc:11` then ships minimal `debian:bullseye-slim` with non-root user. + - *What*: Two-stage build; compiles/tests in `gcc:11-bullseye` then ships minimal `debian:bullseye-slim` with non-root user. - *Why*: Guarantees toolchain parity and small runtime surface; security via non-root execution. - *How*: “I bake tests into the image build so bad code can’t ship, and I drop privileges in the runtime stage.” @@ -146,7 +146,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* --- ## Metrics & Proof Points -- Queue throughput: **~400–465K items/sec** on GitHub runners (2 producers/2 consumers, 100 items each). +- Queue throughput: **~400–465K items/sec** on GitHub runners (2 producers/2 consumers, 100 items per producer = 200 total items). - Warnings-as-errors: `-Wall -Wextra -Werror`, `-O2`. - Tests: `make test` (queue harness), `make check` (build + test), CI mirrors these. - Security: Non-root container runtime; no `system()` calls—uses `execvp` directly. @@ -185,4 +185,3 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* - Skim `myshell.c` signal blocks and `queue.c` wait-path to refresh wording. - Keep the throughput number ready (~400–465K items/sec) and the O(1) wakeup story. - Prepare one improvement you’d ship next (job control or bounded queue). - From 25b6c7a2da3928afd7fc72d7e2d4e553bb4884aa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:58:45 +0000 Subject: [PATCH 3/7] clarify throughput context and docker tag note Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/ac5f7616-3a2f-48cd-a17b-dc23b3aae7ea --- docs/INTERVIEW_PREP_GUIDE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/INTERVIEW_PREP_GUIDE.md b/docs/INTERVIEW_PREP_GUIDE.md index a0433ac..89905f0 100644 --- a/docs/INTERVIEW_PREP_GUIDE.md +++ b/docs/INTERVIEW_PREP_GUIDE.md @@ -33,7 +33,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* - *How*: “I treat the build as a product—strict flags, reproducible targets, and a `check` target for CI.” - **`Dockerfile`** - - *What*: Two-stage build; compiles/tests in `gcc:11-bullseye` then ships minimal `debian:bullseye-slim` with non-root user. + - *What*: Two-stage build; compiles/tests in `gcc:11-bullseye` (same tag as `FROM gcc:11-bullseye AS builder` in the Dockerfile) then ships minimal `debian:bullseye-slim` with non-root user. - *Why*: Guarantees toolchain parity and small runtime surface; security via non-root execution. - *How*: “I bake tests into the image build so bad code can’t ship, and I drop privileges in the runtime stage.” @@ -146,7 +146,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* --- ## Metrics & Proof Points -- Queue throughput: **~400–465K items/sec** on GitHub runners (2 producers/2 consumers, 100 items per producer = 200 total items). +- Queue throughput: **~400–475K items/sec** on GitHub runners using the default `queue_test` settings (2 producers/2 consumers, 50 items per producer = 100 total items). - Warnings-as-errors: `-Wall -Wextra -Werror`, `-O2`. - Tests: `make test` (queue harness), `make check` (build + test), CI mirrors these. - Security: Non-root container runtime; no `system()` calls—uses `execvp` directly. From e696a0769ca281b49e64efcdda9b9279a1d8714a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:00:13 +0000 Subject: [PATCH 4/7] align throughput metrics and simplify docker note Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/ac5f7616-3a2f-48cd-a17b-dc23b3aae7ea --- docs/INTERVIEW_PREP_GUIDE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/INTERVIEW_PREP_GUIDE.md b/docs/INTERVIEW_PREP_GUIDE.md index 89905f0..d870af1 100644 --- a/docs/INTERVIEW_PREP_GUIDE.md +++ b/docs/INTERVIEW_PREP_GUIDE.md @@ -5,9 +5,9 @@ Copy-paste this into a Word doc and keep the headings; each section states **wha --- ## 30-Second Pitch (say this first) -- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ~400K items/sec using per-consumer condition variables.” +- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ~400–475K items/sec using per-consumer condition variables.” - **Why**: “I wanted to demonstrate production-grade systems fundamentals—process lifecycle, signals, and concurrency—without hiding behind frameworks.” -- **How to say it**: Confident, concise, end with a number (“~400K items/sec”) and a principle (“correctness before features”). +- **How to say it**: Confident, concise, end with a number (“~400–475K items/sec”) and a principle (“correctness before features”). --- @@ -33,7 +33,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* - *How*: “I treat the build as a product—strict flags, reproducible targets, and a `check` target for CI.” - **`Dockerfile`** - - *What*: Two-stage build; compiles/tests in `gcc:11-bullseye` (same tag as `FROM gcc:11-bullseye AS builder` in the Dockerfile) then ships minimal `debian:bullseye-slim` with non-root user. + - *What*: Two-stage build; compiles/tests in `gcc:11-bullseye` then ships minimal `debian:bullseye-slim` with non-root user. - *Why*: Guarantees toolchain parity and small runtime surface; security via non-root execution. - *How*: “I bake tests into the image build so bad code can’t ship, and I drop privileges in the runtime stage.” @@ -183,5 +183,5 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* ## Last-Minute Checklist Before Interview - Run `make check` locally (mirrors CI). - Skim `myshell.c` signal blocks and `queue.c` wait-path to refresh wording. -- Keep the throughput number ready (~400–465K items/sec) and the O(1) wakeup story. +- Keep the throughput number ready (~400–475K items/sec) and the O(1) wakeup story. - Prepare one improvement you’d ship next (job control or bounded queue). From a1fa24b6642cfb04af86e6627d2f7048a409d8b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:01:15 +0000 Subject: [PATCH 5/7] standardize throughput phrasing Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/ac5f7616-3a2f-48cd-a17b-dc23b3aae7ea --- docs/INTERVIEW_PREP_GUIDE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/INTERVIEW_PREP_GUIDE.md b/docs/INTERVIEW_PREP_GUIDE.md index d870af1..9e0b80f 100644 --- a/docs/INTERVIEW_PREP_GUIDE.md +++ b/docs/INTERVIEW_PREP_GUIDE.md @@ -5,9 +5,9 @@ Copy-paste this into a Word doc and keep the headings; each section states **wha --- ## 30-Second Pitch (say this first) -- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ~400–475K items/sec using per-consumer condition variables.” +- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ≈420K items/sec (400–475K range) using per-consumer condition variables.” - **Why**: “I wanted to demonstrate production-grade systems fundamentals—process lifecycle, signals, and concurrency—without hiding behind frameworks.” -- **How to say it**: Confident, concise, end with a number (“~400–475K items/sec”) and a principle (“correctness before features”). +- **How to say it**: Confident, concise, end with a number (“≈420K items/sec, 400–475K range”) and a principle (“correctness before features”). --- @@ -146,7 +146,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* --- ## Metrics & Proof Points -- Queue throughput: **~400–475K items/sec** on GitHub runners using the default `queue_test` settings (2 producers/2 consumers, 50 items per producer = 100 total items). +- Queue throughput: **≈420K items/sec (observed 400–475K range)** on GitHub runners using the default `queue_test` settings (2 producers/2 consumers, 50 items per producer = 100 total items). - Warnings-as-errors: `-Wall -Wextra -Werror`, `-O2`. - Tests: `make test` (queue harness), `make check` (build + test), CI mirrors these. - Security: Non-root container runtime; no `system()` calls—uses `execvp` directly. @@ -183,5 +183,5 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* ## Last-Minute Checklist Before Interview - Run `make check` locally (mirrors CI). - Skim `myshell.c` signal blocks and `queue.c` wait-path to refresh wording. -- Keep the throughput number ready (~400–475K items/sec) and the O(1) wakeup story. +- Keep the throughput number ready (≈420K items/sec, 400–475K range) and the O(1) wakeup story. - Prepare one improvement you’d ship next (job control or bounded queue). From 230e7c5ba2e9b21a451a49a5f978214d99c952c9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:01:57 +0000 Subject: [PATCH 6/7] clarify throughput references and workload basis Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/ac5f7616-3a2f-48cd-a17b-dc23b3aae7ea --- docs/INTERVIEW_PREP_GUIDE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/INTERVIEW_PREP_GUIDE.md b/docs/INTERVIEW_PREP_GUIDE.md index 9e0b80f..b88f76d 100644 --- a/docs/INTERVIEW_PREP_GUIDE.md +++ b/docs/INTERVIEW_PREP_GUIDE.md @@ -5,9 +5,9 @@ Copy-paste this into a Word doc and keep the headings; each section states **wha --- ## 30-Second Pitch (say this first) -- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ≈420K items/sec (400–475K range) using per-consumer condition variables.” +- **What**: “I built a minimal shell and a high-throughput thread-safe queue in C11. The shell wires pipelines with proper signal semantics; the queue hits ≈420K items/sec (400–475K range—see Metrics section) using per-consumer condition variables.” - **Why**: “I wanted to demonstrate production-grade systems fundamentals—process lifecycle, signals, and concurrency—without hiding behind frameworks.” -- **How to say it**: Confident, concise, end with a number (“≈420K items/sec, 400–475K range”) and a principle (“correctness before features”). +- **How to say it**: Confident, concise, end with the throughput metric above (≈420K items/sec, 400–475K range) and a principle (“correctness before features”). --- @@ -146,7 +146,7 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* --- ## Metrics & Proof Points -- Queue throughput: **≈420K items/sec (observed 400–475K range)** on GitHub runners using the default `queue_test` settings (2 producers/2 consumers, 50 items per producer = 100 total items). +- Queue throughput: **≈420K items/sec (observed 400–475K range)** on GitHub runners using the default `queue_test` workload (per test run: 2 producers/2 consumers, 50 items per producer = 100 total items; throughput = visited() / elapsed). - Warnings-as-errors: `-Wall -Wextra -Werror`, `-O2`. - Tests: `make test` (queue harness), `make check` (build + test), CI mirrors these. - Security: Non-root container runtime; no `system()` calls—uses `execvp` directly. @@ -183,5 +183,5 @@ Use these bullets verbatim with recruiters. Each entry includes **What**, **Why* ## Last-Minute Checklist Before Interview - Run `make check` locally (mirrors CI). - Skim `myshell.c` signal blocks and `queue.c` wait-path to refresh wording. -- Keep the throughput number ready (≈420K items/sec, 400–475K range) and the O(1) wakeup story. +- Keep the throughput number from Metrics handy (≈420K items/sec, 400–475K range) and the O(1) wakeup story. - Prepare one improvement you’d ship next (job control or bounded queue). From 60c150517014aec00ff9e5c573c662f82083d202 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:21:41 +0000 Subject: [PATCH 7/7] Provide downloadable DOCX for INTERVIEW_PREP_GUIDE Co-authored-by: odeliyach <171728738+odeliyach@users.noreply.github.com> Agent-Logs-Url: https://github.com/odeliyach/Linux-System-Programming/sessions/da6bf966-7f70-4386-9031-2cfeef83f9fc --- INTERVIEW_PREP_GUIDE.docx | Bin 0 -> 42674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 INTERVIEW_PREP_GUIDE.docx diff --git a/INTERVIEW_PREP_GUIDE.docx b/INTERVIEW_PREP_GUIDE.docx new file mode 100644 index 0000000000000000000000000000000000000000..8b740e9994dd9afede4457ac92d736c6a014a100 GIT binary patch literal 42674 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 O1I*#-@u2YMzyAZCG|s93 literal 0 HcmV?d00001