Operating Systems (OS) are as a software system ubiquitous, although they are barely "visible". Most applications require the presence of the OS software layer to manage hardware resources and share them in a fair and just fashion across the multuitude of applications that utilize these resources in both time and space. Without the presence of OSs, application development will be a tedious and cumbursome task, where every programmer required to manage these resouces, themselves. OS development is a herculean software engineering effort, where the implementations not only have to be just, but also have high performance. As a result, OS design and development is something that not only requires the knowledge of underlying hardware but also of good software engineering design practices.
This course will provide an understanding of the underlying concepts of contemporary Operating Systems. You will learn about the history of OSes as well as the design pronciples behind modern Operating Systems including Unix, Linux, FreeBSD and the likes. Some other topics that will be covered include the concepts of Processes and Threads, Memory Management including Virtual Memory and Address Translations. The course will introduce you to underlying concepts of Concurrency and Synchronization and other related topics like Race Conditions, Locks and Semaphores. Finally, you will also learn about I/O systems including HDDs and SSDs as well as in-depth introductions to File System implementations and introduction to Virtualization techniques.
The course will also help you develop an appreciation for design and implementation of operating systems via a number of hands-on, rigorous programming excercises. The course will require significant programming effort from the enrolled students and will have a laboratory component.