My scoring is harsh, because I want you to know how far off you are from a precise and accurate answer to the question at hand. I do not want general statements about the question's topic, and definitely not incorrect statements on or off the topic.
My (letter-grade) cutoffs are lenient, because I don't want to penalize you for my scoring. This also means that there is plenty of room in the next exam to make up a bad score in this exam, but only if you answer accurately and precisely and you learn to write multi-threaded programs with minimal or no busy waiting.
I was surprised by the poor performance in problem 2 (GeekOS). If not for this, the cutoffs would have been slightly higher, e.g., A ≥ 60, B ≥ 50, etc.
Problem 4 was a "challenge" problem, to see if anyone had become fluent in the use of semaphores. I set the letter-grade cutoffs assuming a score of zero in this problem.
P1(20) P2(30) P3(20) P4(10) Total(80) 20 20 20 5 63 20 18 20 5 62 20 18 20 5 58 20 17 20 5 58 20 14 20 5 57 20 13 20 5 56 A ≥ 56 20 13 20 5 55 20 13 20 5 55 20 13 20 5 53 20 12 20 5 53 19 11 20 5 51 19 11 20 5 49 19 11 15 4 48 19 11 15 4 48 19 10 14 4 46 19 10 14 4 46 B ≥ 46 19 10 14 4 45 19 10 14 4 45 19 9 13 4 44 19 9 12 3 44 19 8 12 3 44 19 8 11 3 44 19 8 10 3 43 19 8 10 2 43 19 8 10 2 41 19 8 10 2 41 19 8 8 1 40 C ≥ 40 19 7 7 1 39 19 7 7 1 38 19 7 5 1 37 19 7 5 0 37 19 6 5 0 34 19 6 5 0 32 19 5 5 0 32 D ≥ 30