Processes and threads
Run a small program twice and inspect its process IDs. Compare independent process memory with threads sharing one address space. Explain how scheduling allows multiple tasks to make progress, and distinguish a program waiting for input from one actively using a processor.
Memory and virtual addresses
Trace a variable from source code to a process address space. Study stack, heap and virtual memory before page replacement algorithms. Use a bounded allocation experiment to observe memory growth, without exhausting a shared or production machine.
Concurrency and deadlocks
Create a counter updated by two threads, observe a race and protect it with a lock. For deadlock, draw a resource wait graph and identify a circular dependency. Compare prevention through a fixed lock ordering with detection after a cycle forms.
Files and practical revision
Practice file permissions, directory traversal and process inspection in a disposable workspace. Explain why a file descriptor differs from a filename. Submit a short lab log covering process states, synchronization and file access failures, then connect each observation to its operating-system concept.
Operating systems lab: trace a blocked task
Run a program that waits for standard input and compare it with a program performing a bounded computation. Observe process states using your operating system's process viewer. Then redirect input from a file and explain why the waiting behaviour changes. Do not terminate unrelated processes. Record the commands, process IDs and observations in a lab notebook, and explain the difference between waiting for an event and consuming CPU time.
Check your progress
Keep your working files, test cases and notes together. Explain one design decision, demonstrate a failure case and list what you would improve next. These concrete outputs make it easier to identify the next skill to practice.