Official course description:
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.
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.
Before taking this course, you must
- Have experience with an imperative programming language.
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
Lectures and exercise sessions.
The lectures present the background, theory, and methods needed for achieving the intended learning outcomes, thus facilitating reflection and discussion. The exercise sessions are a mix of problem solving, group work, student presentations, debates, and peer-to-peer feedback, intended to foster active learning.
The assignments are designed to help you realize how programs execute and are managed by operating systems, so you can exploit this knowledge to write secure, high-performance programs.
Deadlines are evenly distributed over the semester. We provide written feedback to your assignment submissions, provided you submit them on-time; you will not receive feedback on late-submission.
To qualify for the exam, each of your assignments must be approved. If an assignment is not approved, you will be allowed to re-submit the assignment once. The deadline for the resubmission is one week after you receive the notification for the not-approved submission.
Finally, here is ITU's policy on mandatory activities:
The student will receive the grade NA (not approved) at the ordinary exam, if the mandatory activities are not approved and the student will use an exam attempt.
The course literature is published in the course page in LearnIT.
Student Activity BudgetEstimated distribution of learning activities for the typical student
- Preparation for lectures and exercises: 20%
- Lectures: 20%
- Exercises: 20%
- Assignments: 40%
Ordinary examExam type:
C: Submission of written work, External (7-point scale)
C11: Submission of written work
The exam is a take-home exam. It takes 3 days of work to complete, and you will have ca. 3 weeks to complete it. The exam consist of questions based on the mandatory assignments from the semester. Your answers must be in PDF format, at most 8 pages long (excluding front page, table of contents, references, and appendix), in a Times-like font, 11pt font size, single line spacing.
To prevent fraud, SAP will randomly select 20% of students for a short validation discussion, after the exam is submitted (aka. "snydtjek"). The goal of the discussion is to render probable that the student worked alone on the hand-in. This takes ca. 5 minutes per student. The validation discussion does not influence the grade; its only purpose is to discover possible exam fraud.
B: Oral exam, External (7-point scale)
B1H: Oral exam with time for preparation. Home.
Time and dateOrdinary Exam - submission Tue, 12 Dec 2023, 08:00 - 14:00
Reexam Mon, 18 Mar 2024, 12:00 - 20:55
Reexam Tue, 19 Mar 2024, 09:00 - 20:55
Reexam Wed, 20 Mar 2024, 09:00 - 20:55