This course explores the art and methods of systems programming. Practically speaking, lectures and course assignments will provide students experience programming in C within the UNIX environment. UNIX tools will be introduced, as will the general UNIX philosophy. Fluency in use of the command line will be encouraged and expected, as will canonical compiler tools such as gcc. We will examine the use of shell programs, compilers, build sequences, memory management, filesystems, signal processing, parallel programming, and other topics essential to computer scientists. In addition, we will introduce students the basics of systems administration on UNIX virtual machines.
There are several themes of the course:
- Understand computer systems, especially low-level influences on high-level goals. This includes the machine-level representation of programs and data structures; the memory hierarchy and its impact on performance; access to stored information via file systems, and access to other computer systems via networks.
- Understand existing system software and software standards, especially the UNIX toolset. This includes preparing a program (editors, static analysis, development environments); running a program (compilers and interpreters, assembler, linker, loader, debugger, profiler, tracer); controlling parts of a program (memory management, threads); communication between programs (within one system using signals, between systems using sockets and communication protocols); and combinations of software tools with scripting languages.
- Understand real code, such as selections from the Linux operating system kernel and GNU utilities and libraries, and through comparative selections from Solaris, Linux, and Mac OS X.
- Understand system performance, including experiments on program performance and optimization techniques.