This course is a required sophomore/junior-level Computer Science course. It
covers the fundamental concepts underlying the design
and implementation of computing systems.
The philosophy underlying the design of this course is that students
should be familiarized with problems that reoccur in software systems,
and should be acquainted with the set of classical algorithms/techniques for
solving such problems. In particular, it is important to develop the
ability to recognize standard problems in different wordings and
within unusual context, and match them with appropriate solutions.
Rigorous treatment of invariant concepts, algorithms, and performance
evaluation methods underlying computing systems design. Topics
include modeling and analysis of concurrent processing, computational
resource scheduling and consumption, and performance evaluation
CS-112 and CS-210: Programming
and basic software/hardware interface concepts.
CS-131 or CS-237: Elements of discrete and continuous
Recommended Follow-up Courses:
The following courses build on knowledge assimilated in CS-350. They are
natural follow-up courses in decreasing order of relevance (more or less).
CS-451: Distributed Systems and Cloud Computing
CS-552: Introduction to Operating Systems (and CS-553
as a follow-up to that)
CS-455: Introduction to Networking (and CS-556 or CS-559
CS-470: Performance Evaluation and Modeling
of Computing Systems and Networks
CS-410: Software Systems and Systems programming
CS-460: Introduction to Database (and
CS-562 or CS-565 as follow-ups)
CS-450: Introduction to Computer Architecture (and CS-550
Function in the Curriculum:
As a core undergraduate course, CS-350 does not focus on particular
implementations or specific technologies. On the contrary, it
stresses the fundamental concepts and basic algorithms that have
survived (and are likely to survive) the evolution of computer
software systems in general, and operating systems in particular.
This course is significantly different in purpose and coverage from
CS-210 (Computer Systems) and CS-410 (Software Systems). CS-210 and CS-410 introduce computer systems
to sophomores using a hands-on approach by examining the "mechanics" and/or the
"plumbing" of modern (or typical) computer operation through exposure to various
interfaces between architecture, compilers, loaders, linkers, and
run-time systems. CS-350 does not focus on a particular interface or
a particular technology, rather it deals with fundamental notions and
algorithms that are common to computing systems in general and
to software systems in particular.
This course is required or strongly recommended for the following advanced
courses: CS-552 (Advanced Operating Systems), CS-550 (Advanced Computer Architecture),
CS-551 (Parallel Computing Architectures and Models), CS-455/655 (Data
Communications), CS-460/660 (Databases), and CS-470/670 (Performance
Analysis). In that respect, this course
covers basic notions that we expect students (graduates and
undergraduates alike) enrolling into these classes to have
mastered. For example, it is inconceivable that a student who is
interested in taking a database or an operating systems class, not to
have been exposed to the notion of concurrent processing and mutual
exclusion. Similarly, it is unconceivable for a student
enrolled in a networking, database, or operating systems class, not to
have been exposed to performance analysis using simple queuing
systems, for example.
The topics covered in this class could be grouped under 3 general
Performance Analysis and Evaluation (including a crash introduction to
Scheduling and Resource Management
Concurrency and Synchronization
The first half of the semester will be devoted to the coverage of the
first two of the above themes, whereas the second half of the semester
will be devoted to the coverage of the third of the above themes.