Course 3 - Graduate Operating Systems

    CS 6200 · Difficulty: 5/5

    Brief Overview

    This course focuses on understanding how operating systems are able to abstract and arbitrate the use of a computer system. In general it sits between managing user applications, hardware, and managing systems despite the complexity and diversity of hardware components.

    In addition the course dives into three major projects that teach concepts on the following ideas:

    Detailed Overview

    Project Overview

    Class was broken into two parts: Lectures and Projects.

    Project 1: Multi-Threaded GETFILE Protocol

    This project involved implementing a custom file transfer protocol and building a multi-threaded client-server system in C. The main technologies used were C programming, pthreads, TCP sockets, mutex/condition variables, file I/O, protocol design.

    Multi-threaded Server

    Multi-threaded Client

    Difficulty: 5/5

    Summary: If you're new to C Programming this will be quite difficult. It's a great project and will teach a lot through trial and error.


    Project 3: Inter Process Communication (No Project 2)

    This project builds on Project 1 by converting the getfile server into a proxy server with caching capabilities using IPC mechanisms. The main technologies used were C programming, libcurl, POSIX shared memory, POSIX message queues, semaphores, and process synchronization.

    Part 1: Proxy Server with libcurl

    Goal of part 1 is to convert the getfile server into a proxy server that translates GETFILE requests into HTTP requests for remote servers.

    Part 2: Cache Daemon with Shared Memory IPC

    Goal of part 2 is to implement a separate cache process that communicates with the proxy across process boundaries, avoiding network requests for cached files.

    Key concepts in this project were designing an IPC protocol from scratch, semaphore-based producer-consumer synchronization across processes rather than threads, and debugging race conditions and deadlocks that only appear under concurrent load. Unlike Project 1, a mistake here can leave stale IPC resources on the system requiring manual cleanup.

    Difficulty: 5/5

    Summary: The hardest project of the course for me. Debugging semaphore state across two separate processes is a completely different experience from debugging threads, and tools like AddressSanitizer only get you so far. Getting the segment pool and cleanup logic right took significant trial and error, but it's the project where synchronization concepts finally clicked.


    Project 4: gRPC Distributed File System

    The final project moves from IPC on a single machine to a distributed file system (DFS) across a network, in the style of AFS. The main technologies used were C++, gRPC, Protocol Buffers, HTTP/2, inotify, and multi-threaded asynchronous services.

    Part 1: gRPC Service Basics

    Goal of part 1 is to build the RPC layer for basic file operations between client and server.

    Part 2: Synchronized Cache Consistency

    Goal of part 2 is to keep multiple clients' local caches consistent with the server using a weakly consistent model similar to AFS.

    Key concepts in this project were RPC-based distributed system design, cache consistency models, streaming data over HTTP/2, and coordinating concurrency both within the client (threads) and across the system (distributed locks).

    Difficulty: 4/5

    Summary: More conceptually interesting than brutally difficult — gRPC handles the low-level networking that Project 1 made you build by hand, so the challenge shifts to the consistency logic. The feedback loop between inotify events and sync operations is the classic gotcha. A satisfying capstone that ties together threading, networking, and protocol design from the whole course.