The goal of this course is to help you understand the operating system, one of the most important pieces of software that almost all programs interact with.
Each module covers both the conceptual foundations and practical aspects for software engineers. You will write small programs and analyze: "How does the operating system do this? How do my knowledge explain the program's behavior?" By the end of each module, you will have a better understanding of operating systems and discover new ways to make programs more efficient and secure.
The core of the course consists of tasks on each topic. We recommend solving them independently, using ready-made solutions and additional explanations as needed. Although a textbook is not mandatory, we highly recommend "Operating Systems: Three Easy Pieces" ("OSTEP") as a supplement and indicate the chapters for reading alongside the tasks. We also suggest additional resources from the book "Computer Systems: A Programmer's Perspective" if you have a copy, as well as other useful materials.
Most of the topics we discuss are applicable to all operating systems, but where necessary, we will focus on Unix family operating systems, particularly through the lens of GNU/Linux, which we recommend running as a virtual machine if needed.
Important: We strongly recommend completing a course on computer systems or its equivalent before this course. Many subjects, such as basic computer architecture and knowledge of the C language, are considered fundamental.