Dr. Douglas Niehaus
Teaching Information


Fall 2009 Semester

EECS 678: Introduction to Operating Systems

The objective of this course is to provide the students with the concepts necessary to enable them to:

  1. identify the abstract services common to all operating systems,
  2. define the basic operations and system components that support the operating system's machine independent abstractions on particular target architectures,
  3. consider how the design and implementation of different system components interact and constrain one another, and
  4. understand the means by which fundamental problems in operating systems can be analyzed and addressed.

The course will consider the subsystems of a generic operating system, the problems driving the design and implementation of each subsystem, and how the properties of each subsystem interact with other components of the system. This will include discussion of: the process abstraction, concurrency control and process synchronization, address space management, process scheduling, resource management, file system implementation, interprocess communication, security and protection, device drivers, networking, and more advanced topics as time allows.

EECS 753: Embedded and Real Time Computer Systems

This course will consider issues influencing established, emerging, and proposed techniques for design and implementation of embedded and real time computer systems. Topics will include how characteristics of specific real-time and embedded application domains influence system hardware architecture, system software architecture, system services, application programming models, program development tools, and performance evaluation. The course will examine new techniques required by emerging application domains as well as current techniques for established application domains.


Undergraduate Classes

EECS 678: Introduction to Operating Systems

The objective of this course is to provide the students with the concepts necessary to enable them to:
  1. identify the abstract services common to all operating systems,
  2. define the basic operations and system components that support the operating system's machine independent abstractions on particular target architectures,
  3. consider how the design and implementation of different system components interact and constrain one another, and
  4. understand the means by which fundamental problems in operating systems can be analyzed and addressed.

The course will consider the subsystems of a generic operating system, the problems driving the design and implementation of each subsystem, and how the properties of each subsystem interact with other components of the system. This will include discussion of: the process abstraction, concurrency control and process synchronization, address space management, process scheduling, resource management, file system implementation, interprocess communication, security and protection, device drivers, networking, and more advanced topics as time allows.

EECS 448: Software Engineering I

The objective of this course is to address a range of issues associated with the design and implementation of software systems. The emphasis is on the software engineering aspects of the problem, many of which only arise in the context of larger scale software. As an extreme example, software projects involving thousands, or hundreds of thousands, of lines of code which are developed by a group, or groups, of programmers require management techniques which are completely unnecessary for a single programmer implementing a few hundred lines of code.

The course will address sets of tools and practices which have been developed to aid programmers programming for real projects in real situations, as well as the doctrine and procedures associated with the classical software engineering stages: requirements, specification, design, implementation, and maintenance. Since many aspects of software engineering doctrine are expressed at an abstract level, the class will also provide an opportunity to see how the abstract ideas are put into practice by applying them to the semester project within the software development environment supported by the department UNIX systems.

EECS 665: Compiler Construction

The objectives of the course are two-fold. The obvious goal is to introduce the student to the basics of compiler construction, including: compilation of simple expressions and statements, symbol table organization, lexical scan, syntax scan, assembler code generation, error diagnostics, basic code optimization techniques, and run-time support for a block structured language such as PASCAL or C.

The second objective is to expand the student's understanding of standard programming environment tools and their interaction with the system compiler. The student should, for example, finish the class with a reasonably clear idea of how to use compiler writing tools (Lex and Yacc) to process command line or descriptive languages used as part of an application's interface. The students should also have a reasonable understanding of how the information provided by the compiler is used during the linking of executable programs, during debugging under GDB or other source-level debuggers, and how the code produced by compilation is used by the operating system to create a process running the program.


Graduate Classes

EECS 750: Advanced Operating Systems

The objective of this course is to consider advanced topics in operating systems and systems programming. Some of the topics addressed by the class will cover topics considered in EECS 678, the introductory OS class, in considerably greater detail, while coverage of new topics will broaden the student's perspective and understanding of the subject matter. Much of the class studies the Linux kernel implementation and source code. Class exercises include building Linux kernels, instrumenting them for performance evaluation, and lernaing how to write a simple device driver. The class also reads papers drawn from current and classic research in multiprocessor and distributed systems to see how the basic concepts introduced in 678 are extended and generalized in new situations.

EECS 850: Advanced Operating Systems Topics

EECS 800: Topics