Posts

Showing posts from August, 2025

Final Week - CST 334

 During this class, I gained a deeper understanding of how operating systems work, including managing resources and preventing issues when processes are running. One big takeaway was learning about memory management with concepts like paging, segmentation and TLB. Scheduling policies like Round Robin and Shortest Job next helped me understand how overall system performance can be affected by how we choose to allow processes to be completed.  Concurrency and synchronization were also interesting topics to learn about because real issues can arise when processes are allowed to run when they shouldn't. For example, multiple processes may be able to access the same data at the same time which can cause data loss, system corruption and greater overhead.  One of the biggest challenges I encountered was learning the scheduling algorithms as they can become convoluted with which process is allowed to run next. Many times, the explanation of an algorithm would seem straight forwar...

Week 7 - CST 334

  This week, I learned how operating systems manage I/O devices, storage, and file systems in a way that balances efficiency, performance, and reliability. I also learned how I/O devices connect to the system through different buses, and how the CPU communicates with them using registers, interrupts, and techniques like direct memory access to reduce overhead . I also learned about the structure and behavior of hard disk drives, including how platters, tracks, and sectors work together, and how factors like seek time, rotational delay, and caching affect access speed. I also learned the basic file system interface, learning how files and directories are organized, named, and accessed through system calls like open(), read(), write(), and lseek(). Finally, I learned about the internal design of a simple file system, including how data blocks, inodes, bitmaps, and the superblock work together to store both user data and file metadata efficiently.

Week 6 - CST 334

 This week we learned about condition variables and how they are used to let threads sleep more efficiently. Specifically, wait() and signal() are used to released the lock and and signal a thread to wake up and start spinning. We also learned about semaphores which are synchronization primitives used to control access to shared resources in concurrent programming. A thread can be blocked or woken up by decreasing or increasing the integer value of the semaphore. The value dictates what the thread will do: a negative value will block the thread and increasing it will wake up another. In a binary semaphore, the value is either 0 or 1, which is used to ensure mutual exclusion so only one thread has access to resources. A counting semaphore has a value that is at least 0 or higher. This allows multiple threads to access a resource at a time. In a bounded buffer, producers put threads in while consumers take them out. We also learned about the possibility of deadlocks, where multiple t...