60 lines
2.1 KiB
Plaintext
60 lines
2.1 KiB
Plaintext
|
Title: Dining Philosophers
|
||
|
|
||
|
Description:
|
||
|
|
||
|
An implementation of a solution to the Dining Philosophers problem
|
||
|
(a classic multi-thread synchronization problem). This particular
|
||
|
implementation demonstrates the usage of nanokernel semaphores and
|
||
|
timers from multiple (6) fibers.
|
||
|
|
||
|
The philosopher always tries to get the lowest fork first (f1 then f2). When
|
||
|
done, he will give back the forks in the reverse order (f2 then f1). If he
|
||
|
gets two forks, he is EATING. Otherwise, he is THINKING. Transitional states
|
||
|
are shown as well, such as STARVING when the philosopher is hungry but the
|
||
|
forks are not available, and HOLDING ONE FORK when a philosopher is waiting
|
||
|
for the second fork to be available.
|
||
|
|
||
|
Each Philosopher will randomly alternate between the EATING and THINKING state.
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
Building and Running Project:
|
||
|
|
||
|
This nanokernel project outputs to the console. It can be built and executed
|
||
|
on QEMU as follows:
|
||
|
|
||
|
make qemu
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
Troubleshooting:
|
||
|
|
||
|
Problems caused by out-dated project information can be addressed by
|
||
|
issuing one of the following commands then rebuilding the project:
|
||
|
|
||
|
make clean # discard results of previous builds
|
||
|
# but keep existing configuration info
|
||
|
or
|
||
|
make pristine # discard results of previous builds
|
||
|
# and restore pre-defined configuration info
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
Sample Output:
|
||
|
|
||
|
Philosopher 0 [P: 3] HOLDING ONE FORK
|
||
|
Philosopher 1 [P: 2] HOLDING ONE FORK
|
||
|
Philosopher 2 [P: 1] EATING [ 1900 ms ]
|
||
|
Philosopher 3 [P: 0] THINKING [ 2500 ms ]
|
||
|
Philosopher 4 [C:-1] THINKING [ 2200 ms ]
|
||
|
Philosopher 5 [C:-2] THINKING [ 1700 ms ]
|
||
|
|
||
|
|
||
|
Demo Description
|
||
|
----------------
|
||
|
An implementation of a solution to the Dining Philosophers
|
||
|
problem (a classic multi-thread synchronization problem).
|
||
|
This particular implementation demonstrates the usage of multiple
|
||
|
preemptible and cooperative threads of differing priorities, as
|
||
|
well as dynamic mutexes and thread sleeping.
|