From b4958114d21cf7376ba496b6f372bf47ff97d68c Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 11:56:20 -0500 Subject: [PATCH 1/3] add CS 350 Fall 2016 Midterm --- .../F16-midterm-sol.pdf | Bin 0 -> 147765 bytes .../data/raw/cs350_fall_2016_midterm/exam.md | 315 ++++++++++++++++++ 2 files changed, 315 insertions(+) create mode 100644 benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/F16-midterm-sol.pdf create mode 100644 benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md diff --git a/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/F16-midterm-sol.pdf b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/F16-midterm-sol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..636a78bfdad5fdd3efdd166023dddf323c9d7964 GIT binary patch literal 147765 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 @E3AhN{zoCPLilU+6;|{!fdEDx4se8 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 XJ)QsUArmVHGY2~i8JU=ZIL!Y7x2SYP literal 0 HcmV?d00001 diff --git a/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md new file mode 100644 index 00000000..be29ecba --- /dev/null +++ b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md @@ -0,0 +1,315 @@ +# CS 350 Fall 2016 Midterm + +```json +{ + "exam_id": "cs350_fall_2016_midterm", + "test_paper_name": "CS 350 Fall 2016 Midterm", + "course": "CS 350", + "institution": "University of Waterloo", + "year": 2016, + "score_total": 54, + "num_questions": 8 +} +``` + +--- + +## Question 1 [10 point(s)] + +1. (10 total marks) +Consider a concurrent program that includes two functions, called +funcA and funcB. This program has the following synchronization +requirements, both of which must be satisfied. + +• Requirement 1: At most one thread at a time may be running funcB. +• Requirement 2: At most two threads at a time may be + running any combination of funcA or funcB. + +These requirements are summarized in the table on the right, +which shows which combinations of funcA and funcB may be +executed concurrently. Note that it is never OK for more than +two threads to be running any combination of these +functions concurrently. + +funcA funcB +funcA OK OK +funcB OK NO + +Concurrent Function +Execution Requirements + +a. (2 marks) +List the semaphores that you will use in your solution. For each semaphore, state what its initial value should be. + +b. (8 marks) +Show the semaphore P and V operations that threads should perform before and after each call to funcA and funcB to enforce the synchronization requirements. You must only use semaphores. Your solution should not be more restrictive than necessary, and it should ensure that deadlock is not possible. + +```json +{ + "problem_id": "1", + "points": 10, + "type": "Freeform", + "tags": ["concurrency","semaphores","synchronization"], + "answer": "Part a: Use SemA with initial value 2 and SemB with initial value 1. Part b: For funcA: P(SemA) before calling funcA; V(SemA) after returning from funcA. For funcB: P(SemB); P(SemA) before calling funcB; after returning V(SemA); V(SemB).", + "llm_judge_instructions": "Part a (2 pts): Award 2 pts if the answer lists both semaphores with the correct initial values (SemA = 2, SemB = 1). Award 1 pt if only one semaphore or one initial value is correct. Part b (8 pts): Award 4 pts for the correct sequence around funcA (P(SemA) before; V(SemA) after). Award 4 pts for the correct sequence around funcB (P(SemB) and P(SemA) before; V(SemA) and V(SemB) after; order of the two Vs after is not required). Do not deduct for minor ordering differences that do not affect correctness; deduct for missing semaphore operations or sequences that allow >2 concurrent threads or >1 concurrent funcB." +} +``` + +--- + +## Question 2 [6 point(s)] + +2. (6 total marks) +Suppose that a concurrent program has k threads, and that each thread is running on its own processor. +The threads share access to a global variable, which is protected by a spinlock. To use the variable, +each thread will first acquire the spinlock, then access the shared variable, then release the spinlock. +Assume that when there is no contention (i.e., when only one thread is trying to access the shared +variable), the total time required to acquire the lock, access the shared variable, and release the lock +is 10 time units. + +a. (2 marks) +Suppose that each thread accesses the shared variable exactly one time, and that all k threads do +so at exactly the same time, which we will refer to as time t = 0. At what time will the last of +the threads finish releasing the spinlock? + +b. (2 marks) +For the same scenario described in part (a), what is the total amount of time that the threads +will spend spinning? In other words, what is the sum of the threads’ spinning times? + +c. (2 marks) +For this part of the question, assume that there are k threads timesharing a single processor. The +first thing that each thread does when it is able to run is to acquire the spinlock and access the +shared variable. Each thread accesses the shared variable one time. Assume that the scheduling +quantum is larger than 10 time units. What is the total amount of time that the threads will +spend spinning? + +```json +{ + "problem_id": "2", + "points": 6, + "type": "Freeform", + "tags": ["concurrency","spinlocks","synchronization"], + "answer": "a) t = 10k. b) Total spinning time = 10 * (k(k-1)/2) = 5(k^2 - k). c) 0.", + "llm_judge_instructions": "Part a (2 pts): Award 2 pts for t = 10k. Part b (2 pts): Award 2 pts for the correct total spinning sum, expressed as 10 * sum_{i=0}^{k-1} i = 10 * (k(k-1)/2) (equivalently 5(k^2-k)). Award 1 pt for an equivalent unsimplified expression. Part c (2 pts): Award 2 pts for stating total spinning time is 0 and briefly noting that with a single processor timesharing and long quantum, threads do not spin while blocked on a spinlock because only one runs at a time." +} +``` + +--- + +## Question 3 [8 point(s)] + +3. (8 total marks) +Consider the following concurrent program: + +volatile int numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +volatile int value = 0; + +static void myThreadA(void * junk, unsigned long num) { + (void)junk; + numbers[num] = value; + thread_fork("B", null, myThreadB, null, num); + value = value + 1; +} + +static void myThreadB(void * junk, unsigned long num) { + (void)junk; + numbers[num] = value; +} + +int main() { + for (int i = 0; i < 10; i++) + thread_fork("A", null, myThreadA, null, i); +} + +a. (2 marks) +Assuming that no errors occur, are the following values for numbers possible after all threads have +finished executing? For each, answer “Yes” or “No”, and give a brief (one sentence) explanation. +numbers = {0,0,0,0,0,0,0,0,0,0} + +b. (2 marks) +numbers = {0,0,0,0,0,0,0,0,0,12} + +c. (2 marks) +numbers = {1,2,3,4,5,6,7,8,9,10} + +d. (2 marks) +numbers = {9,8,7,6,5,4,3,2,1,0} + +```json +{ + "problem_id": "3", + "points": 8, + "type": "Freeform", + "tags": ["concurrency","race-conditions","order-of-execution"], + "answer": "a) Yes. b) No. c) Yes. d) Yes.", + "llm_judge_instructions": "Each part is worth 2 pts. For each part, award 2 pts for the correct Yes/No answer together with a brief correct justification (one sentence). Award 1 pt if the answer is correct but justification is missing or incorrect." +} +``` + +--- + +## Question 4 [6 point(s)] + +4. (6 total marks) +On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement +spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same +time, and that their ll and sc instructions execute in the following order: + +T1: ll +T2: ll +T1: sc +T2: sc + +a. (3 marks) +Which thread(s) will acquire the spinlock after this sequence? Answer one of: T1, T2, both, neither. + +b. (3 marks) +Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw, +instead of ll) and a regular store instruction (sw, instead of sc). Suppose that the instruction +sequence is the same as in part (a): + +T1: lw +T2: lw +T1: sw +T2: sw + +Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of: T1, T2, both, neither. + +```json +{ + "problem_id": "4", + "points": 6, + "type": "Freeform", + "tags": ["mips","spinlocks","concurrency"], + "answer": "a) T2 acquires the spinlock. b) Both threads may believe they have acquired the spinlock with the incorrect lw/sw implementation.", + "llm_judge_instructions": "Part a (3 pts): Award 3 pts for identifying T2 as the thread that acquires the lock; award 0-1 pt for partially correct reasoning. Part b (3 pts): Award 3 pts for identifying that both threads can believe they have the lock with lw/sw and explaining that the atomicity guarantee is lost; award 1-2 pts for partial reasoning." +} +``` + +--- + +## Question 5 [6 point(s)] + +5. (6 total marks) + +a. (2 marks) +What is the difference between a thread yielding and a thread blocking? + +b. (2 marks) +When an exception or interrupt occurs, a trap frame must be created to preserve the application’s +context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? Give the main reasons. + +c. (2 marks) +Both wait channels and condition variables can be used to make threads block. How does a +wait channel differ from a condition variable? In particular, how does wchan_sleep differ from cv_wait? + +```json +{ + "problem_id": "5", + "points": 6, + "type": "Freeform", + "tags": ["os","threads","synchronization"], + "answer": "a) Yield: a running thread voluntarily moves to the ready state and can be scheduled again; Blocking: thread becomes not ready and waits for a resource/event. b) Trap frames are placed on a kernel stack because the user stack/pointer cannot be trusted, kernel state must be protected from user code, and kernel code cannot rely on user-space stack space. c) cv_wait releases an associated lock atomically while blocking and requires the lock to be held when called; wchan_sleep simply blocks on a wait channel and does not automatically release/reacquire a user-level lock.", + "llm_judge_instructions": "Part a (2 pts): Award 2 pts for a clear distinction (running->ready vs running->blocked/waiting). Part b (2 pts): Award 2 pts for mentioning at least two of: user stack pointer untrusted, need to protect kernel data, and avoiding kernel's dependence on user stack memory. Part c (2 pts): Award 2 pts for stating that cv_wait is used with a lock and releases it atomically while blocking, whereas wchan_sleep blocks without that automatic lock-release semantics; award 1 pt for partial explanation." +} +``` + +--- + +## Question 6 [6 point(s)] + +6. (6 total marks) +a. (3 marks) +On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement +spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same +time, and that their ll and sc instructions execute in the following order: + +T1: ll +T2: ll +T1: sc +T2: sc + +Which thread(s) will acquire the spinlock after this sequence? Answer one of: T1, T2, both, neither. + +b. (3 marks) +Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw, +instead of ll) and a regular store instruction (sw, instead of sc). Suppose that the instruction +sequence is the same as in part (a): + +T1: lw +T2: lw +T1: sw +T2: sw + +Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of: T1, T2, both, neither. + +```json +{ + "problem_id": "6", + "points": 6, + "type": "Freeform", + "tags": ["mips","spinlocks","concurrency"], + "answer": "a) T2. b) Both threads may believe they have acquired the lock under the incorrect lw/sw implementation.", + "llm_judge_instructions": "Part a (3 pts): Award 3 pts for identifying T2 and explaining that T1's sc fails because T2's later sc succeeds. Part b (3 pts): Award 3 pts for identifying that both threads can think they acquired the lock with lw/sw and explaining the lack of atomic conditional store; award partial credit for partial explanations." +} +``` + +--- + +## Question 7 [6 point(s)] + +7. (6 total marks) + +a. (2 marks) +What is the difference between a thread yielding and a thread blocking? + +b. (2 marks) +When an exception or interrupt occurs, a trap frame must be created to preserve the application’s +context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? Give the main reasons. + +c. (2 marks) +Both wait channels and condition variables can be used to make threads block. How does a +wait channel differ from a condition variable? In particular, how does wchan_sleep differ from cv_wait? + +```json +{ + "problem_id": "7", + "points": 6, + "type": "Freeform", + "tags": ["os","threads","synchronization"], + "answer": "a) Yield: running->ready; can be scheduled again. Blocking: thread is removed from ready queue and waits for a resource/event. b) Kernel stack used because user stack pointer is untrusted, kernel must protect its data and avoid relying on user memory. c) cv_wait atomically releases an associated lock while blocking and requires that lock; wchan_sleep simply blocks on a wait channel without automatically releasing a user-level lock.", + "llm_judge_instructions": "Same grading as Question 5: Part a (2 pts), Part b (2 pts for mentioning at least two reasons), Part c (2 pts for describing lock-release semantics difference)." +} +``` + +--- + +## Question 8 [6 point(s)] + +8. (6 total marks) + +a. (2 marks) +Process P calls the fork syscall and creates process C. Process P exits before process C exits. +Assume that the kernel does not allow a process to call waitpid on any process except its children. +Are any of the following statements definitely true at the time that P exits? Circle any that are true. +• Process P’s PID can be safely re-used by the kernel. +• Process C inherits process P’s PID. +• Process C terminates automatically. +• Process P will not be allowed to exit until C exits. + +b. (4 marks) +Consider a virtual memory system with 64-bit virtual addresses, and a page size of 32KB (2^15 bytes). +The system uses multi-level paging. Each page table holds at most 2^13 entries, and each page table +directory holds at most 2^12 entries. In the worst case, how many memory accesses are required +to translate a virtual address to a physical address? + +```json +{ + "problem_id": "8", + "points": 6, + "type": "Freeform", + "tags": ["virtual-memory","paging","address-translation"], + "answer": "a) None of the listed statements are definitely true. b) 4 memory accesses in the worst case (4-level page-table walk).", + "llm_judge_instructions": "Part a (2 pts): Award 2 pts for stating that none are definitely true and briefly justifying (e.g., PID reuse policy, children PID inheritance not true, etc.). Part b (4 pts): Award 4 pts for correctly stating 4 memory accesses in the worst case and a brief explanation of the 4-level walk; award 2 pts for a partially correct level count." +} +``` \ No newline at end of file From 8b893622f5c45b0772b11b84f5f7ab5343343bba Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 14:09:58 -0500 Subject: [PATCH 2/3] add CS350 Fall 2016 Midterm --- .../data/raw/cs350_fall_2016_midterm/exam.md | 427 ++++++++++-------- 1 file changed, 239 insertions(+), 188 deletions(-) diff --git a/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md index be29ecba..f26517c4 100644 --- a/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md +++ b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md @@ -1,315 +1,366 @@ -# CS 350 Fall 2016 Midterm +# CS350 Fall 2016 Midterm ```json { "exam_id": "cs350_fall_2016_midterm", - "test_paper_name": "CS 350 Fall 2016 Midterm", - "course": "CS 350", + "test_paper_name": "CS350 Fall 2016 Midterm", + "course": "CS350", "institution": "University of Waterloo", "year": 2016, - "score_total": 54, - "num_questions": 8 + "score_total": 60, + "num_questions": 18 } ``` --- -## Question 1 [10 point(s)] +## Question 1a [2 point(s)] -1. (10 total marks) -Consider a concurrent program that includes two functions, called -funcA and funcB. This program has the following synchronization -requirements, both of which must be satisfied. +List the semaphores that you will use in your solution. For each semaphore, state what its initial value should be. -• Requirement 1: At most one thread at a time may be running funcB. -• Requirement 2: At most two threads at a time may be - running any combination of funcA or funcB. +```json +{ + "problem_id": "1a", + "points": 2, + "type": "Freeform", + "tags": ["concurrency", "semaphores", "synchronization"], + "answer": "SemA: 2; SemB: 1", + "llm_judge_instructions": "Award 2 points for correctly listing SemA and SemB with initial values SemA=2 and SemB=1. Award 1 point for partially correct identification of both semaphores or correct values (e.g., correct semaphores but one initial value incorrect, or only one semaphore correctly identified). 0 points otherwise." +} +``` -These requirements are summarized in the table on the right, -which shows which combinations of funcA and funcB may be -executed concurrently. Note that it is never OK for more than -two threads to be running any combination of these -functions concurrently. +--- -funcA funcB -funcA OK OK -funcB OK NO +## Question 1b [8 point(s)] -Concurrent Function -Execution Requirements +Show the semaphore PandV operations that threads should perform before and after each call to funcA and funcB to enforce the synchronization requirements. -a. (2 marks) -List the semaphores that you will use in your solution. For each semaphore, state what its initial value should be. +```json +{ + "problem_id": "1b", + "points": 8, + "type": "Freeform", + "tags": ["concurrency", "semaphores", "synchronization"], + "answer": "P(SemA); funcA(); V(SemA); /* P/V around funcA */ /* order around funcB is constrained as shown */ P(SemB); P(SemA); funcB(); /* P/V around funcB */ V(SemA); V(SemB);", + "llm_judge_instructions": "Award points according to the following rubric (total 8 points): 4 points for correct semaphore usage that ensures at most one thread may execute funcB at a time (i.e., correct use of SemB around funcB). 3 points for correct semaphore usage that ensures at most two threads total across funcA/funcB (i.e., correct initialization and use of SemA around funcA and funcB). 1 point for correct overall ordering or demonstrating that the sequence avoids deadlock. If parts are incorrect, award partial credit according to how many of the above criteria are satisfied. 0 points if the solution violates the specified constraints." +} +``` + +--- + +## Question 2a [2 point(s)] -b. (8 marks) -Show the semaphore P and V operations that threads should perform before and after each call to funcA and funcB to enforce the synchronization requirements. You must only use semaphores. Your solution should not be more restrictive than necessary, and it should ensure that deadlock is not possible. +Suppose that each thread accesses the shared variable exactly one time, and that all k threads do so at exactly the same time, which we will refer to as time t = 0. At what time will the last of the threads finish releasing the spinlock? ```json { - "problem_id": "1", - "points": 10, + "problem_id": "2a", + "points": 2, "type": "Freeform", - "tags": ["concurrency","semaphores","synchronization"], - "answer": "Part a: Use SemA with initial value 2 and SemB with initial value 1. Part b: For funcA: P(SemA) before calling funcA; V(SemA) after returning from funcA. For funcB: P(SemB); P(SemA) before calling funcB; after returning V(SemA); V(SemB).", - "llm_judge_instructions": "Part a (2 pts): Award 2 pts if the answer lists both semaphores with the correct initial values (SemA = 2, SemB = 1). Award 1 pt if only one semaphore or one initial value is correct. Part b (8 pts): Award 4 pts for the correct sequence around funcA (P(SemA) before; V(SemA) after). Award 4 pts for the correct sequence around funcB (P(SemB) and P(SemA) before; V(SemA) and V(SemB) after; order of the two Vs after is not required). Do not deduct for minor ordering differences that do not affect correctness; deduct for missing semaphore operations or sequences that allow >2 concurrent threads or >1 concurrent funcB." + "tags": ["spinlock", "synchronization"], + "answer": "t = 10k", + "llm_judge_instructions": "Award 2 points if the answer is t = 10k. 0 points otherwise." } ``` --- -## Question 2 [6 point(s)] +## Question 2b [2 point(s)] + +For the same scenario described in part (a), what is the total amount of time that the threads will spend spinning? In other words, what is the sum of the threads’ spinning times? -2. (6 total marks) -Suppose that a concurrent program has k threads, and that each thread is running on its own processor. -The threads share access to a global variable, which is protected by a spinlock. To use the variable, -each thread will first acquire the spinlock, then access the shared variable, then release the spinlock. -Assume that when there is no contention (i.e., when only one thread is trying to access the shared -variable), the total time required to acquire the lock, access the shared variable, and release the lock -is 10 time units. +```json +{ + "problem_id": "2b", + "points": 2, + "type": "Freeform", + "tags": ["spinlock", "spinning"], + "answer": "total time = 10 * sum_{i=0}^{k-1} i", + "llm_judge_instructions": "Award 2 points for the expression total time = 10 * sum_{i=0}^{k-1} i (or an equivalent expression). Award 1 point for showing the equivalent closed form 10 * (k(k-1)/2). 0 points otherwise." +} +``` -a. (2 marks) -Suppose that each thread accesses the shared variable exactly one time, and that all k threads do -so at exactly the same time, which we will refer to as time t = 0. At what time will the last of -the threads finish releasing the spinlock? +--- -b. (2 marks) -For the same scenario described in part (a), what is the total amount of time that the threads -will spend spinning? In other words, what is the sum of the threads’ spinning times? +## Question 2c [2 point(s)] -c. (2 marks) -For this part of the question, assume that there are k threads timesharing a single processor. The -first thing that each thread does when it is able to run is to acquire the spinlock and access the -shared variable. Each thread accesses the shared variable one time. Assume that the scheduling -quantum is larger than 10 time units. What is the total amount of time that the threads will -spend spinning? +For this part of the question, assume that there are k threads timesharing a single processor. The first thing that each thread does when it is able to run is to acquire the spinlock and access the shared variable. Each thread accesses the shared variable one time. Assume that the scheduling quantum is larger than 10 time units. What is the total amount of time that the threads will spin? ```json { - "problem_id": "2", - "points": 6, + "problem_id": "2c", + "points": 2, "type": "Freeform", - "tags": ["concurrency","spinlocks","synchronization"], - "answer": "a) t = 10k. b) Total spinning time = 10 * (k(k-1)/2) = 5(k^2 - k). c) 0.", - "llm_judge_instructions": "Part a (2 pts): Award 2 pts for t = 10k. Part b (2 pts): Award 2 pts for the correct total spinning sum, expressed as 10 * sum_{i=0}^{k-1} i = 10 * (k(k-1)/2) (equivalently 5(k^2-k)). Award 1 pt for an equivalent unsimplified expression. Part c (2 pts): Award 2 pts for stating total spinning time is 0 and briefly noting that with a single processor timesharing and long quantum, threads do not spin while blocked on a spinlock because only one runs at a time." + "tags": ["spinlock", "scheduling"], + "answer": "None of the threads will spin (total spinning time is zero).", + "llm_judge_instructions": "Award 2 points if the answer is that the total spinning time is zero, with a brief justification (e.g., each thread runs long enough to acquire the lock without spinning). 0 points otherwise." } ``` --- -## Question 3 [8 point(s)] +## Question 3a [2 point(s)] -3. (8 total marks) -Consider the following concurrent program: +Assuming that no errors occur, are the following values for numbers possible after all threads have finished executing? For each, answer "Yes" or "No", and give a brief (one sentence) explanation. -volatile int numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -volatile int value = 0; +numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} -static void myThreadA(void * junk, unsigned long num) { - (void)junk; - numbers[num] = value; - thread_fork("B", null, myThreadB, null, num); - value = value + 1; +```json +{ + "problem_id": "3a", + "points": 2, + "type": "Freeform", + "tags": ["concurrency", "threads"], + "answer": "Yes. This could occur if every myThreadB runs and exits before any myThreadA executes the increment.", + "llm_judge_instructions": "Award 2 points for the correct answer 'Yes' together with a concise correct explanation. Award 1 point for the correct Yes/No with an incomplete explanation. 0 points otherwise." } +``` -static void myThreadB(void * junk, unsigned long num) { - (void)junk; - numbers[num] = value; -} +--- -int main() { - for (int i = 0; i < 10; i++) - thread_fork("A", null, myThreadA, null, i); -} +## Question 3b [2 point(s)] + +Repeat part (a), but for the following values for numbers: +numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 12} -a. (2 marks) -Assuming that no errors occur, are the following values for numbers possible after all threads have -finished executing? For each, answer “Yes” or “No”, and give a brief (one sentence) explanation. -numbers = {0,0,0,0,0,0,0,0,0,0} +```json +{ + "problem_id": "3b", + "points": 2, + "type": "Freeform", + "tags": ["concurrency", "threads"], + "answer": "No. Value starts at 0, and is incremented at most 10 times, so it could never be 12, regardless of thread execution order.", + "llm_judge_instructions": "Award 2 points for the correct answer 'No' with a concise correct explanation. 1 point for correct answer with unclear explanation. 0 points otherwise." +} +``` -b. (2 marks) -numbers = {0,0,0,0,0,0,0,0,0,12} +--- -c. (2 marks) -numbers = {1,2,3,4,5,6,7,8,9,10} +## Question 3c [2 point(s)] -d. (2 marks) -numbers = {9,8,7,6,5,4,3,2,1,0} +Repeat part (a), but for the following values for numbers: +numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ```json { - "problem_id": "3", - "points": 8, + "problem_id": "3c", + "points": 2, "type": "Freeform", - "tags": ["concurrency","race-conditions","order-of-execution"], - "answer": "a) Yes. b) No. c) Yes. d) Yes.", - "llm_judge_instructions": "Each part is worth 2 pts. For each part, award 2 pts for the correct Yes/No answer together with a brief correct justification (one sentence). Award 1 pt if the answer is correct but justification is missing or incorrect." + "tags": ["concurrency", "threads"], + "answer": "Yes. This could occur if each pair myThreadA/myThreadB executes completely before the next myThreadA executes.", + "llm_judge_instructions": "Award 2 points for the correct answer 'Yes' with a concise correct explanation. 1 point for partial reasoning. 0 points otherwise." } ``` --- -## Question 4 [6 point(s)] +## Question 3d [2 point(s)] + +Repeat part (a), but for the following values for numbers: +numbers[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + +```json +{ + "problem_id": "3d", + "points": 2, + "type": "Freeform", + "tags": ["concurrency", "threads"], + "answer": "Yes. For example, this can occur if threads run in decreasing order, and each thread's myThreadB executes before incrementing value, and the next myThreadA does not run until the current thread has incremented value.", + "llm_judge_instructions": "Award 2 points for the correct answer 'Yes' with a concise correct explanation. 1 point for partial reasoning. 0 points otherwise." +} +``` -4. (6 total marks) -On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement -spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same -time, and that their ll and sc instructions execute in the following order: +--- -T1: ll -T2: ll -T1: sc -T2: sc +## Question 4 [10 point(s)] -a. (3 marks) -Which thread(s) will acquire the spinlock after this sequence? Answer one of: T1, T2, both, neither. +Suppose that an application program contains a variable a, of type char *, which is a pointer to an array of characters. The program can then refer to the ith element of the array as a[i]. Each character occupies one byte, and C arrays are contiguous in the application's virtual memory. Suppose that the system uses 32-bit virtual and physical addresses and paged virtual memory, with a page size of 4KB (2^12 bytes). The valid entries in the process's page table are shown in the following chart. Assume that the entries for any pages not listed in the chart are invalid. -b. (3 marks) -Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw, -instead of ll) and a regular store instruction (sw, instead of sc). Suppose that the instruction -sequence is the same as in part (a): +Page # Frame # +0x000100 x00032 +0x000110 x00033 +0x000120 x00010 +0x000400 x00021 +0x000410 x00022 -T1: lw -T2: lw -T1: sw -T2: sw +The following table lists some possible values for the variables a and i. In each row, indicate what the physical address of a[i] will be, assuming the values of a and i indicated in that row, and the page table described above. If the virtual address of a[i] cannot be translated, write "exception". -Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of: T1, T2, both, neither. +a[i] pa[i] +0x000100F0 ? +0x00012A00 ? +0x0001305D ? +0x00040EF0 ? +0x00041F00 ? +``` ```json { "problem_id": "4", - "points": 6, + "points": 10, "type": "Freeform", - "tags": ["mips","spinlocks","concurrency"], - "answer": "a) T2 acquires the spinlock. b) Both threads may believe they have acquired the spinlock with the incorrect lw/sw implementation.", - "llm_judge_instructions": "Part a (3 pts): Award 3 pts for identifying T2 as the thread that acquires the lock; award 0-1 pt for partially correct reasoning. Part b (3 pts): Award 3 pts for identifying that both threads can believe they have the lock with lw/sw and explaining that the atomicity guarantee is lost; award 1-2 pts for partial reasoning." + "tags": ["virtual-memory", "paging", "address-translation"], + "answer": "", + "llm_judge_instructions": "There are 5 rows. Award 2 points for each row that is correctly translated (correct physical address) or correctly marked 'exception' when translation is not possible. 0 points for an incorrect entry for that row." } ``` --- -## Question 5 [6 point(s)] +## Question 5 [8 point(s)] -5. (6 total marks) +Draw the relevant stack frames for the application and kernel stacks for an OS161 process in the middle of calling fork. Assume that the parent process is in sys_fork (the kernel handler function for fork), and that the child process has been created and is about to call mips usermode. Draw the stacks of both the parent and child processes. -a. (2 marks) -What is the difference between a thread yielding and a thread blocking? +```json +{ + "problem_id": "5", + "points": 8, + "type": "Freeform", + "tags": ["os161", "kernel", "process-management", "fork"], + "answer": "", + "llm_judge_instructions": "Award points according to the following rubric (total 8 points): 4 points for a correct and clearly labeled depiction of the parent's kernel and user stack frames relevant to sys_fork (including trap frame, registers saved, and any fork-related kernel frames). 4 points for a correct and clearly labeled depiction of the child's kernel and user stack frames (including the copied trap frame and correct return-to-user setup). Partial credit may be given (in multiples of 1 or 2 points) for partially correct diagrams." +} +``` -b. (2 marks) -When an exception or interrupt occurs, a trap frame must be created to preserve the application’s -context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? Give the main reasons. +--- + +## Question 6a [3 point(s)] -c. (2 marks) -Both wait channels and condition variables can be used to make threads block. How does a -wait channel differ from a condition variable? In particular, how does wchan_sleep differ from cv_wait? +On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same time, and that their ll and sc instructions execute in the following order: +T1 +T2 +ll +time +ll +↓sc +sc +Which thread(s) will acquire the spinlock after this sequence? Answer one of the following: T1, T2, both, neither. ```json { - "problem_id": "5", - "points": 6, + "problem_id": "6a", + "points": 3, "type": "Freeform", - "tags": ["os","threads","synchronization"], - "answer": "a) Yield: a running thread voluntarily moves to the ready state and can be scheduled again; Blocking: thread becomes not ready and waits for a resource/event. b) Trap frames are placed on a kernel stack because the user stack/pointer cannot be trusted, kernel state must be protected from user code, and kernel code cannot rely on user-space stack space. c) cv_wait releases an associated lock atomically while blocking and requires the lock to be held when called; wchan_sleep simply blocks on a wait channel and does not automatically release/reacquire a user-level lock.", - "llm_judge_instructions": "Part a (2 pts): Award 2 pts for a clear distinction (running->ready vs running->blocked/waiting). Part b (2 pts): Award 2 pts for mentioning at least two of: user stack pointer untrusted, need to protect kernel data, and avoiding kernel's dependence on user stack memory. Part c (2 pts): Award 2 pts for stating that cv_wait is used with a lock and releases it atomically while blocking, whereas wchan_sleep blocks without that automatic lock-release semantics; award 1 pt for partial explanation." + "tags": ["mips", "ll_sc", "spinlock"], + "answer": "T2 will acquire the spinlock.", + "llm_judge_instructions": "Award 3 points if the answer is 'T2' with a correct brief explanation that T2's sc succeeds and T1's sc fails due to the ll/sc reservation semantics. Award 1 point if the answer is 'T2' without a correct explanation. 0 points otherwise." } ``` --- -## Question 6 [6 point(s)] +## Question 6b [3 point(s)] -6. (6 total marks) -a. (3 marks) -On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement -spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same -time, and that their ll and sc instructions execute in the following order: +Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw) instead of ll and a regular store instruction (sw) instead of sc. Suppose that the instruction sequence is the same as in part (a): +T1 +T2 +lw +time +lw +↓sw +sw +Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of the following: T1, T2, both, neither. -T1: ll -T2: ll -T1: sc -T2: sc - -Which thread(s) will acquire the spinlock after this sequence? Answer one of: T1, T2, both, neither. +```json +{ + "problem_id": "6b", + "points": 3, + "type": "Freeform", + "tags": ["mips", "spinlock", "lw_sw"], + "answer": "Both threads will believe they have acquired the spinlock.", + "llm_judge_instructions": "Award 3 points if the answer is 'both' with a correct brief explanation (e.g., due to race between lw and sw, both stores can appear to succeed). Award 1 point if the correct label is given without explanation. 0 points otherwise." +} +``` -b. (3 marks) -Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw, -instead of ll) and a regular store instruction (sw, instead of sc). Suppose that the instruction -sequence is the same as in part (a): +--- -T1: lw -T2: lw -T1: sw -T2: sw +## Question 7a [2 point(s)] -Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of: T1, T2, both, neither. +What is the difference between a thread yielding and a thread blocking? ```json { - "problem_id": "6", - "points": 6, + "problem_id": "7a", + "points": 2, "type": "Freeform", - "tags": ["mips","spinlocks","concurrency"], - "answer": "a) T2. b) Both threads may believe they have acquired the lock under the incorrect lw/sw implementation.", - "llm_judge_instructions": "Part a (3 pts): Award 3 pts for identifying T2 and explaining that T1's sc fails because T2's later sc succeeds. Part b (3 pts): Award 3 pts for identifying that both threads can think they acquired the lock with lw/sw and explaining the lack of atomic conditional store; award partial credit for partial explanations." + "tags": ["threading", "scheduling"], + "answer": "A yielded thread moves from running to ready and can be scheduled again; a blocked thread is not running or ready and waits on a resource until it becomes available.", + "llm_judge_instructions": "Award 2 points for a correct description: yielding moves a thread from running to ready (scheduler may reschedule it), blocking moves a thread to a waiting state until a resource/event occurs. 1 point for partial description. 0 points otherwise." } ``` --- -## Question 7 [6 point(s)] +## Question 7b [2 point(s)] -7. (6 total marks) +When an exception or interrupt occurs, a trap frame must be created to preserve the application’s context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? -a. (2 marks) -What is the difference between a thread yielding and a thread blocking? +Possible answers: +• The stack pointer is an application-owned register, and thus can’t be trusted to be pointing at a valid stack. +• Using the application stack would expose kernel data to the application. +• Using the application stack would require the application to budget virtual memory for (unknown) kernel usage. + +```json +{ + "problem_id": "7b", + "points": 2, + "type": "Freeform", + "tags": ["os", "traps", "kernel"], + "answer": "Using the application stack would expose kernel data to the application. The stack pointer is not trusted to point to a valid kernel stack in the application’s address space.", + "llm_judge_instructions": "Award 2 points for stating either that using the application stack would expose kernel data to the application or that the user-controlled stack pointer cannot be trusted to point to a valid kernel stack (or both). Award 1 point for a partially correct reason. 0 points otherwise." +} +``` + +--- -b. (2 marks) -When an exception or interrupt occurs, a trap frame must be created to preserve the application’s -context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? Give the main reasons. +## Question 7c [2 point(s)] -c. (2 marks) -Both wait channels and condition variables can be used to make threads block. How does a -wait channel differ from a condition variable? In particular, how does wchan_sleep differ from cv_wait? +Both wait channels and condition variables can be used to make threads block. How does a wait channel differ from a condition variable? In particular, how does wchan_sleep differ from cv_wait? ```json { - "problem_id": "7", - "points": 6, + "problem_id": "7c", + "points": 2, "type": "Freeform", - "tags": ["os","threads","synchronization"], - "answer": "a) Yield: running->ready; can be scheduled again. Blocking: thread is removed from ready queue and waits for a resource/event. b) Kernel stack used because user stack pointer is untrusted, kernel must protect its data and avoid relying on user memory. c) cv_wait atomically releases an associated lock while blocking and requires that lock; wchan_sleep simply blocks on a wait channel without automatically releasing a user-level lock.", - "llm_judge_instructions": "Same grading as Question 5: Part a (2 pts), Part b (2 pts for mentioning at least two reasons), Part c (2 pts for describing lock-release semantics difference)." + "tags": ["wait-channel", "condition-variable"], + "answer": "Wait channels block without requiring an associated lock; wchan_sleep blocks the thread until signaled on the channel, whereas cv_wait uses a lock and releases it while blocking, reacquiring it upon wakeup.", + "llm_judge_instructions": "Award 2 points for correctly distinguishing that wchan_sleep does not require the caller to hold a mutex and operates on a wait-channel object, while cv_wait requires a mutex and releases/reacquires it atomically with sleeping. 1 point for partial correctness. 0 points otherwise." } ``` --- -## Question 8 [6 point(s)] - -8. (6 total marks) +## Question 8a [2 point(s)] -a. (2 marks) -Process P calls the fork syscall and creates process C. Process P exits before process C exits. -Assume that the kernel does not allow a process to call waitpid on any process except its children. -Are any of the following statements definitely true at the time that P exits? Circle any that are true. +Process P calls the fork system call and creates process C. Process P exits before process C exits. Assume that the kernel does not allow a process to call waitpid on any process except its children. Are any of the following statements definitely true at the time that P exits? Circle any that are true. • Process P’s PID can be safely re-used by the kernel. • Process C inherits process P’s PID. • Process C terminates automatically. • Process P will not be allowed to exit until C exits. -b. (4 marks) -Consider a virtual memory system with 64-bit virtual addresses, and a page size of 32KB (2^15 bytes). -The system uses multi-level paging. Each page table holds at most 2^13 entries, and each page table -directory holds at most 2^12 entries. In the worst case, how many memory accesses are required -to translate a virtual address to a physical address? +```json +{ + "problem_id": "8a", + "points": 2, + "type": "Freeform", + "tags": ["process-management", "fork", "exit"], + "answer": "None of the statements are definitely true at P's exit.", + "llm_judge_instructions": "Award 2 points for identifying that none of the listed statements are definitely true when P exits (brief justification optional). 1 point for a partially correct justification. 0 points otherwise." +} +``` + +--- + +## Question 8b [4 point(s)] + +Consider a virtual memory system with 64-bit virtual addresses, and a page size of 32KB (2^15 bytes). The system uses multi-level paging. Each page table holds at most 2^13 entries, and each page directory holds at most 2^12 entries. In the worst case, how many memory accesses are required to translate a virtual address to a physical address? ```json { - "problem_id": "8", - "points": 6, + "problem_id": "8b", + "points": 4, "type": "Freeform", - "tags": ["virtual-memory","paging","address-translation"], - "answer": "a) None of the listed statements are definitely true. b) 4 memory accesses in the worst case (4-level page-table walk).", - "llm_judge_instructions": "Part a (2 pts): Award 2 pts for stating that none are definitely true and briefly justifying (e.g., PID reuse policy, children PID inheritance not true, etc.). Part b (4 pts): Award 4 pts for correctly stating 4 memory accesses in the worst case and a brief explanation of the 4-level walk; award 2 pts for a partially correct level count." + "tags": ["virtual-memory", "paging", "translation"], + "answer": "4", + "llm_judge_instructions": "Award 4 points if the answer matches the expected worst-case number of memory accesses as determined by the number of page-table levels plus the final data access (student should show reasoning). Award 2 points for a plausible but incomplete calculation. 0 points otherwise." } ``` \ No newline at end of file From cf4377436ff8efefab4cc2745197343844ceabb7 Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 22:24:55 -0500 Subject: [PATCH 3/3] add CS350 Fall 2016 Midterm --- .../data/raw/cs350_fall_2016_midterm/exam.md | 225 +++++++----------- 1 file changed, 84 insertions(+), 141 deletions(-) diff --git a/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md index f26517c4..8024d223 100644 --- a/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md +++ b/benchmarks/courseexam_bench/data/raw/cs350_fall_2016_midterm/exam.md @@ -7,8 +7,8 @@ "course": "CS350", "institution": "University of Waterloo", "year": 2016, - "score_total": 60, - "num_questions": 18 + "score_total": 50, + "num_questions": 16 } ``` @@ -16,16 +16,16 @@ ## Question 1a [2 point(s)] -List the semaphores that you will use in your solution. For each semaphore, state what its initial value should be. +a. (2 marks) List the semaphores that you will use in your solution. For each semaphore, state what its initial value should be. ```json { "problem_id": "1a", "points": 2, "type": "Freeform", - "tags": ["concurrency", "semaphores", "synchronization"], + "tags": ["semaphores","concurrency"], "answer": "SemA: 2; SemB: 1", - "llm_judge_instructions": "Award 2 points for correctly listing SemA and SemB with initial values SemA=2 and SemB=1. Award 1 point for partially correct identification of both semaphores or correct values (e.g., correct semaphores but one initial value incorrect, or only one semaphore correctly identified). 0 points otherwise." + "llm_judge_instructions": "Award 2 points if both semaphores are listed with the correct initial values: SemA = 2 and SemB = 1. Award 0 points otherwise." } ``` @@ -33,16 +33,16 @@ List the semaphores that you will use in your solution. For each semaphore, stat ## Question 1b [8 point(s)] -Show the semaphore PandV operations that threads should perform before and after each call to funcA and funcB to enforce the synchronization requirements. +b. (8 marks) Show the semaphore P and V operations that threads should perform before and after each call to funcA and funcB to enforce the synchronization requirements. Provide the exact sequence of P and V calls that each thread should execute around funcA and funcB. ```json { "problem_id": "1b", "points": 8, "type": "Freeform", - "tags": ["concurrency", "semaphores", "synchronization"], - "answer": "P(SemA); funcA(); V(SemA); /* P/V around funcA */ /* order around funcB is constrained as shown */ P(SemB); P(SemA); funcB(); /* P/V around funcB */ V(SemA); V(SemB);", - "llm_judge_instructions": "Award points according to the following rubric (total 8 points): 4 points for correct semaphore usage that ensures at most one thread may execute funcB at a time (i.e., correct use of SemB around funcB). 3 points for correct semaphore usage that ensures at most two threads total across funcA/funcB (i.e., correct initialization and use of SemA around funcA and funcB). 1 point for correct overall ordering or demonstrating that the sequence avoids deadlock. If parts are incorrect, award partial credit according to how many of the above criteria are satisfied. 0 points if the solution violates the specified constraints." + "tags": ["semaphores","concurrency"], + "answer": "P(SemA); funcA(); V(SemA); P(SemB); P(SemA); funcB(); V(SemA); V(SemB)", + "llm_judge_instructions": "Award 8 points for the exact sequence: P(SemA); funcA(); V(SemA); P(SemB); P(SemA); funcB(); V(SemA); V(SemB). Award 0 points for any other sequence." } ``` @@ -50,16 +50,16 @@ Show the semaphore PandV operations that threads should perform before and after ## Question 2a [2 point(s)] -Suppose that each thread accesses the shared variable exactly one time, and that all k threads do so at exactly the same time, which we will refer to as time t = 0. At what time will the last of the threads finish releasing the spinlock? +a. (2 marks) Suppose that each thread accesses the shared variable exactly one time, and that all k threads do so at exactly the same time, which we will refer to as time t = 0. At what time will the last of the threads finish releasing the spinlock? ```json { "problem_id": "2a", "points": 2, "type": "Freeform", - "tags": ["spinlock", "synchronization"], + "tags": ["spinlocks","concurrency"], "answer": "t = 10k", - "llm_judge_instructions": "Award 2 points if the answer is t = 10k. 0 points otherwise." + "llm_judge_instructions": "Award 2 points for the answer 't = 10k'. Award 0 otherwise." } ``` @@ -67,16 +67,16 @@ Suppose that each thread accesses the shared variable exactly one time, and that ## Question 2b [2 point(s)] -For the same scenario described in part (a), what is the total amount of time that the threads will spend spinning? In other words, what is the sum of the threads’ spinning times? +b. (2 marks) For the same scenario described in part (a), what is the total amount of time that the threads will spend spinning? In other words, what is the sum of the threads’ spinning times? ```json { "problem_id": "2b", "points": 2, "type": "Freeform", - "tags": ["spinlock", "spinning"], - "answer": "total time = 10 * sum_{i=0}^{k-1} i", - "llm_judge_instructions": "Award 2 points for the expression total time = 10 * sum_{i=0}^{k-1} i (or an equivalent expression). Award 1 point for showing the equivalent closed form 10 * (k(k-1)/2). 0 points otherwise." + "tags": ["spinlocks","concurrency"], + "answer": "Total spinning time = 10 * sum_{i=0}^{k-1} i = 5(k^2 - k)", + "llm_judge_instructions": "Award 2 points for the correct closed-form expression for total spinning time (e.g., '5(k^2 - k)' or '10 * sum_{i=0}^{k-1} i'). Award 0 otherwise." } ``` @@ -84,16 +84,16 @@ For the same scenario described in part (a), what is the total amount of time th ## Question 2c [2 point(s)] -For this part of the question, assume that there are k threads timesharing a single processor. The first thing that each thread does when it is able to run is to acquire the spinlock and access the shared variable. Each thread accesses the shared variable one time. Assume that the scheduling quantum is larger than 10 time units. What is the total amount of time that the threads will spin? +c. (2 marks) For this part of the question, assume that there are k threads timesharing a single processor. The first thing that each thread does when it is able to run is to acquire the spinlock and access the shared variable. Each thread accesses the shared variable one time. Assume that the scheduling quantum is larger than 10 time units. What is the total amount of time that the threads will spend spinning? ```json { "problem_id": "2c", "points": 2, "type": "Freeform", - "tags": ["spinlock", "scheduling"], - "answer": "None of the threads will spin (total spinning time is zero).", - "llm_judge_instructions": "Award 2 points if the answer is that the total spinning time is zero, with a brief justification (e.g., each thread runs long enough to acquire the lock without spinning). 0 points otherwise." + "tags": ["spinlocks","concurrency"], + "answer": "0 (none of the threads will spin)", + "llm_judge_instructions": "Award 2 points if the answer states that total spinning time is 0 and gives the brief justification that only one thread runs at a time and it acquires the lock without spinning. Award 0 otherwise." } ``` @@ -101,8 +101,7 @@ For this part of the question, assume that there are k threads timesharing a sin ## Question 3a [2 point(s)] -Assuming that no errors occur, are the following values for numbers possible after all threads have finished executing? For each, answer "Yes" or "No", and give a brief (one sentence) explanation. - +a. (2 marks) Assuming that no errors occur, are the following values for numbers possible after all threads have finished executing? For each, answer “Yes” or “No”, and give a brief (one sentence) explanation. numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ```json @@ -110,9 +109,9 @@ numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} "problem_id": "3a", "points": 2, "type": "Freeform", - "tags": ["concurrency", "threads"], - "answer": "Yes. This could occur if every myThreadB runs and exits before any myThreadA executes the increment.", - "llm_judge_instructions": "Award 2 points for the correct answer 'Yes' together with a concise correct explanation. Award 1 point for the correct Yes/No with an incomplete explanation. 0 points otherwise." + "tags": ["concurrency","memory-order"], + "answer": "Yes. This could occur if every instance of myThreadB runs and exits before any myThreadA increments value.", + "llm_judge_instructions": "Award 2 points for 'Yes' with a brief correct explanation (e.g., all B threads execute before any A increments). Award 0 otherwise." } ``` @@ -120,7 +119,7 @@ numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ## Question 3b [2 point(s)] -Repeat part (a), but for the following values for numbers: +b. (2 marks) Repeat part (a), but for the following values for numbers: numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 12} ```json @@ -128,9 +127,9 @@ numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 12} "problem_id": "3b", "points": 2, "type": "Freeform", - "tags": ["concurrency", "threads"], - "answer": "No. Value starts at 0, and is incremented at most 10 times, so it could never be 12, regardless of thread execution order.", - "llm_judge_instructions": "Award 2 points for the correct answer 'No' with a concise correct explanation. 1 point for correct answer with unclear explanation. 0 points otherwise." + "tags": ["concurrency","memory-order"], + "answer": "No. The value starts at 0 and can be incremented at most 10 times, so it cannot be 12.", + "llm_judge_instructions": "Award 2 points for 'No' with the correct justification that the value cannot exceed 10 increments. Award 0 otherwise." } ``` @@ -138,7 +137,7 @@ numbers[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 12} ## Question 3c [2 point(s)] -Repeat part (a), but for the following values for numbers: +c. (2 marks) Repeat part (a), but for the following values for numbers: numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ```json @@ -146,9 +145,9 @@ numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} "problem_id": "3c", "points": 2, "type": "Freeform", - "tags": ["concurrency", "threads"], - "answer": "Yes. This could occur if each pair myThreadA/myThreadB executes completely before the next myThreadA executes.", - "llm_judge_instructions": "Award 2 points for the correct answer 'Yes' with a concise correct explanation. 1 point for partial reasoning. 0 points otherwise." + "tags": ["concurrency","memory-order"], + "answer": "Yes. This could occur if each pair myThreadA/myThreadB executes completely before the next myThreadA increments.", + "llm_judge_instructions": "Award 2 points for 'Yes' with a brief correct justification. Award 0 otherwise." } ``` @@ -156,7 +155,7 @@ numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ## Question 3d [2 point(s)] -Repeat part (a), but for the following values for numbers: +d. (2 marks) Repeat part (a), but for the following values for numbers: numbers[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ```json @@ -164,43 +163,32 @@ numbers[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} "problem_id": "3d", "points": 2, "type": "Freeform", - "tags": ["concurrency", "threads"], - "answer": "Yes. For example, this can occur if threads run in decreasing order, and each thread's myThreadB executes before incrementing value, and the next myThreadA does not run until the current thread has incremented value.", - "llm_judge_instructions": "Award 2 points for the correct answer 'Yes' with a concise correct explanation. 1 point for partial reasoning. 0 points otherwise." + "tags": ["concurrency","memory-order"], + "answer": "Yes. This ordering can occur given appropriate interleaving of threads (e.g., B threads executing before their A increments and threads running in decreasing order).", + "llm_judge_instructions": "Award 2 points for 'Yes' with a brief correct justification about possible thread interleavings. Award 0 otherwise." } ``` --- -## Question 4 [10 point(s)] - -Suppose that an application program contains a variable a, of type char *, which is a pointer to an array of characters. The program can then refer to the ith element of the array as a[i]. Each character occupies one byte, and C arrays are contiguous in the application's virtual memory. Suppose that the system uses 32-bit virtual and physical addresses and paged virtual memory, with a page size of 4KB (2^12 bytes). The valid entries in the process's page table are shown in the following chart. Assume that the entries for any pages not listed in the chart are invalid. +## Question 4 [6 point(s)] -Page # Frame # -0x000100 x00032 -0x000110 x00033 -0x000120 x00010 -0x000400 x00021 -0x000410 x00022 - -The following table lists some possible values for the variables a and i. In each row, indicate what the physical address of a[i] will be, assuming the values of a and i indicated in that row, and the page table described above. If the virtual address of a[i] cannot be translated, write "exception". +a. (2 marks) Process P calls the fork syscall and creates process C. Process P exits before process C exits. Assume that the kernel does not allow a process to call waitpid on any process except its children. Are any of the following statements definitely true at the time that P exits? Circle any that are true. +• Process P’s PID can be safely re-used by the kernel. +• Process C inherits process P’s PID. +• Process C terminates automatically. +• Process P will not be allowed to exit until C exits. -a[i] pa[i] -0x000100F0 ? -0x00012A00 ? -0x0001305D ? -0x00040EF0 ? -0x00041F00 ? -``` +b. (4 marks) Consider a virtual memory system with 64-bit virtual addresses, and a page size of 32KB (2^15 bytes). The system uses multi-level paging. Each page table holds at most 2^13 entries, and each page table directory holds at most 2^12 entries. In the worst case, how many memory accesses are required to translate a virtual address to a physical address? ```json { "problem_id": "4", - "points": 10, + "points": 6, "type": "Freeform", - "tags": ["virtual-memory", "paging", "address-translation"], - "answer": "", - "llm_judge_instructions": "There are 5 rows. Award 2 points for each row that is correctly translated (correct physical address) or correctly marked 'exception' when translation is not possible. 0 points for an incorrect entry for that row." + "tags": ["process","fork","virtual-memory","paging"], + "answer": "Part (a): None of the listed statements are definitely true. Part (b): 4 memory accesses in the worst case.", + "llm_judge_instructions": "Allocate points as follows: 2 points for Part (a) if the answer states that none of the statements is definitely true with brief justification; 4 points for Part (b) if the answer gives '4' (and a brief correct reasoning that the page table structure leads to four levels). Partial credit: for Part (b) up to 2 points for recognizing multiple-level translation and giving a plausible level count if not exactly 4." } ``` @@ -208,16 +196,16 @@ a[i] pa[i] ## Question 5 [8 point(s)] -Draw the relevant stack frames for the application and kernel stacks for an OS161 process in the middle of calling fork. Assume that the parent process is in sys_fork (the kernel handler function for fork), and that the child process has been created and is about to call mips usermode. Draw the stacks of both the parent and child processes. +Draw the relevant stack frames for the application and kernel stacks for an OS161 process in the middle of calling fork. Assume that the parent process is in sys_fork (the kernel handler function for fork), and that the child process has been created and is about to call mips_usermode. Draw the stacks of both the parent and child processes showing the trap frame, syscall frames, and any frames that must be copied or adjusted. ```json { "problem_id": "5", "points": 8, "type": "Freeform", - "tags": ["os161", "kernel", "process-management", "fork"], - "answer": "", - "llm_judge_instructions": "Award points according to the following rubric (total 8 points): 4 points for a correct and clearly labeled depiction of the parent's kernel and user stack frames relevant to sys_fork (including trap frame, registers saved, and any fork-related kernel frames). 4 points for a correct and clearly labeled depiction of the child's kernel and user stack frames (including the copied trap frame and correct return-to-user setup). Partial credit may be given (in multiples of 1 or 2 points) for partially correct diagrams." + "tags": ["os161","stacks","fork"], + "answer": "Expected answer describes: parent kernel stack containing trap frame and sys_fork frames; child kernel stack containing a copied trap frame and a minimal kernel frame to return into user mode (e.g., enter_forked_process), and both application stacks arranged so the child will resume in user mode. The answer should indicate which frames are copied and which are unique to parent/child.", + "llm_judge_instructions": "Award up to 8 points distributed as: 4 points for correctly drawing/identifying the parent stacks (kernel trap frame and sys_fork frames) and explaining their roles; 4 points for correctly drawing/identifying the child stacks (copied trap frame, entry frame such as enter_forked_process, and eventual user-mode context) and explaining which frames are copied vs new. Partial credit proportional to completeness and correctness of elements." } ``` @@ -225,24 +213,22 @@ Draw the relevant stack frames for the application and kernel stacks for an OS16 ## Question 6a [3 point(s)] -On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same time, and that their ll and sc instructions execute in the following order: -T1 -T2 -ll -time -ll -↓sc -sc -Which thread(s) will acquire the spinlock after this sequence? Answer one of the following: T1, T2, both, neither. +a. (3 marks) On the MIPS, the load linked (ll) and store conditional (sc) instructions are used to implement spinlocks. Suppose that two threads, T1 and T2, try to acquire an unlocked spinlock at the same time, and that their ll and sc instructions execute in the following order: +T1: ll +T1: time passes +T2: ll +T1: sc +T2: sc +Which thread(s) will acquire the spinlock after this sequence? Answer one of: T1, T2, both, neither. ```json { "problem_id": "6a", "points": 3, "type": "Freeform", - "tags": ["mips", "ll_sc", "spinlock"], - "answer": "T2 will acquire the spinlock.", - "llm_judge_instructions": "Award 3 points if the answer is 'T2' with a correct brief explanation that T2's sc succeeds and T1's sc fails due to the ll/sc reservation semantics. Award 1 point if the answer is 'T2' without a correct explanation. 0 points otherwise." + "tags": ["mips","spinlock","llsc"], + "answer": "T2", + "llm_judge_instructions": "Award 3 points for answering 'T2' with brief justification that T1's sc will fail because T2's ll occurred after T1's ll, so T2's sc succeeds and T1's sc fails. Award 0 otherwise." } ``` @@ -250,24 +236,22 @@ Which thread(s) will acquire the spinlock after this sequence? Answer one of the ## Question 6b [3 point(s)] -Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw) instead of ll and a regular store instruction (sw) instead of sc. Suppose that the instruction sequence is the same as in part (a): -T1 -T2 -lw -time -lw -↓sw -sw -Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of the following: T1, T2, both, neither. +b. (3 marks) Suppose that the MIPS spinlock was mistakenly implemented using a regular load instruction (lw, instead of ll) and a regular store instruction (sw, instead of sc). Suppose the instruction sequence is the same as in part (a): +T1: lw +T1: time passes +T2: lw +T1: sw +T2: sw +Which thread(s) will believe that they have acquired the spinlock after this sequence? Answer one of: T1, T2, both, neither. ```json { "problem_id": "6b", "points": 3, "type": "Freeform", - "tags": ["mips", "spinlock", "lw_sw"], - "answer": "Both threads will believe they have acquired the spinlock.", - "llm_judge_instructions": "Award 3 points if the answer is 'both' with a correct brief explanation (e.g., due to race between lw and sw, both stores can appear to succeed). Award 1 point if the correct label is given without explanation. 0 points otherwise." + "tags": ["mips","spinlock","llsc"], + "answer": "Both", + "llm_judge_instructions": "Award 3 points for answering 'Both' with brief justification that without ll/sc atomicity both stores can succeed and both threads may believe they hold the lock. Award 0 otherwise." } ``` @@ -275,16 +259,16 @@ Which thread(s) will believe that they have acquired the spinlock after this seq ## Question 7a [2 point(s)] -What is the difference between a thread yielding and a thread blocking? +a. (2 marks) What is the difference between a thread yielding and a thread blocking? ```json { "problem_id": "7a", "points": 2, "type": "Freeform", - "tags": ["threading", "scheduling"], - "answer": "A yielded thread moves from running to ready and can be scheduled again; a blocked thread is not running or ready and waits on a resource until it becomes available.", - "llm_judge_instructions": "Award 2 points for a correct description: yielding moves a thread from running to ready (scheduler may reschedule it), blocking moves a thread to a waiting state until a resource/event occurs. 1 point for partial description. 0 points otherwise." + "tags": ["threads","scheduling"], + "answer": "A yielding thread moves from running to ready and can be immediately scheduled again; a blocked thread is not runnable and waits for a resource, so it cannot be scheduled until unblocked.", + "llm_judge_instructions": "Award 2 points for a correct distinction mentioning that yield makes the thread ready (runnable) while blocking makes it non-runnable and waiting for a resource. Award 0 otherwise." } ``` @@ -292,21 +276,16 @@ What is the difference between a thread yielding and a thread blocking? ## Question 7b [2 point(s)] -When an exception or interrupt occurs, a trap frame must be created to preserve the application’s context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? - -Possible answers: -• The stack pointer is an application-owned register, and thus can’t be trusted to be pointing at a valid stack. -• Using the application stack would expose kernel data to the application. -• Using the application stack would require the application to budget virtual memory for (unknown) kernel usage. +b. (2 marks) When an exception or interrupt occurs, a trap frame must be created to preserve the application’s context. This trap frame is put on a separate kernel stack, instead of the application’s stack: why? List the reasons why a kernel stack is used. ```json { "problem_id": "7b", "points": 2, "type": "Freeform", - "tags": ["os", "traps", "kernel"], - "answer": "Using the application stack would expose kernel data to the application. The stack pointer is not trusted to point to a valid kernel stack in the application’s address space.", - "llm_judge_instructions": "Award 2 points for stating either that using the application stack would expose kernel data to the application or that the user-controlled stack pointer cannot be trusted to point to a valid kernel stack (or both). Award 1 point for a partially correct reason. 0 points otherwise." + "tags": ["traps","kernel"], + "answer": "Because the user stack pointer is user-controlled and may be invalid, using a kernel stack protects kernel data from user access and avoids requiring the kernel to rely on user-space memory for kernel needs.", + "llm_judge_instructions": "Award 2 points for mentioning that the user stack pointer may be invalid/untrusted and that using a kernel stack protects kernel data and avoids depending on user memory. Award partial credit for mentioning one of these reasons." } ``` @@ -314,53 +293,17 @@ Possible answers: ## Question 7c [2 point(s)] -Both wait channels and condition variables can be used to make threads block. How does a wait channel differ from a condition variable? In particular, how does wchan_sleep differ from cv_wait? +c. (2 marks) Both wait channels and condition variables can be used to make threads block. How does wchan_sleep differ from cv_wait? ```json { "problem_id": "7c", "points": 2, "type": "Freeform", - "tags": ["wait-channel", "condition-variable"], - "answer": "Wait channels block without requiring an associated lock; wchan_sleep blocks the thread until signaled on the channel, whereas cv_wait uses a lock and releases it while blocking, reacquiring it upon wakeup.", - "llm_judge_instructions": "Award 2 points for correctly distinguishing that wchan_sleep does not require the caller to hold a mutex and operates on a wait-channel object, while cv_wait requires a mutex and releases/reacquires it atomically with sleeping. 1 point for partial correctness. 0 points otherwise." -} -``` - ---- - -## Question 8a [2 point(s)] - -Process P calls the fork system call and creates process C. Process P exits before process C exits. Assume that the kernel does not allow a process to call waitpid on any process except its children. Are any of the following statements definitely true at the time that P exits? Circle any that are true. -• Process P’s PID can be safely re-used by the kernel. -• Process C inherits process P’s PID. -• Process C terminates automatically. -• Process P will not be allowed to exit until C exits. - -```json -{ - "problem_id": "8a", - "points": 2, - "type": "Freeform", - "tags": ["process-management", "fork", "exit"], - "answer": "None of the statements are definitely true at P's exit.", - "llm_judge_instructions": "Award 2 points for identifying that none of the listed statements are definitely true when P exits (brief justification optional). 1 point for a partially correct justification. 0 points otherwise." + "tags": ["wait-channel","condition-variable"], + "answer": "wchan_sleep blocks the calling thread without automatically releasing or reacquiring a lock; cv_wait blocks and atomically releases the associated lock and reacquires it upon wakeup.", + "llm_judge_instructions": "Award 2 points for correctly stating that cv_wait atomically releases and reacquires an associated lock while wchan_sleep does not manage a lock. Award 0 otherwise." } ``` ---- - -## Question 8b [4 point(s)] - -Consider a virtual memory system with 64-bit virtual addresses, and a page size of 32KB (2^15 bytes). The system uses multi-level paging. Each page table holds at most 2^13 entries, and each page directory holds at most 2^12 entries. In the worst case, how many memory accesses are required to translate a virtual address to a physical address? - -```json -{ - "problem_id": "8b", - "points": 4, - "type": "Freeform", - "tags": ["virtual-memory", "paging", "translation"], - "answer": "4", - "llm_judge_instructions": "Award 4 points if the answer matches the expected worst-case number of memory accesses as determined by the number of page-table levels plus the final data access (student should show reasoning). Award 2 points for a plausible but incomplete calculation. 0 points otherwise." -} -``` \ No newline at end of file +--- \ No newline at end of file