From f6309afe7ce5c30c5d7a2c8b501b283d35b18911 Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 11:54:15 -0500 Subject: [PATCH 1/3] add CS 350 Winter 2015 Midterm --- .../W15-midterm-soln.pdf | Bin 0 -> 86400 bytes .../raw/cs350_winter_2015_midterm/exam.md | 281 ++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/W15-midterm-soln.pdf create mode 100644 benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md diff --git a/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/W15-midterm-soln.pdf b/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/W15-midterm-soln.pdf new file mode 100644 index 0000000000000000000000000000000000000000..628a37c5155132163b36a57ddb5a5410bf1b5ec1 GIT binary patch literal 86400 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 = lock_create(\"barrier\");\n b->b_cv = cv_create(\"barrier\");\n b->b_threads_expected = thread_count;\n b->b_threads_reached = 0;\n return b;\n}\n\nvoid barrier_wait(struct barrier *b)\n{\n lock_acquire(b->b_lock);\n b->b_threads_reached++;\n if (b->b_threads_reached == b->b_threads_expected) {\n /* reset for reuse */\n b->b_threads_reached = 0;\n cv_broadcast(b->b_cv, b->b_lock);\n } else {\n cv_wait(b->b_cv, b->b_lock);\n }\n lock_release(b->b_lock);\n}", + "llm_judge_instructions": "Total 12 points. Award 4 points for a correct barrier structure (fields for reached count, expected count, a lock, and a cv). Award 4 points for barrier_create that allocates the structure, initializes b_threads_expected and b_threads_reached, and creates the lock and cv. Award 4 points for barrier_wait logic: acquire the lock, increment count, if count equals expected then reset count and cv_broadcast, else cv_wait, then release lock. Partial credit: award points within each 4-point group for partially correct or nearly correct implementations (e.g., correct locking but missing reset = partial credit)." +} +``` + +--- + +## Question 4 [9 point(s)] + +Problem 6 (9 marks) +Some possibly useful info: 2^10 = 1 KB, 2^20 = 1 MB, 2^30 = 1 GB. +In this question all addresses, virtual page numbers and physical frame numbers are represented in octal. +Recall that each octal character represents 3 bits. Note: to make some numbers easier to read, spaces have +been added between every 3 octal characters. Please also use this convention when providing your answers. +Consider a machine with 39-bit virtual addresses, 33-bit physical addresses and a page size of 262,144 bytes +(256 KB). During a program’s execution the TLB contains the following entries (all in octal). In this example +Dirty means that the page can be dirtied (i.e., written to). +Virtual Page Num Physical Frame Num Valid Bit Dirty Bit +0 061 25206 12510 +6 125 273 01 23400 +0 000 061 30 13011 +0 000 612 61 25211 +If possible, explain how addresses given below (in octal) will be translated and provide the requested +translated address. If a translation is not possible, explain what will happen and why. Show and explain +how you derived your answer. Express all physical addresses using all 33-bits and all virtual addresses +using all 39-bits. +a.(3 mark(s)) The physical address that results from a load from virtual address = 6 125 273 127 604 + +b.(3 mark(s)) The physical address that results from a store to virtual address = 0 000 061 252 127. + +c.(3 mark(s)) Can a store be performed on the physical address = 61 252 612 522? If yes, provide the +virtual address used to access this physical address and if not explain precisely why not. +```json +{ + "problem_id": "4", + "points": 9, + "type": "Freeform", + "tags": ["virtual-memory","tlb","paging","address-translation"], + "answer": "a) The virtual page number is 6125273 (octal). That VPN is not valid in the TLB, so a TLB miss/exception occurs and no physical address can be produced from the TLB alone. (3 pts)\n\nb) Virtual address splits into VPN 0 000 061 and offset 252127. VPN 0 000 061 is present in the TLB and is valid and writable; its frame is 30 130 (octal). The resulting physical address is 30 130 252 127. (3 pts)\n\nc) The physical frame 61 252 is present in the TLB mapped from virtual page 0 000 612 and the mapping is valid and dirty/writeable. Therefore a store can be performed. The corresponding virtual address is 0 000 612 612 522 (VPN 0 000 612 with offset 612522). (3 pts)", + "llm_judge_instructions": "Award 3 points for each part. Part a: 3 pts for identifying that VPN 6125273 is not valid in the TLB and that a TLB miss/exception occurs. Part b: 3 pts for correctly translating to 30 130 252 127. Part c: 3 pts for recognizing the mapping from frame 61 252 to VPN 0 000 612, confirming write permission, and providing virtual address 0 000 612 612 522." +} +``` + +--- + +## Question 5 [9 point(s)] + +Problem 7 (9 marks) +Note: to make some numbers easier to read, spaces have been added between every 4 hexadecimal characters. +Please also use this convention when providing your answers. +The structure addrspace shown below describes the address space of a running process on a slightly modified +MIPS processor. The addrspace and modified processor are similar to the dumbvm and MIPS processor +provided in OS161/SYS161. The key differences are that this processor uses 36-bit virtual and physical +addresses and a page size of 64 KB (0x1 0000). In a similar fashion to the 32-bit MIPS OS/161 processor the +36-bit virtual address space on this modified processor is divided into two halves. Virtual addresses from 0 to +0x7 FFFF FFFF are for user programs and virtual address from 0x8 0000 0000 to 0xF FFFF FFFF cannot be +accessed while in user mode. Fortunately, this new version of the OS161 kernel now explicitly represents the +stack as segment 3 (note the stack size). +struct addrspace { +vaddr_t as_vbase1 = 0x0 5000 0000; /* text segment: virtual base address */ +paddr_t as_pbase1 = 0x0 0010 0000; /* text segment: physical base address */ +size_t as_npages1 = 0x200; /* text segment: number of pages */ +vaddr_t as_vbase2 = 0x3 0000 0000; /* data segment: virtual base address */ +paddr_t as_pbase2 = 0x8 0000 0000; /* data segment: physical base address */ +size_t as_npages2 = 0x137; /* data segment: number of pages */ +vaddr_t as_vbase3 = 0x4 0000 0000; /* stack segment: virtual base address */ +paddr_t as_pbase3 = 0x1 0000 0000; /* stack segment: physical base address */ +size_t as_npages3 = 0x18; /* stack segment: number of pages */ +}; +For an application executing in user space that uses the address space defined above, assume that it is accessing +the specified addresses below. When possible you are to translate the provided address. If the translation +is not possible, explain why it is not possible and what would happen during translation. If the translation +is possible provide the requested translated address and indicate which segment the address belongs to. Use +hexadecimal notation for all addresses and show all 36-bits. Show and explain how you arrived at your result. +Some possibly useful values: +1 * 64 KB = 0x1 * 0x1 0000 = 0x1 0000 2 * 64 KB = 0x2 * 0x1 0000 = 0x2 0000 +10 * 64 KB = 0xA * 0x1 0000 = 0xA 0000 16 * 64 KB = 0x10 * 0x1 0000 = 0x10 0000 +32 * 64 KB = 0x20 * 0x1 0000 = 0x20 0000 +a.(3 mark(s)) Translate the Virtual Address 0x4 0017 6429 to a Physical Address. + +b.(3 mark(s)) Translate the Virtual Address 0x0 5200 AB25 to a Physical Address. + +c.(3 mark(s)) If possible, determine the user space Virtual Address that could be used to access the +Physical Address 0x8 0128 95FA. +```json +{ + "problem_id": "5", + "points": 9, + "type": "Freeform", + "tags": ["address-space","virtual-memory","mips"], + "answer": "a) Virtual 0x4 0017 6429 is in the stack segment (as_vbase3 = 0x4 0000 0000). Offset = 0x4 0017 6429 - 0x4 0000 0000 = 0x17 6429 which is less than as_npages3 * 0x10000 (0x18 0000). Physical = as_pbase3 + offset = 0x1 0000 0000 + 0x17 6429 = 0x1 0017 6429. (3 pts)\n\nb) Virtual 0x0 5200 AB25 is not within the text segment (as_vbase1 = 0x0 5000 0000, size = 0x200 pages = 0x2000000) nor any other segment: it lies outside all segments, so the access cannot be translated and would cause a page fault/segmentation fault. (3 pts)\n\nc) Physical 0x8 0128 95FA lies in as_pbase2 region (as_pbase2 = 0x8 0000 0000). Offset = 0x8 0128 95FA - 0x8 0000 0000 = 0x128 95FA which is less than as_npages2 * 0x10000 (0x137 0000). Corresponding virtual address = as_vbase2 + offset = 0x3 0000 0000 + 0x128 95FA = 0x3 0128 95FA (3 pts).", + "llm_judge_instructions": "Award 3 points each part. Part a: 3 pts for identifying stack segment and computing 0x1 0017 6429. Part b: 3 pts for correctly stating the address is not in any segment and would fault. Part c: 3 pts for computing 0x3 0128 95FA and identifying the data segment mapping." +} +``` \ No newline at end of file From aaa9465d1561f0449be70379ab2539bb58a27d00 Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 14:02:21 -0500 Subject: [PATCH 2/3] add CS350 Winter 2015 Midterm --- .../raw/cs350_winter_2015_midterm/exam.md | 233 ++---------------- 1 file changed, 25 insertions(+), 208 deletions(-) diff --git a/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md b/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md index 990c2f9e..8da361cb 100644 --- a/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md +++ b/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md @@ -1,10 +1,10 @@ -# CS 350 Winter 2015 Midterm +# CS350 Winter 2015 Midterm ```json { "exam_id": "cs350_winter_2015_midterm", - "test_paper_name": "CS 350 Winter 2015 Midterm", - "course": "CS 350", + "test_paper_name": "CS350 Winter 2015 Midterm", + "course": "CS350", "institution": "University of Waterloo", "year": 2015, "score_total": 53, @@ -16,52 +16,16 @@ ## Question 1 [9 point(s)] -Problem 1 (9 marks) -For the program shown below, assume that all function, library and system calls are successful. Recall that -the prototype/signature for thread_fork is: -int thread_fork(const char *name, struct proc *proc, -void (*func)(void *, unsigned long), -void *data1, unsigned long data2); -volatile int x = 42; -main() -{ -/* name="1", no process, runs func1 */ -/* parameters 0 and 0, not used */ -thread_fork("1",NULL,func1,0,0); -/* name="2", no process, runs func2 */ -/* parameters 0 and 0, not used */ -thread_fork("2",NULL,func2,0,0); -func3(0,0); -} -void func1(unsigned long notused, void *notused2) -{ -kprintf("A: %d\n", x); -x = 10; -} -void func2(unsigned long notused, void *notused2) -{ -kprintf("B: %d\n", x); -x = 20; -} -void func3(unsigned long notused, void *notused2) -{ -kprintf("C: %d\n", x); -x = 30; -} -When considering each line of output produced by the program above, what would the output be when -printing the value of the variable x? If more than one value or a range of values is possible, list all possible -values or ranges. -/* From func1 */ A: -/* From func2 */ B: -/* From func3 */ C: +{Question text ONLY - no answer, no solution in the text} + ```json { "problem_id": "1", "points": 9, "type": "Freeform", - "tags": ["concurrency","threading","shared-memory"], + "tags": ["concurrency","multithreading"], "answer": "A: 42 | 20 | 30\nB: 42 | 10 | 30\nC: 42 | 10 | 20", - "llm_judge_instructions": "Award 3 points for an exact correct set of possible values for line A (A: 42 | 20 | 30). Award 3 points for an exact correct set of possible values for line B (B: 42 | 10 | 30). Award 3 points for an exact correct set of possible values for line C (C: 42 | 10 | 20). If a line is present but formatted with minor spacing differences (e.g., spaces around pipes), award up to 2 points for that line. Award 0 points for a completely incorrect or missing line." + "llm_judge_instructions": "Award 3 points for each line (A, B, C) that exactly matches the corresponding correct value. 3 pts for line A exact match; 3 pts for line B exact match; 3 pts for line C exact match. Total possible: 9 points." } ``` @@ -69,58 +33,16 @@ values or ranges. ## Question 2 [14 point(s)] -Problem 2 (14 marks) -For the program shown below, what output would be printed when it runs? If a range or multiple values are -possible, give the range or possible values. If it is not possible to determine the value, possible values or a -range, state so and explain why. Assume that all function, library and system calls are successful. If more than -one ordering of output is possible choose one of the possible orderings. Recall that WEXITSTATUS(status) just -gets the exit code portion of the status variable. -int x = 42; -main() -{ -int rc, status; -rc = fork(); -if (rc == 0) { -func1(); -_exit(1); -} else { -rc = waitpid(rc, &status, 0); -printf("R: %d", WEXITSTATUS(status)); -printf("M: %d\n", x); -x = 100; -printf("P: %d\n", x); -_exit(2); -} -func2(); -} -void func1() -{ -int rc, status; -printf("T: %d\n", x); -x = 10; -rc = fork(); -if (rc == 0) { -x = 50; -printf("Q: %d\n", x); -_exit(3); -} -rc = waitpid(rc, &status, 0) -printf("A: %d\n", x); -printf("D: %d", WEXITSTATUS(status)); -_exit(4); -} -void func2() -{ -printf("C: %d\n", x); -} +{Question text ONLY - no answer, no solution in the text} + ```json { "problem_id": "2", "points": 14, "type": "Freeform", - "tags": ["processes","fork","wait","exit-status","ipc"], - "answer": "T: 42\nQ: 50\nA: 10\nD: 3\nR: 4\nM: 42\nP: 100\nC: (does not get printed in this execution path)", - "llm_judge_instructions": "There are 7 scored output lines (T, Q, A, D, R, M, P). Award 2 points for each exactly correct line and value: T: 42 (2 pts), Q: 50 (2 pts), A: 10 (2 pts), D: 3 (2 pts), R: 4 (2 pts), M: 42 (2 pts), P: 100 (2 pts). Do not award points for any commentary lines (e.g., notes about C). Total possible: 14." + "tags": ["processes","fork","exit-status"], + "answer": "T: 42\nQ: 50\nA: 10\nD: 3\nR: 4\nM: 42\nP: 100", + "llm_judge_instructions": "Award 14 points for an exact match of the entire output string including newline characters as shown. If the student's entire output exactly equals the answer string, award 14 points. If any character or line differs, award 0 points. Total possible: 14 points." } ``` @@ -128,65 +50,16 @@ printf("C: %d\n", x); ## Question 3 [12 point(s)] -Problem 5 (12 marks) -Barrier synchronization can be used to prevent threads from proceeding until a specified number of threads -have reached the barrier. Threads reaching the barrier block until the last of the specified number of threads -has reached the barrier, at which point all threads can proceed. Below is a partial pseudocode example of how -barrier synchronization might be used. - /* Used to wait for all mice to be ready to all attack together */ - struct barrier *attack_barrier; - /* Used to wait for all mice and the main thread so they can all go to the bar together */ - struct barrier *bar_barrier; - main() - { - unsigned int i; - attack_barrier = barrier_create(NUM_MICE); - bar_barrier = barrier_create(NUM_MICE+1); - for (i=0; ib_lock = lock_create(\"barrier\");\n b->b_cv = cv_create(\"barrier\");\n b->b_threads_expected = thread_count;\n b->b_threads_reached = 0;\n return b;\n}\n\nvoid barrier_wait(struct barrier *b)\n{\n lock_acquire(b->b_lock);\n b->b_threads_reached++;\n if (b->b_threads_reached == b->b_threads_expected) {\n /* reset for reuse */\n b->b_threads_reached = 0;\n cv_broadcast(b->b_cv, b->b_lock);\n } else {\n cv_wait(b->b_cv, b->b_lock);\n }\n lock_release(b->b_lock);\n}", - "llm_judge_instructions": "Total 12 points. Award 4 points for a correct barrier structure (fields for reached count, expected count, a lock, and a cv). Award 4 points for barrier_create that allocates the structure, initializes b_threads_expected and b_threads_reached, and creates the lock and cv. Award 4 points for barrier_wait logic: acquire the lock, increment count, if count equals expected then reset count and cv_broadcast, else cv_wait, then release lock. Partial credit: award points within each 4-point group for partially correct or nearly correct implementations (e.g., correct locking but missing reset = partial credit)." + "tags": ["concurrency","barrier","threads"], + "answer": "struct barrier {\n/* This MUST be volatile */\nvolatile unsigned int b_threads_reached; /* how many have reached the barrier */\n/* This does not need to be volatile, only changed by one thread at init time */\nunsigned int b_threads_expected; /* num threads to wait for*/\nstruct lock *b_lock; /* lock used to protect count and reached */\nstruct cv *b_cv; /* cv used to wait when needed */\n};\nstruct barrier *barrier_create(unsigned int thread_count)\n{\nstruct barrier *b = (struct barrier *) kmalloc(sizeof(barrier));\nb->b_lock = lock_create(\"barrier\");\nb->b_cv = cv_create(\"barrier\");\nb->b_threads_expected = thread_count;\nb->b_threads_reached = 0;\nreturn b;\n}\nbarrier_wait(struct barrier *b)\n{\nlock_acquire(b->b_lock);\nb->b_threads_reached++;\nif (b->b_threads_reached == b->b_threads_expected) {\n/* Must reset number of threads reached to use the barrier more than once */\n/* This could be done before or after broadcast */\nb->b_threads_reached = 0;\ncv_broadcast(b->b_cv, b->b_lock);\n} else {\ncv_wait(b->b_cv, b->b_lock);\n}\nlock_release(b->b_lock);\n}", + "llm_judge_instructions": "Score breakdown (total 12 pts): barrier_create (4 pts): 1 pt for allocating the barrier structure, 1 pt for creating/assigning b_lock, 1 pt for creating/assigning b_cv, 1 pt for initializing b_threads_expected and b_threads_reached correctly. barrier_wait (8 pts): 2 pts for correctly acquiring and releasing the lock, 2 pts for correctly incrementing the reached count, 3 pts for correctly broadcasting/waking all waiting threads when reached equals expected, 1 pt for resetting b_threads_reached to allow reuse of the barrier. Partial credit awarded per item; total possible: 12 points." } ``` @@ -194,37 +67,16 @@ barrier_wait(struct barrier *b) ## Question 4 [9 point(s)] -Problem 6 (9 marks) -Some possibly useful info: 2^10 = 1 KB, 2^20 = 1 MB, 2^30 = 1 GB. -In this question all addresses, virtual page numbers and physical frame numbers are represented in octal. -Recall that each octal character represents 3 bits. Note: to make some numbers easier to read, spaces have -been added between every 3 octal characters. Please also use this convention when providing your answers. -Consider a machine with 39-bit virtual addresses, 33-bit physical addresses and a page size of 262,144 bytes -(256 KB). During a program’s execution the TLB contains the following entries (all in octal). In this example -Dirty means that the page can be dirtied (i.e., written to). -Virtual Page Num Physical Frame Num Valid Bit Dirty Bit -0 061 25206 12510 -6 125 273 01 23400 -0 000 061 30 13011 -0 000 612 61 25211 -If possible, explain how addresses given below (in octal) will be translated and provide the requested -translated address. If a translation is not possible, explain what will happen and why. Show and explain -how you derived your answer. Express all physical addresses using all 33-bits and all virtual addresses -using all 39-bits. -a.(3 mark(s)) The physical address that results from a load from virtual address = 6 125 273 127 604 - -b.(3 mark(s)) The physical address that results from a store to virtual address = 0 000 061 252 127. +{Question text ONLY - no answer, no solution in the text} -c.(3 mark(s)) Can a store be performed on the physical address = 61 252 612 522? If yes, provide the -virtual address used to access this physical address and if not explain precisely why not. ```json { "problem_id": "4", "points": 9, "type": "Freeform", - "tags": ["virtual-memory","tlb","paging","address-translation"], - "answer": "a) The virtual page number is 6125273 (octal). That VPN is not valid in the TLB, so a TLB miss/exception occurs and no physical address can be produced from the TLB alone. (3 pts)\n\nb) Virtual address splits into VPN 0 000 061 and offset 252127. VPN 0 000 061 is present in the TLB and is valid and writable; its frame is 30 130 (octal). The resulting physical address is 30 130 252 127. (3 pts)\n\nc) The physical frame 61 252 is present in the TLB mapped from virtual page 0 000 612 and the mapping is valid and dirty/writeable. Therefore a store can be performed. The corresponding virtual address is 0 000 612 612 522 (VPN 0 000 612 with offset 612522). (3 pts)", - "llm_judge_instructions": "Award 3 points for each part. Part a: 3 pts for identifying that VPN 6125273 is not valid in the TLB and that a TLB miss/exception occurs. Part b: 3 pts for correctly translating to 30 130 252 127. Part c: 3 pts for recognizing the mapping from frame 61 252 to VPN 0 000 612, confirming write permission, and providing virtual address 0 000 612 612 522." + "tags": ["virtual-memory","tlb","paging"], + "answer": "a) The physical address from load at virtual address 6 125 273 127 604: translation not possible; TLB miss/exception. b) The physical address from store at virtual address 0 000 061 252 127: 30 130 252 127. c) A store to physical address 61 252 612 522: yes; virtual address 0 000 612 612 522.", + "llm_judge_instructions": "Treat parts a, b, c as independent subparts. Award 3 points for part (a) if the student gives the correct result (exception/translation not possible) exactly as specified; award 3 points for part (b) if the student gives the exact correct translated physical address \"30 130 252 127\"; award 3 points for part (c) if the student gives the exact correct virtual address \"0 000 612 612 522\" and indicates that the store is possible. Total possible: 9 points." } ``` @@ -232,50 +84,15 @@ virtual address used to access this physical address and if not explain precisel ## Question 5 [9 point(s)] -Problem 7 (9 marks) -Note: to make some numbers easier to read, spaces have been added between every 4 hexadecimal characters. -Please also use this convention when providing your answers. -The structure addrspace shown below describes the address space of a running process on a slightly modified -MIPS processor. The addrspace and modified processor are similar to the dumbvm and MIPS processor -provided in OS161/SYS161. The key differences are that this processor uses 36-bit virtual and physical -addresses and a page size of 64 KB (0x1 0000). In a similar fashion to the 32-bit MIPS OS/161 processor the -36-bit virtual address space on this modified processor is divided into two halves. Virtual addresses from 0 to -0x7 FFFF FFFF are for user programs and virtual address from 0x8 0000 0000 to 0xF FFFF FFFF cannot be -accessed while in user mode. Fortunately, this new version of the OS161 kernel now explicitly represents the -stack as segment 3 (note the stack size). -struct addrspace { -vaddr_t as_vbase1 = 0x0 5000 0000; /* text segment: virtual base address */ -paddr_t as_pbase1 = 0x0 0010 0000; /* text segment: physical base address */ -size_t as_npages1 = 0x200; /* text segment: number of pages */ -vaddr_t as_vbase2 = 0x3 0000 0000; /* data segment: virtual base address */ -paddr_t as_pbase2 = 0x8 0000 0000; /* data segment: physical base address */ -size_t as_npages2 = 0x137; /* data segment: number of pages */ -vaddr_t as_vbase3 = 0x4 0000 0000; /* stack segment: virtual base address */ -paddr_t as_pbase3 = 0x1 0000 0000; /* stack segment: physical base address */ -size_t as_npages3 = 0x18; /* stack segment: number of pages */ -}; -For an application executing in user space that uses the address space defined above, assume that it is accessing -the specified addresses below. When possible you are to translate the provided address. If the translation -is not possible, explain why it is not possible and what would happen during translation. If the translation -is possible provide the requested translated address and indicate which segment the address belongs to. Use -hexadecimal notation for all addresses and show all 36-bits. Show and explain how you arrived at your result. -Some possibly useful values: -1 * 64 KB = 0x1 * 0x1 0000 = 0x1 0000 2 * 64 KB = 0x2 * 0x1 0000 = 0x2 0000 -10 * 64 KB = 0xA * 0x1 0000 = 0xA 0000 16 * 64 KB = 0x10 * 0x1 0000 = 0x10 0000 -32 * 64 KB = 0x20 * 0x1 0000 = 0x20 0000 -a.(3 mark(s)) Translate the Virtual Address 0x4 0017 6429 to a Physical Address. - -b.(3 mark(s)) Translate the Virtual Address 0x0 5200 AB25 to a Physical Address. +{Question text ONLY - no answer, no solution in the text} -c.(3 mark(s)) If possible, determine the user space Virtual Address that could be used to access the -Physical Address 0x8 0128 95FA. ```json { "problem_id": "5", "points": 9, "type": "Freeform", - "tags": ["address-space","virtual-memory","mips"], - "answer": "a) Virtual 0x4 0017 6429 is in the stack segment (as_vbase3 = 0x4 0000 0000). Offset = 0x4 0017 6429 - 0x4 0000 0000 = 0x17 6429 which is less than as_npages3 * 0x10000 (0x18 0000). Physical = as_pbase3 + offset = 0x1 0000 0000 + 0x17 6429 = 0x1 0017 6429. (3 pts)\n\nb) Virtual 0x0 5200 AB25 is not within the text segment (as_vbase1 = 0x0 5000 0000, size = 0x200 pages = 0x2000000) nor any other segment: it lies outside all segments, so the access cannot be translated and would cause a page fault/segmentation fault. (3 pts)\n\nc) Physical 0x8 0128 95FA lies in as_pbase2 region (as_pbase2 = 0x8 0000 0000). Offset = 0x8 0128 95FA - 0x8 0000 0000 = 0x128 95FA which is less than as_npages2 * 0x10000 (0x137 0000). Corresponding virtual address = as_vbase2 + offset = 0x3 0000 0000 + 0x128 95FA = 0x3 0128 95FA (3 pts).", - "llm_judge_instructions": "Award 3 points each part. Part a: 3 pts for identifying stack segment and computing 0x1 0017 6429. Part b: 3 pts for correctly stating the address is not in any segment and would fault. Part c: 3 pts for computing 0x3 0128 95FA and identifying the data segment mapping." + "tags": ["virtual-memory","address-space","mips"], + "answer": "a) Part of the stack segment. 0x4 0017 6429 - 0x4 0000 0000 = 0x17 6429; translation to 0x1 0017 6429. b) No translation. This address is not part of ANY segment. c) Part of the data segment. 0x8 0128 95FA - 0x8 0000 0000 = 0x128 95FA; translated to 0x3 0128 95FA.", + "llm_judge_instructions": "Award 3 points for each part (a), (b), (c). For (a): 3 pts if student correctly identifies the segment as stack and gives the translation 0x1 0017 6429. For (b): 3 pts if student correctly states there is no translation because the address is not in any segment. For (c): 3 pts if student correctly identifies the data segment and gives the translation 0x3 0128 95FA. Total possible: 9 points." } ``` \ No newline at end of file From 9ed71f8b36d0880f05263b5767d9706d6ebc12e7 Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 22:19:15 -0500 Subject: [PATCH 3/3] add CS 350 Winter 2015 Midterm --- .../raw/cs350_winter_2015_midterm/exam.md | 271 ++++++++++++++++-- 1 file changed, 242 insertions(+), 29 deletions(-) diff --git a/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md b/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md index 8da361cb..6a076dc6 100644 --- a/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md +++ b/benchmarks/courseexam_bench/data/raw/cs350_winter_2015_midterm/exam.md @@ -1,14 +1,14 @@ -# CS350 Winter 2015 Midterm +# CS 350 Winter 2015 Midterm ```json { "exam_id": "cs350_winter_2015_midterm", - "test_paper_name": "CS350 Winter 2015 Midterm", + "test_paper_name": "CS 350 Winter 2015 Midterm", "course": "CS350", "institution": "University of Waterloo", "year": 2015, "score_total": 53, - "num_questions": 5 + "num_questions": 9 } ``` @@ -16,16 +16,51 @@ ## Question 1 [9 point(s)] -{Question text ONLY - no answer, no solution in the text} - +For the program shown below, assume that all function, library and system calls are successful. Recall that the prototype/signature forthread +forkis: +int thread_fork(const char *name, struct proc *proc, +void (*func)(void *, unsigned long), +void *data1, unsigned long data2); +volatile int x = 42; +main() +{ +/* name="1", no process, runs func1 */ +/* parameters 0 and 0, not used */ +thread_fork("1",NULL,func1,0,0); +/* name="2", no process, runs func2 */ +/* parameters 0 and 0, not used */ +thread_fork("2",NULL,func2,0,0); +func3(0,0); +} +void func1(unsigned long notused, void *notused2) +{ +kprintf("A: %d\n", x); +x = 10; +} +void func2(unsigned long notused, void *notused2) +{ +kprintf("B: %d\n", x); +x = 20; +} +void func3(unsigned long notused, void *notused2) +{ +kprintf("C: %d\n", x); +x = 30; +} +When consdering each line of output produced by the program above, what would the output be when +printing the value of the variablex? If more than one value or a range of values is possible, list all possible +values or ranges. +/* From func1 */ A: +/* From func2 */ B: +/* From func3 */ C: ```json { "problem_id": "1", "points": 9, "type": "Freeform", - "tags": ["concurrency","multithreading"], + "tags": ["os161", "threads", "concurrency"], "answer": "A: 42 | 20 | 30\nB: 42 | 10 | 30\nC: 42 | 10 | 20", - "llm_judge_instructions": "Award 3 points for each line (A, B, C) that exactly matches the corresponding correct value. 3 pts for line A exact match; 3 pts for line B exact match; 3 pts for line C exact match. Total possible: 9 points." + "llm_judge_instructions": "Award 3 points for each line (A, B, C) as follows. For line A: award 3 points if the student's A line equals one of {42, 20, 30}. For line B: award 3 points if the student's B line equals one of {42, 10, 30}. For line C: award 3 points if the student's C line equals one of {42, 10, 20}. No partial credit for variants not in these sets. Total possible: 9 points." } ``` @@ -33,16 +68,53 @@ ## Question 2 [14 point(s)] -{Question text ONLY - no answer, no solution in the text} - +For the program shown below, what output would be printed when it runs? If a range or multiple values are possible, give the range or possible values. If it is not possible to determine the value, posssible values or a range, state so and explain why. Assume that all function, library and system calls are successful. If more than one ordering of output is possible choose one of the possibleorderings. Recall thatWEXITSTATUS(status)just gets the exit code portion of thestatusvariable. +int x = 42; +main() +{ +int rc, status; +rc = fork(); +if (rc == 0) { +func1(); +_exit(1); +} else { +rc = waitpid(rc, &status, 0); +printf("R: %d", WEXITSTATUS(status)); +printf("M: %d\n", x); +x = 100; +printf("P: %d\n", x); +_exit(2); +} +func2(); +} +void func1() +{ +int rc, status; +printf("T: %d\n", x); +x = 10; +rc = fork(); +if (rc == 0) { +x = 50; +printf("Q: %d\n", x); +_exit(3); +} +rc = waitpid(rc, &status, 0) +printf("A: %d\n", x); +printf("D: %d", WEXITSTATUS(status)); +_exit(4); +} +void func2() +{ +printf("C: %d\n", x); +} ```json { "problem_id": "2", "points": 14, "type": "Freeform", - "tags": ["processes","fork","exit-status"], + "tags": ["os161", "processes", "fork-wait"], "answer": "T: 42\nQ: 50\nA: 10\nD: 3\nR: 4\nM: 42\nP: 100", - "llm_judge_instructions": "Award 14 points for an exact match of the entire output string including newline characters as shown. If the student's entire output exactly equals the answer string, award 14 points. If any character or line differs, award 0 points. Total possible: 14 points." + "llm_judge_instructions": "There are seven expected output lines: T, Q, A, D, R, M, P. Award 2 points for each line if the student's line matches exactly one of the expected lines and values: T: 42; Q: 50; A: 10; D: 3; R: 4; M: 42; P: 100. Do not award points for any C line as it does not appear in a valid execution ordering for this program. Total possible: 14 points." } ``` @@ -50,49 +122,190 @@ ## Question 3 [12 point(s)] -{Question text ONLY - no answer, no solution in the text} +Barrier synchronization can be used to prevent threads fromproceeding until a specified number of threads have reached the barrier. Threads reaching the barrier block until the last of the specified number of threads has reached the barrier, at which point all threads can proceed. Below is a partial pseudocode example of how barrier synchronization might be used. +/* Used to wait for all mice to be ready to all attack together */ +struct barrier *attack_barrier; +/* Used to wait for all mice and the main thread so they can all go to the bar together */ +struct barrier *bar_barrier; +main() +{ +unsigned int i; +attack_barrier = barrier_create(NUM_MICE); +bar_barrier = barrier_create(NUM_MICE+1); +for (i=0; ib_lock = lock_create(\"barrier\");\nb->b_cv = cv_create(\"barrier\");\nb->b_threads_expected = thread_count;\nb->b_threads_reached = 0;\nreturn b;\n}\nbarrier_wait(struct barrier *b)\n{\nlock_acquire(b->b_lock);\nb->b_threads_reached++;\nif (b->b_threads_reached == b->b_threads_expected) {\n/* Must reset number of threads reached to use the barrier more than once */\n/* This could be done before or after broadcast */\nb->b_threads_reached = 0;\ncv_broadcast(b->b_cv, b->b_lock);\n} else {\ncv_wait(b->b_cv, b->b_lock);\n}\nlock_release(b->b_lock);\n}", - "llm_judge_instructions": "Score breakdown (total 12 pts): barrier_create (4 pts): 1 pt for allocating the barrier structure, 1 pt for creating/assigning b_lock, 1 pt for creating/assigning b_cv, 1 pt for initializing b_threads_expected and b_threads_reached correctly. barrier_wait (8 pts): 2 pts for correctly acquiring and releasing the lock, 2 pts for correctly incrementing the reached count, 3 pts for correctly broadcasting/waking all waiting threads when reached equals expected, 1 pt for resetting b_threads_reached to allow reuse of the barrier. Partial credit awarded per item; total possible: 12 points." + "tags": ["barrier", "concurrency", "synchronization"], + "answer": "struct barrier {\n/* This MUST be volatile */\nvolatile unsigned int b_threads_reached; /* how many have reached the barrier */\n/* This does not need to be volatile, only changed by one thread at init time */\nunsigned int b_threads_expected; /* num threads to wait for*/\nstruct lock *b_lock; /* lock used to protect count and reached */\nstruct cv *b_cv; /* cv used to wait when needed */\n};\nstruct barrier *barrier_create(unsigned int thread_count)\n{\nstruct barrier *b = (struct barrier *) kmalloc(sizeof(struct barrier));\nb->b_lock = lock_create(\"barrier\");\nb->b_cv = cv_create(\"barrier\");\nb->b_threads_expected = thread_count;\nb->b_threads_reached = 0;\nreturn b;\n}\nvoid barrier_wait(struct barrier *b)\n{\nlock_acquire(b->b_lock);\nb->b_threads_reached++;\nif (b->b_threads_reached == b->b_threads_expected) {\n/* Must reset number of threads reached to use the barrier more than once */\nb->b_threads_reached = 0;\ncv_broadcast(b->b_cv, b->b_lock);\n} else {\ncv_wait(b->b_cv, b->b_lock);\n}\nlock_release(b->b_lock);\n}", + "llm_judge_instructions": "Grade with the following explicit rubric (total 12 pts): barrier_create (4 pts): 1 pt for allocating the struct (non-NULL return), 1 pt for creating/assigning the lock, 1 pt for creating/assigning the cv, 1 pt for setting b_threads_expected and initializing b_threads_reached to 0. barrier_wait (8 pts): 2 pts for acquiring the lock and incrementing the counter correctly, 2 pts for implementing the 'last thread' path that resets the counter and does a broadcast, 2 pts for implementing the waiting path using cv_wait, 2 pts for releasing the lock and ensuring correctness for reuse of the barrier. Award partial credit only for the components listed above." } ``` --- -## Question 4 [9 point(s)] - -{Question text ONLY - no answer, no solution in the text} +## Question 4 [3 point(s)] +The physical address that results from a load from virtual address = 6 125 273 127 604 ```json { "problem_id": "4", - "points": 9, + "points": 3, "type": "Freeform", - "tags": ["virtual-memory","tlb","paging"], - "answer": "a) The physical address from load at virtual address 6 125 273 127 604: translation not possible; TLB miss/exception. b) The physical address from store at virtual address 0 000 061 252 127: 30 130 252 127. c) A store to physical address 61 252 612 522: yes; virtual address 0 000 612 612 522.", - "llm_judge_instructions": "Treat parts a, b, c as independent subparts. Award 3 points for part (a) if the student gives the correct result (exception/translation not possible) exactly as specified; award 3 points for part (b) if the student gives the exact correct translated physical address \"30 130 252 127\"; award 3 points for part (c) if the student gives the exact correct virtual address \"0 000 612 612 522\" and indicates that the store is possible. Total possible: 9 points." + "tags": ["virtual-memory", "tlb", "paging"], + "answer": "THIS DOES NOT NEED TO BE STATED OR REPEATED FOR THIS PART.\n$2^{18}$ = 256 KB so 18 bits for offset. 39-18 = 21 for VPN.\n18 bits = 6 octal characters for offset, 21 bits = 7 octal characters for VPN.\nSo the first 7 octal characters are the VPN and the last 6 are the offset.\n612 5273 | 127 604\nlookup 612 5273 in TLB valid bit is NOT set so exception.", + "llm_judge_instructions": "Award 3 points for a correct answer identifying that the TLB lookup results in a TLB miss/exception because the valid bit is not set. If the student correctly splits the VPN and offset but does not conclude the exception, award 1-2 points (2 pts for correct VPN/offset split, 1 pt for indicating a TLB lookup occurred). Total possible: 3 pts." } ``` --- -## Question 5 [9 point(s)] - -{Question text ONLY - no answer, no solution in the text} +## Question 5 [3 point(s)] +The physical address that results from a store to virtual address = 0 000 061 252 127. ```json { "problem_id": "5", - "points": 9, + "points": 3, + "type": "Freeform", + "tags": ["virtual-memory", "tlb", "paging"], + "answer": "0 000 061 | 252 127.\n0 000 061 is in the TLB and is valid and can be dirtied so translation occurs.\nResulting frame is 30 130.\nSo resulting address is 30 130 252 127.", + "llm_judge_instructions": "Award 3 points total: 2 points for the correct final physical address 30 130 252 127, and 1 point for correctly stating that the TLB entry is a hit and allows the page to be dirtied. Partial credit: 1 point for correct justification or correct final address only." +} +``` + +--- + +## Question 6 [3 point(s)] + +Can a store be performed on thephysicaladdress = 61 252 612 522 If yes, provide the +virtual address used to access this physical address and if not explain precisely why not. +```json +{ + "problem_id": "6", + "points": 3, + "type": "Freeform", + "tags": ["virtual-memory", "tlb", "paging"], + "answer": "61 252 612 522 frame is 61 252 which is found in the TLB.\nThe page can be written and is valid so a translation occurs.\nThe corresponding page is 0 000 612 so we get the virtual address\n0 000 612 612 522", + "llm_judge_instructions": "Award 3 points if the student shows the physical frame and offset mapping and provides the virtual address 0 000 612 612 522 with justification that the TLB entry is valid and writable. Award 2 points for correct virtual address without full justification, 1 point for correct justification without exact virtual address." +} +``` + +--- + +## Question 7 [3 point(s)] + +Note: to make some numbers easier to read, spaces have been added between every 4 hexidecimal characters. +Please also use this convention when providing your answers. +The structureaddrspaceshown below describes the address space of a running processon a slightly modified +MIPS processor. Theaddrspaceand modified processor are similar to thedumbvmand MIPS processor +provided in OS161/SYS161. The key differences are that this processor uses 36-bit virtual and physical +addresses and a page size of 64 KB (0x1 0000). In a similar fashion to the 32-bit MIPS OS/161 processor the +36-bit virtual address space on this modified processor is divided into two halves. Virtual addresses from0to +0x7 FFFF FFFFare for user programs and virtual address from0x8 0000 0000to0xF FFFF FFFFcan not be +accessed while in user mode. Fortunately, this new version of the OS161 kernel now explicitly represents the stack as segment 3 (note the stack size). +struct addrspace { +vaddr_t as_vbase1 = 0x0 5000 0000; /* text segment: virtual base address */ +paddr_t as_pbase1 = 0x0 0010 0000; /* text segment: physicalbase address */ +size_t as_npages1 = 0x200; /* text segment: number of pages */ +vaddr_t as_vbase2 = 0x3 0000 0000; /* data segment: virtual base address */ +paddr_t as_pbase2 = 0x8 0000 0000; /* data segment: physicalbase address */ +size_t as_npages2 = 0x137; /* data segment: number of pages */ +vaddr_t as_vbase3 = 0x4 0000 0000; /* stack segment: virtualbase address */ +paddr_t as_pbase3 = 0x1 0000 0000; /* stack segment: physical base address */ +size_t as_npages3 = 0x18; /* stack segment: number of pages */ +}; +For an application executing in user space that uses the address space defined above, assume that it is accessing +the specified addresses below. When possible you are to translate the provided address. If the translation +is not possible, explain why it is not possible and what wouldhappen during translation. If the translation +is possible provide the requested translated address and indicate which segment the address belongs to. Use +hexadecimal notation for all addresses and show all 36-bits. Show and explain how you arrived at your result. +Some possibly useful values: +1 * 64 KB = 0x1 * 0x1 0000 = 0x1 0000 2 * 64 KB = 0x2 * 0x1 0000 = 0x2 0000 +10 * 64 KB = 0xA * 0x1 0000 = 0xA 0000 16 * 64 KB = 0x10 * 0x1 0000 = 0x10 0000 +32 * 64 KB = 0x20 * 0x1 0000 = 0x20 0000 +a.(3 point(s))Translate theVirtualAddress0x4 0017 6429to aPhysicalAddress. +```json +{ + "problem_id": "7", + "points": 3, + "type": "Freeform", + "tags": ["virtual-memory", "paging", "mips"], + "answer": "Part of the stack segment.\n0x4 0017 6429 - 0x4 0000 0000 = 0x17 6429 (this is < 0x18 pages, 0x18 0000)\nSo 0x17 6429 + 0x1 0000 0000 = 0x1 0017 6429", + "llm_judge_instructions": "Award 3 points if the student identifies the address as in the stack segment and computes the physical address 0x1 0017 6429 with correct arithmetic. Award 2 points for correct numeric translation without clear segment identification, 1 point for correct segment identification with an arithmetic error." +} +``` + +--- + +## Question 8 [3 point(s)] + +b.(3 point(s))Translate theVirtualAddress0x0 5200 AB25to aPhysicalAddress. +```json +{ + "problem_id": "8", + "points": 3, + "type": "Freeform", + "tags": ["virtual-memory", "paging", "mips"], + "answer": "No translation. This is not part of ANY segment.", + "llm_judge_instructions": "Award 3 points if the student clearly states the virtual address 0x0 5200 AB25 is not within any defined segment and explains that the translation will fault (address not mapped). Award 1-2 points for partial reasoning (1 point for stating 'not in segment' without correct explanation, 2 points for correct segment check but missing the fault explanation)." +} +``` + +--- + +## Question 9 [3 point(s)] + +c.(3 point(s))If possible, determine the user spaceVirtualAddress that could be used to access the +PhysicalAddress0x8 0128 95FA. +```json +{ + "problem_id": "9", + "points": 3, "type": "Freeform", - "tags": ["virtual-memory","address-space","mips"], - "answer": "a) Part of the stack segment. 0x4 0017 6429 - 0x4 0000 0000 = 0x17 6429; translation to 0x1 0017 6429. b) No translation. This address is not part of ANY segment. c) Part of the data segment. 0x8 0128 95FA - 0x8 0000 0000 = 0x128 95FA; translated to 0x3 0128 95FA.", - "llm_judge_instructions": "Award 3 points for each part (a), (b), (c). For (a): 3 pts if student correctly identifies the segment as stack and gives the translation 0x1 0017 6429. For (b): 3 pts if student correctly states there is no translation because the address is not in any segment. For (c): 3 pts if student correctly identifies the data segment and gives the translation 0x3 0128 95FA. Total possible: 9 points." + "tags": ["virtual-memory", "paging", "mips"], + "answer": "Part of the data segment.\n0x8 0128 95FA - 0x8 0000 0000 = 0x128 95FA (0x128 95FA < 0x137 pages = 0x137 0000).\nSo 0x128 95FA + 0x3 0000 0000 = 0x3 0128 95FA.", + "llm_judge_instructions": "Award 3 points if the student identifies the data segment and computes the corresponding user virtual address 0x3 0128 95FA with correct justification. Award 2 points for correct arithmetic without explicit segment explanation, 1 point for correct segment identification without full arithmetic." } ``` \ No newline at end of file