The (potential) OS/161 assignments ---------------------------------- OS/161 is used by a wide variety of courses at a wide variety of schools, no two of which have the exact same set of assignments and assignment requirements. The code base has been (to the extent reasonably possible) structured to allow this and not assume any particular structure or (particularly) numbering of assignments. That said, in various places comments and documentation must (to be helpful, at least) refer to particular assignments and things that are (typically) done in particular assignments. These are written in fairly general terms. This file is provided as an index for those terms. *** Always refer to the course materials provided by your *** *** instructors when trying to figure out what functionality *** *** you are and are not required to implement. *** Note that the OS/161 code base you are given may include solutions for some parts of the assignments described below, or even some whole assignments. Also note that the text below refers to assorted technical terms and OS concepts without much or any explanation; you may not be familiar with most of them at first and that's perfectly ok. OS/161 is intended to support six basic assignments, most of which can be divided into smaller pieces. These six assignments are: - synchronization; - basic system calls; - virtual memory; - basic file system functionality; - file system recovery via journaling; - some additional piece of OS functionality. Synchronization. This assignment has (potentially) three parts: - Implement (sleep) locks and condition variables. - Implement reader-writer locks. - Solve some synchronization problems of the dining-philosophers variety. Basic system calls. (And processes.) This assignment has (potentially) up to six parts: - Implement file tables and open-file objects. - Implement the basic system calls for files, normally: - open() - dup2() - read() - write() - lseek() - close() - chdir() - __getcwd() - Implement processes, process IDs, and the basic process system calls, normally: - getpid() - fork() - _exit() - waitpid() - Implement the execv() system call. - Implement a scheduler. Virtual memory. This assignment entails replacing a provided very simple virtual memory system with a real one. This possibly includes providing the sbrk() system call. It does not split into parts readily. Basic file system functionality. This assignment has (potentially) up to five parts: - Add more system calls for file system operations, typically taken from these: - sync() - mkdir() - rmdir() - remove() - link() - rename() - getdirentry() - fstat() - fsync() - ftruncate() - flock() although others may be chosen. - Implement a buffer cache. - Replace a biglock with fine-grained locking in the VFS layer and/or the SFS file system. - Add support for subdirectories to SFS. - Implement cross-directory rename in SFS. - Implement larger files in SFS. File system recovery via journaling. This assignment has (potentially) five parts: - Implement an on-disk container for a file system journal. - Instrument the buffer cache to support write-ahead journaling. - Design a system of journal records suitable for recovering the file system after a crash. - Add code to SFS to issue these journal records. - Implement code to read the on-disk journal and recover from a crash. Additional projects. There is a wide variety of things that can be done to build on the above assignments. None are listed here, because this file is not the place for it.