Operating Systems and C
Course info
Programme
Staff
Course semester
Exam
Abstract
This hands-on course teaches you how the design, implementation, and implications, of systems software influence your task as an application programmer. You will get an in-depth understanding of how hardware and the operating system work; in the process, you will learn how computers actually work, and what actually happens when you run an application. This enables you to fully exploit underlying hardware and systems software to write high-quality software.
Description
Behind every running application, there is systems software: software that provides a platform for other software. Examples include operating systems, scientific computing software, game engines, industrial control systems, and software as a service (SaaS). To write quality software that is e.g. correct, high performance, energy efficient, and exploiting hardware features, an application developer must understand how systems software affects the behavior and performance of applications---they must understand the design, implementation, and implications, of systems software.
In this course, you study the most important systems software, using the most important systems programming language: Operating Systems, and C. You gain a deeper understanding of hardware, how it runs software at the lowest level (Assembly), and how high-level (C) code compiles (gcc) to low-level machine code. You get hands-on experience with the compilation process, build automation (make), and with debugging machine code (gdb). Finally, using C, you gain hands-on experience with buffer overflow vulnerabilities, high-performance programming utilizing compiler optimizations and hardware features (e.g. SIMD and multithreading), and with system calls (e.g. file- and network I/O). To facilitate this, you will learn about the three fundamental computer system abstractions (interpreter, memory, communication), the fundamental operating system concepts (processes, virtual memory, files), other key systems concepts (caching, pointers, stack, heap, interrupt signals, file systems, concurrency), and how to use an operating system (shell, scripting, command-line, process management, etc.).
By taking this course, you gain a deep understanding of how computers work. This understanding is crucial for pursuing a career in writing quality software for top software companies, for embedded systems programming, and for programming cloud-based big data systems (think Google, Amazon, Microsoft, Samsung, etc.). Students who have the ambition to contribute to the Linux kernel, or to other open-source projects, will gain a strong foundation for that in this course.
Ultimately, the goal is to enable you to fully exploit underlying hardware and systems software to write high-quality software.
Formal prerequisites
Before taking this course, you must
- Have experience with an imperative programming language.
This requirement can be satisfied by taking an introductory programming course on e.g. Java, C#, Python, JavaScript, C, or C++.
Intended learning outcomes
After the course, the student should be able to:
- Read, write and debug C programs in a shell-environment
- Interpret how C programs execute on a computer system
- Describe basic system programming concepts in C (I/Os, network programming, concurrent programming)
- Reflect on the impact of hardware, operating system and compilation process on application programs
- Design and implement cache efficient matrix multiplication
Ordinary exam
Exam type:C: Submission of written work, External (7-point scale)
Exam variation:
C11: Submission of written work