This is an undergraduate course on computer operating systems. (Although this course is for graduate students! USC undergraduate students must take CS 350 in order to get credit for OS. If you are an undergraduate student, you cannnot be in this class!) In addition to exploring concepts such as synchronization, virtual memory, processes, file systems and virtualization, students will develop elements of a fairly complete operating system during the course of the summer session.

My actual CS 402 class web site for Summer 2020 is not ready yet. Since many students are registering now, I felt that I should post some important rules about my sections so students can know what to expect and register accordingly. I tend to be a stickler to rules, so there will be no exceptions. The rules are not just for students. I'm bound by my own written rules and I have to stick to them.

Someone students don't understand why I am so strict with rules. Some think that it's just a power trip for me. The reason for sticking to rules is that I have the responsibility of treating all students fairly! If I apply one rule to one student and don't apply the same rule to another student, I think that's totally unfair. I think fairness is very important. Without fairness, grades have no meaning. The only way I know how to be fair is to have rules that are written down clearly and stick to all the written rules. When you ask me to bend a written rule for you, please understand that you are asking me to be unfair to all other students; and therefore, I will not bend the rule for you.


  • I do not sign D-clearances and I will not sign anything to put one student ahead of everyone else. Please see your adviser to get your D-clearance.
  • I heard that there is a Viterbi policy that non-CS masters students cannot take a CS class during their first year at USC. I do not know if this rule is in effect or if this rule is applicable to you during the summer. Please understand that I will not waive this rule for anyone. Please see your adviser if you want to know if this rule applies to you this summer.
  • If you are on the wait list and is concerned about whether you will eventually get your D-clearance, I can only suggest that you wait it out. Typically, some students would drop the course before the drop deadline. So, if you stay on the wait list, there is a reasonable chance that you will get in (although I cannot make any guarantees). According to the schedule of classes, the last day to add this course is 6/4/2020 (6/4/2020 for the "remote DEN" section, i.e., section section 29920D). Please also see your responsibility if you register late for this course.

Computer Equiptment

  • Our kernel assignments will only run on Ubuntu 16.04 (and starting with this summer, all other programming assignments must run on the same platform). The best way to run Ubuntu 16.04 is to install it inside a virtual machine. The virtual machine of choice for this class is Oracle's VirtualBox. It's free and it runs on both Windows and Mac OS X. You should have a desktop/laptop that runs Windows or Mac OS X (we do not recommend using a machine that runs the ChromeOS or another Linux OS) and it should have at least 4GB of memory and its CPU should be Intel Core i3 or faster. If you do not have a machine that meets the requirement, please contact the instructor as early as possible to figure out your options.


  • If you are officially auditing this course (i.e., register for this course under the no-grade option), you will get the same course materials as everyone else. However, you will not be permitted to form or join a team with students who are taking this course for grades to do the kernel assignments.

  • If you want to audit this course unofficially, I will have to say no to you.


  • This class is very demanding and the last programming assignment is extremely difficult and very very time-consuming. The coverage of this class is very vast. There is really no time for me to explain every topic to the point where every student in the class understands everything perfectly because we have to move along quickly to get you ready for the programming assignments. So, please do not expect "spoon feeding" in this class and you need to be prepared to figure things out on your own. Of course, you are welcome to come talk to me about anything related to the course material and programming assignments, so you are not completely on your own.

    You will also be expected to learn certain things completely on your own.

    This class can also be very rewarding. If you work super hard for 11 weeks and implement all the programming assignments yourself, you will realized that you have learned so much when the course is over.

Students with a Full-time Job

  • As I mentioned above, this class is very demanding. But it is even more demanding for students who have a full-time job. This class is shorter (11 weeks long) in the summer but it has exactly the same workload as in a regular semester. For a full time student, this is probably the only class he/she would take during the summer. So, the workload would be manageable. For a student with a full-time job, this class would be considerably more difficult to manage in the summer.

    If you have a full-time job, you need to prepare to spend all your free time on this class. Please understand that I cannot treat you differently because you have a full-time job.

Class Google Group

  • We will use a Google Group for class related communications. The class Google Group is an important tool. Everyone must be a member of the class Google Group I will explain how to get on the class Google Group during Lecture 1.

Kernel Teams

  • Up to 4 students per team will be permitted but no more. You can form a kernel team with students registered in any section. Please understand that to be fair to all, I cannot get involved in putting teams together. You are completely on your own to form teams. If you have issues with your teammates, there is nothing the instructor can or will do. You have to choose your teammates very carefully.

    I strongly recommend that you work with (but not copy code from each other) your potential teammates during the beginning of the summer sessions. Once you like each other and feel that you can trust each other, you can commit to be in the same team. I would strongly urge you not to form a team with someone you have never worked with (unless you are willing to let them have a free ride).

    You can also work on the kernel assignments by yourself. It's do-able if you are a good programmer who knows C well and are good at debugging. Otherwise, you need to get good at programming and debugger fast!

  • Since the class is now completely online, it would be more difficult to meet classmates and work together. But I think we need to adapt. Also, when you work at a job in the real world, you may have to work with people that you have never met before and remotely. It's good to acquire the skill now. Learn Zoom and how to host a meeting and participate in a productive meeting. Also, learn to be courteous and professional at all times, just like in the real business environment. Please feel free to use the class Google Group to form groups and recruit team members.

Late Registration

  • Even though you are on the wait list and there is no guarantee that you will get in, if you intend to take this class, you are expected to attend every lecture and submit all assignments on time (i.e., same deadlines as students who are already registered). So, even if you get registered after warmup #1 deadline, you will still be expected to turn in warmup #1 by the end of Tuesday of the 3rd week of classes! For all the assignment submission dates, please see the bottom of this web page.


  • The prerequisites for this class are (1) CSCI 201L or CSCI 455x, and (2) EE 357 or EE 352L. But prerequisites are only enforced for undergraduate students. For grad students, they are turned into "recommended preparation". The way to interprep these recommended preparation is that you should know how to program and you should know what's inside a processor/CPU and how it works (i.e., how a CPU executes machine instructions).

    Some people mistakenly think that this is an introductory class! With the above prerequisites, how can this be an intro class?!

  • The programming assignments of this class will be very demanding (kernel 3 will be extremely difficult and very very time-consuming). You will be required to write C code. Since C is a proper subset of C++, knowing C++ well would give you enough background. However, some of the things that available in C++, such as strings and streams, are not be available in C. So, you need to know how to do things such as manipulating C-strings (i.e., null-terminated array of characters) using functions such as strchr, strrchr, strlen, strcmp, strncpy, etc. You also need to know how to perform console and file I/O in C using functions such as read/write, printf/snprintf, fread/fwrite, fgets, etc. No other programming language will be accepted. We will not teach C in this class. You are expected to pick up C on your own if you are not familiar with it.

    If you are not good with programming in C and you want to get prepared for this class, you can start by implementing some basic data structures and algorithms. For example, read a file of integers, sort them in a linked list, and sort the linked list using selection sort, bubble sort, insertion sort, merge sort, and quick sort is a good place to start. To practice file I/O and string manipulation, you can change the file of integers to lines of text and parse the lines into fields (e.g., separated by semi-colons or tabs) then sort the lines based on a particular field and print the sorted records. You must understand what a memory address is and what it means to store the address of a data structure into a pointer data type (e.g., in forming a linked list). You then need to be able to follow pointers to traverse a linked list. Please take a look at my review on pointers and make sure you understand everything there. Finally, you need to learn to use gdb to examine memory locations and debug your program.

    If you have taken CSCI 455x but feel that you need some background in data structures and algorthms, I would recommend that you take an online class such as this Data Structures class at (I think you have to pay to get the programming assignments, but you can audit the class for free; also, I have never taken this class, but the syllabus sounds right).

  • You must know how to use Unix/Linux. If you are not familiar with Unix/Linux, you must learn it on your own. We will not teach you how to use Unix/Linux in this class. If you are not familiar with Unix/Linux, I strongly urge you to read Unix for the Beginning Mage (by Joe Topjian) before the course starts. You can also visit UNIX Tutorial for Beginners or Learn tcsh in Y Minutes. You should also get familiar with the Unix/Linux development environment (vi/pico/emacs, cc/gcc, make, etc.)

    You should install Ubuntu 16.04 on your laptop or desktop as soon as possible to get good at using it. You should learn how to use the Terminal program to compile, run, and debug programs. It's probably a good idea to also learn how to use a text editor (such as vi, emacs, or nano) to create and edit C program source code.


  • This is a hard class! Don't fall behind! You should try to understand a lecture material by the end of the day the lecture was given. If there is anything you don't understand about the lecture, please send your question to me. In Lecture 1, I will make a promise to you that I will reply to every private e-mail messages within 24 hours of your e-mail! This is my commitment to you.
  • I should also explain that the textbook is designed to give you details a little bit at a time. Therefore, some concepts are introduced at a very high level at the beginning of the semesters. Then more and more details will be revealed later. By the end of the semester, you should know how everything is implemented. It can be frustrating that you won't know exactly how things are done when your learn a particular concept. You can read ahead if you have to know all the details, but that can be very time-consuming.
  • The class is designed so that the programming assignments go with schedule of the lectures. If you don't keep up, you may have a very difficult time implementing the programming assignments. So, don't fall behind!
  • If you are having a difficult time with C programming, you need to figure out which concept in C is confusing you and ask me to clarify the concept. If you don't know how to program at all, then I don't know how to help you. As I have mentioned above, there are prerequisites for this class and you need to have the minimum background to take this class.
  • Ask me questions! I am here to help you with this class. I cannot help you if you don't ask me questions! Send me private e-mails or post your questions to the class Google Group (although my 24-hours reply policy does not apply to posting in the class Google Group). If I don't get questions from you, I would have to assume that you understand everything.

Important Dates

  • (May 21, 2020) - first day of lecture
  • (Jun 2, 2020) - warmup1 due
  • (Jun 16, 2020) - warmup2 due
  • (Jun 30, 2020) - kernel1 due
  • (Jul 7, 2020) - midterm (firm)
  • (Jul 14, 2020) - kernel2 due
  • (Jul 30, 2020) - kernel3 due
  • (Aug 4, 2020) - final exam (firm)
If you have questions, please e-mail me at <>.