A profiler of a multithreaded process that determines whether a process is
runnable but not running by determining whether a process is both waiting
for the processor and also not waiting for other events such as I/O.
Counters are maintained for each such process that is runnable but not
running. Reports are generated summarizing data relating to any process
that may be starved due to lack of processor time. Information obtained
by the method and apparatus assists developers in optimizing resources in
multithreaded environments.