Systems Programming · Operating Systems · JVM

Programming in C

Vrije Universiteit Amsterdam · Courses: Operating Systems and Computer Programming Project

Completed two distinct projects in C: implementing four core components of an operating system, and building a subset of the Java Virtual Machine.


Four main components of an operating system

Implemented four of the main components of an operating system: a shell, a heap allocator, a file system, and a key-value store.

Shell

Implemented a Unix shell similar to sh, bash, and zsh. Supported basic commands such as cd, exit, set, and unset, and could handle piping, sequences, redirection, subshells and more, including feeding the output of one command into the input of another.

Alloc / Malloc

Implemented a heap allocator similar to jemalloc and tcmalloc. It could request chunks of memory from the OS and place objects inside them, implementing commands such as free, malloc, and realloc, with free able to merge empty chunks so they could be reused by malloc.

File System (FS)

Implemented my own driver for a new file system, SFS, loosely based on the FAT filesystem. It supported (sub)directories and files of varying size, along with file and directory navigation, creation, removal, and modification.

Kvstore

Implemented my own remote in-memory key-value store, supporting multiple concurrent clients with SET, GET, and DEL operations. This meant writing a server application, using multiple threads to support parallel clients, and protecting data structures against concurrent access.


Subset of the Java Virtual Machine (IJVM)

Implemented a subset of the Java Virtual Machine (IJVM) in C. Running an IJVM program meant running a binary against a suite of five basic tests and eight advanced tests, plus some bonus tests.

Basic tests

Created the framework and implemented the stack and switch functions, structs, and IJVM functions to build a subset program of the Java Virtual Machine.

Advanced tests

Seven of the eight tests expanded on the basic tests, exercising functions that should have already been implemented to make the implementation more advanced. The eighth tested the stack in the overall project.

Bonus tests

Implemented a bonus heap allocator and a garbage collector on top of the base implementation, completed for extra points.