From 7985d0d7155ecba18881904cc2ea11920aba4d01 Mon Sep 17 00:00:00 2001 From: qimcis Date: Fri, 16 Jan 2026 23:05:28 -0500 Subject: [PATCH 1/3] add COMP 3000 Fall 2021 Final Exam --- .../comp3000-final-2021f-sol.pdf | Bin 0 -> 87137 bytes .../data/raw/comp3000_fall_2021_final/exam.md | 379 ++++++++++++++++++ 2 files changed, 379 insertions(+) create mode 100644 benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/comp3000-final-2021f-sol.pdf create mode 100644 benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md diff --git a/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/comp3000-final-2021f-sol.pdf b/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/comp3000-final-2021f-sol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c809c2324ed2442ce26fe4ff95300412804749d GIT binary patch literal 87137 zcmb5UQ>-vxldZXJ+qP}nwr$(CZQHiLZQHhO@A+pkot&imqEB5_CGYiH&#JXZ6-2~n z8R=M|NavSF)}fdQ7zpf*te|*!py*{x?aW;)2$m%19%W7J6Z^L0D1ly2DZAj}S7+}hc_M=|GYOus=w z<=8vFw|$bmm$SuQ@4tJia?BZc<~i4Y_K-c=(nViIEbrgx(#z?-wRiUmEK zvvd7DJQE~faoNV=tNU=OUu{%Pbau2FkF(?^>MzKZt&7m*m@_at5IY#--X}t$o7SW3 zIeE4)RkR4?^B|djqTP4ck$Ea_jc~+~(q%fpJ*Qmi*|r1v zi#jBoqjgcWS=?y@)To#%w{xJaWCs}8hgj)D{|0`BksZBJlk`Djbq;VOJX0J4j zfsr!`{xBQO(>q$;cXpQ_mP)-%-+N&IpRrd}Iax||BGwmCa+-!!G41KSNMMN2utFg6 zbe2}ATYnH6w8PM1_mQ0qe6D)LZP=4{F|b&OH<=SIy(HFBTsaSlA$Tqy2L9%%*#w!) zgn){2$(_r2Hw6tWrHc#h%aSH*H=d>*`*sQV_$DL<6a0osKXv5!P)X@Zh~8um4V;Fg z)8=@rF;eC{5|mgmJ+qji*;#Mbdv`%#cwFY!#S^jhLK}$^yxRY

{jmSFy$PH^$8m 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 z zyCWj9KVNtu8^O8f{L9w+y0djDru9v2xrv84E7Fxd9W4#)Vw|5`Y{~YV_fc5Ez$7cc zi_e%4N(+x?)(_&e1PWitYU4@RcO;2<{4Hty@ts<%QV|72TMSxFm4f0-hK;lmE*zkq z$U4{^)Qh}N>kPM~(5oW7HS~B{C7V4u4(`cfJ0NusDMK23j$v^qn4{xV5>)+IArx5> zgF(b)_dJz*-`5?2SLf8_q2fy9O`XbBWPkL%g1De;;K7$?yFR_%I~K^v%}%HVVQE=R zq34tj^)Ub!u?T#DZA-@md_i9*26?bJG)0CsQ7-uu#PYIRK#h_mXJxSRPRoZk!_&5S zl-fkhH%5OQP!=y&oJg+No4Ye)E~+4eFjKcD}#?4I2MNT6&hip-x~Y?*?9~WO06e)7QjCQ#

kSOlZ!V3($yq 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 vjj2yL Date: Sat, 17 Jan 2026 16:07:25 -0500 Subject: [PATCH 2/3] add COMP 3000 Fall 2021 Final --- .../data/raw/comp3000_fall_2021_final/exam.md | 149 +++++++++--------- 1 file changed, 74 insertions(+), 75 deletions(-) diff --git a/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md b/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md index 0a4683b6..e8ea7f92 100644 --- a/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md +++ b/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md @@ -1,9 +1,9 @@ -# COMP 3000 Fall 2021 Final Exam +# COMP 3000 Fall 2021 Final ```json { "exam_id": "comp3000_fall_2021_final", - "test_paper_name": "COMP 3000 Fall 2021 Final Exam", + "test_paper_name": "COMP 3000 Fall 2021 Final", "course": "COMP 3000", "institution": "Carleton University", "year": 2021, @@ -23,9 +23,9 @@ How does /dev/null behave like a regular file? How is it different? "problem_id": "1", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "You can open, read from, and write to it, just like a regular file. Unlike a regular file, data written cannot be read back, as reads always return nothing (a read of zero bytes).", - "llm_judge_instructions": "Award full points for noting that /dev/null discards written data and that reads from /dev/null return zero bytes." + "tags": ["unix","filesystem"], + "answer": "It can be opened, read from, and written to like a regular file, but data written to /dev/null cannot be read back (reads return zero bytes).", + "llm_judge_instructions": "Award 2 points for stating that /dev/null is writable/readable like a file but reads return end-of-file (no data) when reading; 0 points otherwise." } ``` @@ -33,8 +33,8 @@ How does /dev/null behave like a regular file? How is it different? ## Question 2 [2 point(s)] -What is a C statement or declaration that could have generated the following assembly language code? -How do you know? Explain briefly. +What is a C statement or declaration that could have generated the following assembly language code? How do you know? Explain briefly. + .LC0: .string "Hello world!\n" ... @@ -46,9 +46,9 @@ call puts@PLT "problem_id": "2", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "A puts(”Hello world\n”); or printf(”Hello world\n”); could have generated this because the compiler can replace simple printf() calls with puts() ones. .LC0 labels the constant hello world string, and the leaq instruction loads this address into the rdi register, which is used for the first integer/address parameter passed to a function. The call instruction then calls puts(). (Minus half point for saying puts() is a system call.)", - "llm_judge_instructions": "Award full points for correctly identifying a simple printf/puts scenario and explanation of the role of .LC0 and leaq in providing the string address to puts()." + "tags": ["assembly","c-programming"], + "answer": "A puts(\"Hello world!\\n\"); or printf(\"Hello world\\n\"); could have generated this because the compiler can replace simple printf() calls with puts() ones. .LC0 labels the constant hello world string, and the leaq instruction loads this address into the rdi register, which is used for the first integer/address parameter passed to a function. The call instruction then calls puts(). (Minus half point for saying puts() is a system call.)", + "llm_judge_instructions": "Award 2 points for a correct explanation connecting the string literal to the call and parameter setup, 1 point for partial reasoning, 0 otherwise." } ``` @@ -56,16 +56,16 @@ call puts@PLT ## Question 3 [2 point(s)] -On x86-64 systems, which is larger, a process’s virtual address space or a host computer’s physical address space? How does this affect which part of a process’s address space can be accessed without generating an error? +On x86-64 systems, which is larger, a process’s virtual address space or a host computer’s physical address space? How does this affect which part of a process’s address space can be accessed without generating an error? ```json { "problem_id": "3", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "A process’s virtual address space is much larger than the physical address space, because regular computers aren’t close to having 2^64 bytes of RAM. This means that only a small fraction of a process’s (virtual) address space can be accessed without generating an error, because only a small portion can possibly map to allocated physical memory.", - "llm_judge_instructions": "Award full points for stating the virtual address space is larger and that only a portion mapping to physical memory can be accessed safely." + "tags": ["virtual-memory","memory-management"], + "answer": "The virtual address space is much larger than the physical address space, so only a small fraction of the virtual address space can map to allocated physical memory. Accessing parts of the virtual address space that have no corresponding physical page typically generates a fault.", + "llm_judge_instructions": "Award 2 points for stating the virtual space is larger and explaining that only mapped regions are accessible; 1 point for partial explanation; 0 otherwise." } ``` @@ -80,9 +80,9 @@ Describe how environment variable data is arranged in memory. What C data types "problem_id": "4", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Environment variables are arranged as an array of pointers to arrays of characters, with the array of pointers and each array of characters being null terminated (terminated by a 0 value byte) and the array of string pointers is terminated by NULL (a pointer value of 0). Each array of characters (each string) contains the name of an environment variable (the key), an equal sign, and the variable’s value, with that value being ended by a null byte.", - "llm_judge_instructions": "Award full points for describing envp as a null-terminated array of strings in the form KEY=VALUE, with an array terminated by NULL." + "tags": ["environment-variables","memory-layout"], + "answer": "Environment variables are organized as an array of pointers to null-terminated strings; the array of pointers is NULL-terminated. Each string contains the VARIABLE=VALUE pair, with the value terminated by a null byte.", + "llm_judge_instructions": "Award 2 points for describing the array of string pointers ending with NULL and each string containing KEY=VALUE with a terminating null. 1 point for partial description. 0 otherwise." } ``` @@ -90,16 +90,16 @@ Describe how environment variable data is arranged in memory. What C data types ## Question 5 [2 point(s)] -You’re writing a program on a new version of Linux that has a new system call,fastread. Libraries have not been updated to supportfastread. Can you make a pure, standards-compliant C program that calls thefastreadsystem call? Why or why not? +You’re writing a program on a new version of Linux that has a new system call, fastread. Libraries have not been updated to support fastread. Can you make a pure, standards-compliant C program that calls the fastread system call? Why or why not? ```json { "problem_id": "5", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["system-calls","linux"], "answer": "You can’t make a standards-compliant C program because calling system calls requires using platform-specific code (i.e., special assembly language instructions). You have to use inline assembly or a function that has inline assembly (i.e., syscall()).", - "llm_judge_instructions": "Award full points for noting that standard C does not define a way to invoke non-standard syscalls and that platform-specific mechanisms are required." + "llm_judge_instructions": "Award 2 points for noting the need for non-portable, platform-specific mechanisms; 1 point for partial justification; 0 otherwise." } ``` @@ -107,16 +107,16 @@ You’re writing a program on a new version of Linux that has a new system call, ## Question 6 [2 point(s)] -Which is biggeron disk, a statically-linked binary or a dynamically-linked binary? Why? - +Which is bigger on disk, a statically-linked binary or a dynamically-linked binary? Why? + ```json { "problem_id": "6", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Statically-linked binaries are bigger on disk because they must include all library code in them. Dynamically-linked binaries can load library code at runtime, thus reducing the size of the binary. Libraries do not contain full programs; a program is a self-contained executable that can be run on its own.", - "llm_judge_instructions": "Award full points for explaining that static linking includes library code, increasing size, while dynamic linking defers library code to runtime." + "tags": ["linking","binaries"], + "answer": "Statically linked binaries are bigger on disk because they include all library code. Dynamically linked binaries rely on shared libraries loaded at runtime, reducing the binary size.", + "llm_judge_instructions": "Award 2 points for the correct reasoning about static vs dynamic linking; 0 otherwise." } ``` @@ -131,9 +131,9 @@ In the Microsoft Win32 API, theCreateFile()call is used to open a new or existin "problem_id": "7", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["linux","open","file-descriptors"], "answer": "The Linux equivalent is open, and it returns a file handle, which is an integer.", - "llm_judge_instructions": "Award full points for identifying open as the Linux equivalent and noting that the return value is a file descriptor (an int)." + "llm_judge_instructions": "Award 2 points for identifying open and an integer file descriptor; 1 point for partial; 0 otherwise." } ``` @@ -148,9 +148,9 @@ When process A writes to a an existing file X, it freezes/locks up. Why could th "problem_id": "8", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["file-systems","pipes"], "answer": "The file could be a named pipe, and the way to fix it would be for another process to read from the pipe.", - "llm_judge_instructions": "Award full points for identifying a named pipe (FIFO) as a potential blocker and the remedy of another process reading from the pipe." + "llm_judge_instructions": "Award 2 points for identifying a named pipe as the cause and the need for a reader; 1 point for partial; 0 otherwise." } ``` @@ -158,18 +158,16 @@ When process A writes to a an existing file X, it freezes/locks up. Why could th ## Question 9 [2 point(s)] -What is the purpose ofqueue -nonfullin Tutorial 8’s 3000pc-rendezvous-timeout.c? Explain how it is -being used in every place it is accessed in the program, outside of its initialization. +What is the purpose ofqueue nonfullin Tutorial 8’s 3000pc-rendezvous-timeout.c? Explain how it is being used in every place it is accessed in the program, outside of its initialization. ```json { "problem_id": "9", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Its purpose is to allow the consumer to wake up the producer after the producer has gone to sleep. The producer will sleep when the queue is full, meaning there is no room for new production. On line 163 in pthread condtimedwait() is where the producer sleeps, and line 275 is where the consumer uses this variable to wake up the producer.", - "llm_judge_instructions": "Award full points for describing the wake-up mechanism between producer and consumer via a full queue and condition variable usage." + "tags": ["threads","condition-variables","producer-consumer"], + "answer": "Its purpose is to allow the consumer to wake up the producer after the producer has gone to sleep. The producer sleeps when the queue is full; the consumer signals to wake it up.", + "llm_judge_instructions": "Award 2 points for explaining wake-up signaling via condition variable when queue is full; 1 point for partial explanation; 0 otherwise." } ``` @@ -184,9 +182,9 @@ What part of3000makefs.sh(from Assignment 3) is necessary to allow ps to work co "problem_id": "10", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Line 58, the mounting of /proc, is necessary for ps to work because ps looks in /proc to get information on running processes. (0.5 for saying busybox, 1 for identifying lines for installing busybox such as 56)", - "llm_judge_instructions": "Award full points for identifying /proc being mounted and its role in procfs access for ps." + "tags": ["procfs","ps"], + "answer": "Line 58, the mounting of /proc, is necessary for ps to work because ps looks in /proc to get information on running processes.", + "llm_judge_instructions": "Award 2 points for mentioning /proc is mounted; 1 point for partial mention; 0 otherwise." } ``` @@ -201,9 +199,9 @@ In the chrooted environment created by3000makefs.sh, doeslsdepend on any dynamic "problem_id": "11", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["chroot","busybox"], "answer": "No, because it is part of busybox, and busybox is statically linked.", - "llm_judge_instructions": "Award full points for noting static linking of BusyBox in the chroot." + "llm_judge_instructions": "Award 2 points for stating static linking of busybox; 0 otherwise." } ``` @@ -211,16 +209,16 @@ In the chrooted environment created by3000makefs.sh, doeslsdepend on any dynamic ## Question 12 [2 point(s)] -Can a mount command increase the space available for storing files? Explain. (Be sure to consider uses beyond those in3000makefs.sh.) +Can a mount command increase the space available for storing files? Explain. (Be sure to consider uses beyond those in3000makefs.sh.) ```json { "problem_id": "12", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Yes, because you can mount a filesystem on an additional device, such as a USB stick. This storage thus becomes available to files created under the mountpoint. (Note that storage is filesystem specific, so it won’t make any space available in directories outside of the mountpoint.)", - "llm_judge_instructions": "Award full points for recognizing that mounting a new filesystem on a device adds space under the mount point." + "tags": ["mount","filesystems"], + "answer": "Yes, because you can mount a filesystem on an additional device, such as a USB stick. This storage thus becomes available to files created under the mountpoint.", + "llm_judge_instructions": "Award 2 points for recognizing mounting a new filesystem adds accessible space; 0 otherwise." } ``` @@ -235,9 +233,9 @@ On the class VM, what files have to be changed in order to add a new user? What "problem_id": "13", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "You change /etc/passwd and /etc/shadow to add a new user, and /etc/group and /etc/gshadow to add a group. (1 point if you identify all four files but don’t distinguish which is for users and which is for groups. No credit for home directory because you could use any directory.)", - "llm_judge_instructions": "Award full points for naming the four files and distinguishing user vs group files; partial credit for partial identification." + "tags": ["linux-users","passwd","group"], + "answer": "You change /etc/passwd and /etc/shadow to add a new user, and /etc/group and /etc/gshadow to add a group.", + "llm_judge_instructions": "Award 2 points for listing all four files with appropriate roles; 1 point for partial listing; 0 otherwise." } ``` @@ -245,16 +243,16 @@ On the class VM, what files have to be changed in order to add a new user? What ## Question 14 [2 point(s)] -3000shellcan make many stat system calls for every command entered. Which function makes these stat calls? What are these stat calls for? +3000shellcan make many stat system calls for every command entered. Which function makes these stat calls? What are these stat calls for? ```json { "problem_id": "14", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "find\nbinary() makes these calls (on line 124). They check whether the constructed absolute filename actually exists or not, thus telling us whether we’ve found the executable we are looking for.", - "llm_judge_instructions": "Award full points for identifying the function(s) that perform stat and their purpose to verify executable path existence." + "tags": ["stat","filesystem"], + "answer": "find binary() makes these calls (on line 124). They check whether the constructed absolute filename actually exists or not, thus telling us whether we’ve found the executable we are looking for.", + "llm_judge_instructions": "Award 2 points for identifying the function and its purpose; 1 point for partial; 0 otherwise." } ``` @@ -262,16 +260,16 @@ On the class VM, what files have to be changed in order to add a new user? What ## Question 15 [2 point(s)] -If you do a printf() that does not end in a newline, it will not be immediately output to a terminal; instead, it will only be output later once a newline is output. How can you force terminal output without a newline? Why does this work? +If you do a printf() that does not end in a newline, it will not be immediately output to a terminal; instead, it will only be output later once a newline is output. How can you force terminal output without a newline? Why does this work? ```json { "problem_id": "15", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["stdio","stdout"], "answer": "You can force output with fflush(), because C library functions such as printf() do buffered output to terminals and so only issue write system calls when their buffer is filled, a newline is output, or the buffer is flushed.", - "llm_judge_instructions": "Award full points for mentioning fflush() as the mechanism to flush the C standard I/O buffer." + "llm_judge_instructions": "Award 2 points for mentioning fflush() and the reason about buffering; 0 otherwise." } ``` @@ -286,9 +284,9 @@ What is the relationship between sigaction() and kill()? "problem_id": "16", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["signals"], "answer": "sigaction() is used to register signal handlers which are run when a process receives a signal. kill() is used to send signals.", - "llm_judge_instructions": "Award full points for describing that sigaction sets up handlers and kill sends signals." + "llm_judge_instructions": "Award 2 points for correctly stating roles of registration vs sending; 0 otherwise." } ``` @@ -296,17 +294,16 @@ What is the relationship between sigaction() and kill()? ## Question 17 [2 point(s)] -Tools likegdbandstrace, that use the ptrace system call, have several significant limitations compared tobpftraceand other tools based on eBPF. -What is one thing you can do with eBPF that you can’t do with ptrace? And, what key restriction is placed on eBPF programs that isn’t there for ptrace programs? +Tools likegdbandstrace, that use the ptrace system call, have several significant limitations compared t obpftraceand other tools based on eBPF. What is one thing you can do with eBPF that you can’t do with ptrace? And, what key restriction is placed on eBPF programs that isn’t there for ptrace programs? ```json { "problem_id": "17", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "With eBPF you can observe all the processes on the system and change how the kernel works, potentially modifying how security or even scheduling decisions are made; ptrace can only allow one process to be observed at a time. eBPF programs must be loaded and run as root however. (Multiple acceptable answers.)", - "llm_judge_instructions": "Award full points for noting broader system visibility and kernel interaction with eBPF and the root privileges requirement." + "tags": ["ebpf","ptrace","performance-monitoring"], + "answer": "With eBPF you can observe all the processes on the system and change how the kernel works, potentially modifying security or scheduling decisions; ptrace can only observe one process at a time. eBPF programs must be loaded and run as root however.", + "llm_judge_instructions": "Award 2 points for describing system-wide observation and kernel interaction with root requirement; 1 point for partial; 0 otherwise." } ``` @@ -321,9 +318,9 @@ What is one signal that can be sent directly from one process to another (via th "problem_id": "18", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Many possible answers. Common ones are SIGTERM, SIGKILL, and SIGSTOP for sending from one process to another. SIGSEGV, SIGBUS, SIGCHLD and such are sent by the kernel to a process. (Should also briefly explain each signal.) (-.5 if two signals that are valid and properly explained but unclear on which is sent by a process vs kernel)", - "llm_judge_instructions": "Award full points for correctly distinguishing user-sent signals (e.g., SIGTERM) from kernel-sent signals (e.g., SIGCHLD) with a brief purpose description." + "tags": ["signals","kernel"], + "answer": "Common ones are SIGTERM, SIGKILL, and SIGSTOP for sending from one process to another. SIGSEGV, SIGBUS, SIGCHLD etc. are sent by the kernel to a process.", + "llm_judge_instructions": "Award 2 points for correctly identifying one process-to-process signal and one kernel-sent signal with brief purposes; 0 otherwise." } ``` @@ -331,16 +328,16 @@ What is one signal that can be sent directly from one process to another (via th ## Question 19 [2 point(s)] -Could you make a special file that, when read, returns a random sentence? Why or why not? Be sure to explain how it could be done or why it would be impossible. (No code is required in your answer.) +Could you make a special file that, when read, returns a random sentence? Why or why not? Be sure to explain how it could be done or why it would be impossible. (No code is required in your answer.) ```json { "problem_id": "19", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "Yes you could, it would just be a kernel module like newgetpid, but it would choose a random sentence from a built-in database (or perhaps load it previously) and then return it. (1 for saying yes, 1 for the explanation) Note that character devices are not read or written one character at a time, that would be very wasteful! It is a character device because input and output can be arbitrarily sized; with block devices, we can only read or write entire blocks (i.e., only 4K at a time).", - "llm_judge_instructions": "Award full points for outlining a kernel-space approach (e.g., kernel module or character device) and rationale about dynamic sizing vs block reads." + "tags": ["kernel-modules","character-device"], + "answer": "Yes you could, it would just be a kernel module like newgetpid, but it would choose a random sentence from a built-in database (or perhaps load it previously) and then return it. It is a character device because input and output can be arbitrarily sized; read/write could support streaming.", + "llm_judge_instructions": "Award 2 points for describing a kernel module/character device approach; 0 otherwise." } ``` @@ -348,16 +345,16 @@ Could you make a special file that, when read, returns a random sentence? Why o ## Question 20 [2 point(s)] -After loading theonesmodule from Tutorial 7, running “cat /dev/ones” will produce an unbounded sequence of 1’s. How is this possible, given that ones read() only outputs a limited number of 1’s? Explain briefly. +After loading the ones module from Tutorial 7, running “cat /dev/ones” will produce an unbounded sequence of 1’s. How is this possible, given that ones read() only outputs a limited number of 1’s? Explain briefly. ```json { "problem_id": "20", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], + "tags": ["devices","kernel-module"], "answer": "On every read, it will fill the given buffer completely and return the size of the buffer as the number of characters read. Thus there’s never any indication of end of file (and indeed the offset is never changed), so subsequent reads will be indicated and will return the same, thus producing unbounded output.", - "llm_judge_instructions": "Award full points for explaining how repeated reads with a fixed buffer yield unlimited output due to buffering and no EOF." + "llm_judge_instructions": "Award 2 points for describing buffer-filled reads and persistent offset behavior; 0 otherwise." } ``` @@ -372,8 +369,10 @@ If the kernel accesses a process’s data using standard C methods, such as dere "problem_id": "21", "points": 2, "type": "Freeform", - "tags": ["operating-systems"], - "answer": "User data is in a process with its own address space separate from the kernel (on most architectures), meaning that userspace pointers simply aren’t valid in the context of the kernel’s own address space. Further, it is possible a userspace pointer is pointing to memory that hasn’t been loaded or isn’t allocated memory; the kernel must check and handle such conditions. To access userspace pointers safely, the kernel uses special functions such as getuser() and putuser() that do the necessary translations. 1 for put/getuser, 1 for different address spaces or something about the difference between memory in userspace and kernelspace.", - "llm_judge_instructions": "Award full points for recognizing address space separation and the need for special accessors (getuser/putuser) to safely access user memory." + "tags": ["kernel-space","user-space","pointers"], + "answer": "User data is in a process with its own address space separate from the kernel (in most architectures), so user-space pointers aren’t valid in the kernel context. The kernel uses safe accessors like get_user()/put_user() to translate or validate addresses.", + "llm_judge_instructions": "Award 2 points for explaining separate address spaces and use of get_user/put_user; 0 otherwise." } -``` \ No newline at end of file +``` + +--- \ No newline at end of file From caa865f89c836f51195e880cee5b25bf376b3de1 Mon Sep 17 00:00:00 2001 From: qimcis Date: Sat, 17 Jan 2026 21:06:10 -0500 Subject: [PATCH 3/3] add COMP 3000A: Operating Systems Fall 2021 Final --- .../data/raw/comp3000_fall_2021_final/exam.md | 136 +++++++++--------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md b/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md index e8ea7f92..d798289b 100644 --- a/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md +++ b/benchmarks/courseexam_bench/data/raw/comp3000_fall_2021_final/exam.md @@ -1,9 +1,9 @@ -# COMP 3000 Fall 2021 Final +# COMP 3000A: Operating Systems Fall 2021 Final ```json { "exam_id": "comp3000_fall_2021_final", - "test_paper_name": "COMP 3000 Fall 2021 Final", + "test_paper_name": "COMP 3000A: Operating Systems Fall 2021 Final", "course": "COMP 3000", "institution": "Carleton University", "year": 2021, @@ -23,9 +23,9 @@ How does /dev/null behave like a regular file? How is it different? "problem_id": "1", "points": 2, "type": "Freeform", - "tags": ["unix","filesystem"], - "answer": "It can be opened, read from, and written to like a regular file, but data written to /dev/null cannot be read back (reads return zero bytes).", - "llm_judge_instructions": "Award 2 points for stating that /dev/null is writable/readable like a file but reads return end-of-file (no data) when reading; 0 points otherwise." + "tags": ["operating-systems", "devices"], + "answer": "You can open, read from, and write to it, just like a regular file. Unlike a regular file, data written cannot be read back, as reads always return nothing (a read of zero bytes).", + "llm_judge_instructions": "Award 2 points for correctly describing that /dev/null supports open/read/write like a regular file and that reads return 0 bytes (nothing is readable) and writes discard data; award 1 point for mentioning either the write-discard behavior or the read-empty behavior but not both; award 0 points otherwise." } ``` @@ -33,8 +33,8 @@ How does /dev/null behave like a regular file? How is it different? ## Question 2 [2 point(s)] -What is a C statement or declaration that could have generated the following assembly language code? How do you know? Explain briefly. - +What is a C statement or declaration that could have generated the following assembly language code? +How do you know? Explain briefly. .LC0: .string "Hello world!\n" ... @@ -46,9 +46,9 @@ call puts@PLT "problem_id": "2", "points": 2, "type": "Freeform", - "tags": ["assembly","c-programming"], - "answer": "A puts(\"Hello world!\\n\"); or printf(\"Hello world\\n\"); could have generated this because the compiler can replace simple printf() calls with puts() ones. .LC0 labels the constant hello world string, and the leaq instruction loads this address into the rdi register, which is used for the first integer/address parameter passed to a function. The call instruction then calls puts(). (Minus half point for saying puts() is a system call.)", - "llm_judge_instructions": "Award 2 points for a correct explanation connecting the string literal to the call and parameter setup, 1 point for partial reasoning, 0 otherwise." + "tags": ["c", "assembly", "compilers"], + "answer": "A puts(\"Hello world!\\n\"); or printf(\"Hello world!\\n\"); could have generated this because the compiler can replace simple printf() calls with puts() ones. .LC0 labels the constant hello world string, and the leaq instruction loads this address into the rdi register, which is used for the first integer/address parameter passed to a function. The call instruction then calls puts().", + "llm_judge_instructions": "Award 2 points for identifying a candidate C statement such as puts(\"Hello world!\\n\"); or printf(\"Hello world!\\n\"); and mentioning that the .LC0 string is the literal, that leaq loads the address into the first argument register, and the call to puts() invokes the function. Award 1 point for naming puts() (or printf()) without the supporting rationale; 0 points otherwise." } ``` @@ -56,16 +56,16 @@ call puts@PLT ## Question 3 [2 point(s)] -On x86-64 systems, which is larger, a process’s virtual address space or a host computer’s physical address space? How does this affect which part of a process’s address space can be accessed without generating an error? +On x86-64 systems, which is larger, a process’s virtual address space or a host computer’s physical address space? How does this affect which part of a process’s address space can be accessed without generating an error? ```json { "problem_id": "3", "points": 2, "type": "Freeform", - "tags": ["virtual-memory","memory-management"], - "answer": "The virtual address space is much larger than the physical address space, so only a small fraction of the virtual address space can map to allocated physical memory. Accessing parts of the virtual address space that have no corresponding physical page typically generates a fault.", - "llm_judge_instructions": "Award 2 points for stating the virtual space is larger and explaining that only mapped regions are accessible; 1 point for partial explanation; 0 otherwise." + "tags": ["virtual-memory", "address-space"], + "answer": "A process’s virtual address space is much larger than the physical address space, because regular computers aren’t close to having 2^64 bytes of RAM. This means that only a small fraction of a process’s (virtual) address space can be accessed without generating an error, because only a small portion can possibly map to allocated physical memory.", + "llm_judge_instructions": "Award 2 points for stating that virtual space is larger than physical RAM and that only a small portion can be mapped to physical memory; award 1 point for mentioning that most of the virtual space is not backed by physical memory; 0 points otherwise." } ``` @@ -80,9 +80,9 @@ Describe how environment variable data is arranged in memory. What C data types "problem_id": "4", "points": 2, "type": "Freeform", - "tags": ["environment-variables","memory-layout"], - "answer": "Environment variables are organized as an array of pointers to null-terminated strings; the array of pointers is NULL-terminated. Each string contains the VARIABLE=VALUE pair, with the value terminated by a null byte.", - "llm_judge_instructions": "Award 2 points for describing the array of string pointers ending with NULL and each string containing KEY=VALUE with a terminating null. 1 point for partial description. 0 otherwise." + "tags": ["environment-variables"], + "answer": "Environment variables are arranged as an array of pointers to arrays of characters, with the array of pointers and each array of characters being null terminated (terminated by a 0 value byte) and the array of string pointers is terminated by NULL (a pointer value of 0). Each array of characters (each string) contains the name of an environment variable (the key), an equal sign, and the variable’s value, with that value being ended by a null byte.", + "llm_judge_instructions": "Award 2 points for describing the array-of-char-pointers structure ending with NULL, and for mentioning each string has 'KEY=VALUE' with a terminating null byte; award 1 point for partial description (e.g., only the array-of-pointers or only null-termination) and 0 otherwise." } ``` @@ -90,16 +90,16 @@ Describe how environment variable data is arranged in memory. What C data types ## Question 5 [2 point(s)] -You’re writing a program on a new version of Linux that has a new system call, fastread. Libraries have not been updated to support fastread. Can you make a pure, standards-compliant C program that calls the fastread system call? Why or why not? +You’re writing a program on a new version of Linux that has a new system call,fastread. Libraries have not been updated to supportfastread. Can you make a pure, standards-compliant C program that calls thefastreadsystem call? Why or why not? ```json { "problem_id": "5", "points": 2, "type": "Freeform", - "tags": ["system-calls","linux"], + "tags": ["system-calls", "linux"], "answer": "You can’t make a standards-compliant C program because calling system calls requires using platform-specific code (i.e., special assembly language instructions). You have to use inline assembly or a function that has inline assembly (i.e., syscall()).", - "llm_judge_instructions": "Award 2 points for noting the need for non-portable, platform-specific mechanisms; 1 point for partial justification; 0 otherwise." + "llm_judge_instructions": "Award 2 points if the answer correctly states that system calls require non-portable, platform-specific code; 1 point for mentioning the need for inline assembly or a wrapper; 0 points otherwise." } ``` @@ -107,16 +107,16 @@ You’re writing a program on a new version of Linux that has a new system call, ## Question 6 [2 point(s)] -Which is bigger on disk, a statically-linked binary or a dynamically-linked binary? Why? +Which is biggeron disk, a statically-linked binary or a dynamically-linked binary? Why? ```json { "problem_id": "6", "points": 2, "type": "Freeform", - "tags": ["linking","binaries"], - "answer": "Statically linked binaries are bigger on disk because they include all library code. Dynamically linked binaries rely on shared libraries loaded at runtime, reducing the binary size.", - "llm_judge_instructions": "Award 2 points for the correct reasoning about static vs dynamic linking; 0 otherwise." + "tags": ["linking", "binaries"], + "answer": "Statically-linked binaries are bigger on disk because they must include all library code in them. Dynamically-linked binaries can load library code at runtime, thus reducing the size of the binary.", + "llm_judge_instructions": "Award 2 points for stating that static binaries are larger due to embedded libraries; 1 point for mentioning dynamic linking reduces disk size; 0 otherwise." } ``` @@ -131,9 +131,9 @@ In the Microsoft Win32 API, theCreateFile()call is used to open a new or existin "problem_id": "7", "points": 2, "type": "Freeform", - "tags": ["linux","open","file-descriptors"], + "tags": ["linux", "system-calls", "open"], "answer": "The Linux equivalent is open, and it returns a file handle, which is an integer.", - "llm_judge_instructions": "Award 2 points for identifying open and an integer file descriptor; 1 point for partial; 0 otherwise." + "llm_judge_instructions": "Award 2 points for identifying 'open' as the Linux analogue and 'int' as the return type; 1 point for partial (e.g., naming open but not the return type); 0 otherwise." } ``` @@ -148,9 +148,9 @@ When process A writes to a an existing file X, it freezes/locks up. Why could th "problem_id": "8", "points": 2, "type": "Freeform", - "tags": ["file-systems","pipes"], + "tags": ["ipc", "files"], "answer": "The file could be a named pipe, and the way to fix it would be for another process to read from the pipe.", - "llm_judge_instructions": "Award 2 points for identifying a named pipe as the cause and the need for a reader; 1 point for partial; 0 otherwise." + "llm_judge_instructions": "Award 2 points for identifying a named pipe as a possible cause and that another process should read from it; 1 point for mentioning a pipe in general or a blocking I/O scenario; 0 otherwise." } ``` @@ -165,9 +165,9 @@ What is the purpose ofqueue nonfullin Tutorial 8’s 3000pc-rendezvous-timeout.c "problem_id": "9", "points": 2, "type": "Freeform", - "tags": ["threads","condition-variables","producer-consumer"], - "answer": "Its purpose is to allow the consumer to wake up the producer after the producer has gone to sleep. The producer sleeps when the queue is full; the consumer signals to wake it up.", - "llm_judge_instructions": "Award 2 points for explaining wake-up signaling via condition variable when queue is full; 1 point for partial explanation; 0 otherwise." + "tags": ["pthreads", "concurrency"], + "answer": "Its purpose is to allow the consumer to wake up the producer after the producer has gone to sleep. The producer will sleep when the queue is full, meaning there is no room for new production. On line 163 in pthread condtimedwait() is where the producer sleeps, and line 275 is where the consumer uses this variable to wake up the producer.", + "llm_judge_instructions": "Award 2 points for correctly describing the wake-up mechanism via a condition variable and the producer-consumer interaction; 1 point for partial description focusing on either the sleep or wake-up aspect; 0 otherwise." } ``` @@ -182,9 +182,9 @@ What part of3000makefs.sh(from Assignment 3) is necessary to allow ps to work co "problem_id": "10", "points": 2, "type": "Freeform", - "tags": ["procfs","ps"], + "tags": ["procfs", "filesystem"], "answer": "Line 58, the mounting of /proc, is necessary for ps to work because ps looks in /proc to get information on running processes.", - "llm_judge_instructions": "Award 2 points for mentioning /proc is mounted; 1 point for partial mention; 0 otherwise." + "llm_judge_instructions": "Award 2 points for identifying mounting /proc as necessary for ps to obtain process information; award 1 point for partially correct answers that mention /proc or process information without explicitly stating that /proc must be mounted; award 0 points otherwise." } ``` @@ -199,9 +199,9 @@ In the chrooted environment created by3000makefs.sh, doeslsdepend on any dynamic "problem_id": "11", "points": 2, "type": "Freeform", - "tags": ["chroot","busybox"], + "tags": ["chroot", "static-linking"], "answer": "No, because it is part of busybox, and busybox is statically linked.", - "llm_judge_instructions": "Award 2 points for stating static linking of busybox; 0 otherwise." + "llm_judge_instructions": "Award 2 points for noting static linking or busybox; 1 point for partial mention of static linking; 0 otherwise." } ``` @@ -209,16 +209,16 @@ In the chrooted environment created by3000makefs.sh, doeslsdepend on any dynamic ## Question 12 [2 point(s)] -Can a mount command increase the space available for storing files? Explain. (Be sure to consider uses beyond those in3000makefs.sh.) +Can a mount command increase the space available for storing files? Explain. (Be sure to consider uses beyond those in3000makefs.sh.) ```json { "problem_id": "12", "points": 2, "type": "Freeform", - "tags": ["mount","filesystems"], + "tags": ["mount", "filesystem"], "answer": "Yes, because you can mount a filesystem on an additional device, such as a USB stick. This storage thus becomes available to files created under the mountpoint.", - "llm_judge_instructions": "Award 2 points for recognizing mounting a new filesystem adds accessible space; 0 otherwise." + "llm_judge_instructions": "Award 2 points for stating that mounting additional storage increases available space under the mount point; 1 point for partial reasoning; 0 otherwise." } ``` @@ -233,9 +233,9 @@ On the class VM, what files have to be changed in order to add a new user? What "problem_id": "13", "points": 2, "type": "Freeform", - "tags": ["linux-users","passwd","group"], + "tags": ["linux-users", "files"], "answer": "You change /etc/passwd and /etc/shadow to add a new user, and /etc/group and /etc/gshadow to add a group.", - "llm_judge_instructions": "Award 2 points for listing all four files with appropriate roles; 1 point for partial listing; 0 otherwise." + "llm_judge_instructions": "Award 2 points for listing /etc/passwd and /etc/shadow for adding a user and /etc/group and /etc/gshadow for adding a group; award 1 point for partially listing two of the required files (e.g., passwd and shadow or group and gshadow); award 0 points otherwise." } ``` @@ -243,16 +243,16 @@ On the class VM, what files have to be changed in order to add a new user? What ## Question 14 [2 point(s)] -3000shellcan make many stat system calls for every command entered. Which function makes these stat calls? What are these stat calls for? +3000shellcan make many stat system calls for every command entered. Which function makes these stat calls? What are these stat calls for? ```json { "problem_id": "14", "points": 2, "type": "Freeform", - "tags": ["stat","filesystem"], - "answer": "find binary() makes these calls (on line 124). They check whether the constructed absolute filename actually exists or not, thus telling us whether we’ve found the executable we are looking for.", - "llm_judge_instructions": "Award 2 points for identifying the function and its purpose; 1 point for partial; 0 otherwise." + "tags": ["filesystem", "stat"], + "answer": "findbinary() makes these calls (on line 124). They check whether the constructed absolute filename actually exists or not, thus telling us whether we’ve found the executable we are looking for.", + "llm_judge_instructions": "Award 2 points for identifying the function and the purpose (existence check for executables); 1 point for partial identification; 0 otherwise." } ``` @@ -260,16 +260,17 @@ On the class VM, what files have to be changed in order to add a new user? What ## Question 15 [2 point(s)] -If you do a printf() that does not end in a newline, it will not be immediately output to a terminal; instead, it will only be output later once a newline is output. How can you force terminal output without a newline? Why does this work? +If you do a printf() that does not end in a newline, it will not be immediately output to a terminal; instead, it will only be output later once a newline is output. How can you force terminal output without a newline? +Why does this work? ```json { "problem_id": "15", "points": 2, "type": "Freeform", - "tags": ["stdio","stdout"], + "tags": ["stdio", "buffering"], "answer": "You can force output with fflush(), because C library functions such as printf() do buffered output to terminals and so only issue write system calls when their buffer is filled, a newline is output, or the buffer is flushed.", - "llm_judge_instructions": "Award 2 points for mentioning fflush() and the reason about buffering; 0 otherwise." + "llm_judge_instructions": "Award 2 points for mentioning fflush() and the reason about buffering; 1 point for mentioning an explicit flush or a partial buffering concept; 0 points otherwise." } ``` @@ -286,7 +287,7 @@ What is the relationship between sigaction() and kill()? "type": "Freeform", "tags": ["signals"], "answer": "sigaction() is used to register signal handlers which are run when a process receives a signal. kill() is used to send signals.", - "llm_judge_instructions": "Award 2 points for correctly stating roles of registration vs sending; 0 otherwise." + "llm_judge_instructions": "Award 2 points for correctly describing registration of handlers with sigaction and sending signals with kill; 0 otherwise." } ``` @@ -294,16 +295,17 @@ What is the relationship between sigaction() and kill()? ## Question 17 [2 point(s)] -Tools likegdbandstrace, that use the ptrace system call, have several significant limitations compared t obpftraceand other tools based on eBPF. What is one thing you can do with eBPF that you can’t do with ptrace? And, what key restriction is placed on eBPF programs that isn’t there for ptrace programs? +Tools likegdbandstrace, that use the ptrace system call, have several significant limitations compared tobpftraceand other tools based on eBPF. +What is one thing you can do with eBPF that you can’t do with ptrace? And, what key restriction is placed on eBPF programs that isn’t there for ptrace programs? ```json { "problem_id": "17", "points": 2, "type": "Freeform", - "tags": ["ebpf","ptrace","performance-monitoring"], - "answer": "With eBPF you can observe all the processes on the system and change how the kernel works, potentially modifying security or scheduling decisions; ptrace can only observe one process at a time. eBPF programs must be loaded and run as root however.", - "llm_judge_instructions": "Award 2 points for describing system-wide observation and kernel interaction with root requirement; 1 point for partial; 0 otherwise." + "tags": ["ebpf", "ptrace"], + "answer": "With eBPF you can observe all the processes on the system and change how the kernel works, potentially modifying how security or even scheduling decisions are made; ptrace can only allow one process to be observed at a time. eBPF programs must be loaded and run by privileged users and are verified by the kernel's verifier.", + "llm_judge_instructions": "Award 2 points for stating both a system-wide observability/kernel interaction capability of eBPF (versus ptrace's one-at-a-time limitation) and mentioning that eBPF programs must be loaded by privileged users and are restricted by the kernel verifier; award 1 point for partial accuracy; 0 points otherwise." } ``` @@ -318,9 +320,9 @@ What is one signal that can be sent directly from one process to another (via th "problem_id": "18", "points": 2, "type": "Freeform", - "tags": ["signals","kernel"], - "answer": "Common ones are SIGTERM, SIGKILL, and SIGSTOP for sending from one process to another. SIGSEGV, SIGBUS, SIGCHLD etc. are sent by the kernel to a process.", - "llm_judge_instructions": "Award 2 points for correctly identifying one process-to-process signal and one kernel-sent signal with brief purposes; 0 otherwise." + "tags": ["signals"], + "answer": "Many possible answers. Common ones are SIGTERM, SIGKILL, and SIGSTOP for sending from one process to another. SIGSEGV, SIGBUS, SIGCHLD and such are sent by the kernel to a process. (Should also briefly explain each signal.)", + "llm_judge_instructions": "Award 2 points for correctly distinguishing at least one user-sent signal (with brief purpose) and at least one kernel-sent signal (with brief purpose); 1 point for partial accuracy; 0 points otherwise." } ``` @@ -328,16 +330,16 @@ What is one signal that can be sent directly from one process to another (via th ## Question 19 [2 point(s)] -Could you make a special file that, when read, returns a random sentence? Why or why not? Be sure to explain how it could be done or why it would be impossible. (No code is required in your answer.) +Could you make a special file that, when read, returns a random sentence? Why or why not? Be sure to explain how it could be done or why it would be impossible. (No code is required in your answer.) ```json { "problem_id": "19", "points": 2, "type": "Freeform", - "tags": ["kernel-modules","character-device"], - "answer": "Yes you could, it would just be a kernel module like newgetpid, but it would choose a random sentence from a built-in database (or perhaps load it previously) and then return it. It is a character device because input and output can be arbitrarily sized; read/write could support streaming.", - "llm_judge_instructions": "Award 2 points for describing a kernel module/character device approach; 0 otherwise." + "tags": ["kernel-module", "character-device"], + "answer": "Yes you could, it would just be a kernel module like newgetpid, but it would choose a random sentence from a built-in database (or perhaps load it previously) and then return it. It is a character device because input and output can be arbitrarily sized; with block devices, we can only read or write entire blocks (i.e., only 4K at a time).", + "llm_judge_instructions": "Award 2 points for describing a kernel module implementing a character device that returns random sentences; 1 point for partial hardware/driver reasoning; 0 otherwise." } ``` @@ -345,16 +347,16 @@ Could you make a special file that, when read, returns a random sentence? Why or ## Question 20 [2 point(s)] -After loading the ones module from Tutorial 7, running “cat /dev/ones” will produce an unbounded sequence of 1’s. How is this possible, given that ones read() only outputs a limited number of 1’s? Explain briefly. +After loading theonesmodule from Tutorial 7, running “cat /dev/ones” will produce an unbounded sequence of 1’s. How is this possible, given that ones read() only outputs a limited number of 1’s? Explain briefly. ```json { "problem_id": "20", "points": 2, "type": "Freeform", - "tags": ["devices","kernel-module"], + "tags": ["devices", "read"], "answer": "On every read, it will fill the given buffer completely and return the size of the buffer as the number of characters read. Thus there’s never any indication of end of file (and indeed the offset is never changed), so subsequent reads will be indicated and will return the same, thus producing unbounded output.", - "llm_judge_instructions": "Award 2 points for describing buffer-filled reads and persistent offset behavior; 0 otherwise." + "llm_judge_instructions": "Award 2 points for describing buffer-full reads and lack of EOF behavior leading to repeated outputs; 1 point for partial explanation; 0 points otherwise." } ``` @@ -369,10 +371,8 @@ If the kernel accesses a process’s data using standard C methods, such as dere "problem_id": "21", "points": 2, "type": "Freeform", - "tags": ["kernel-space","user-space","pointers"], - "answer": "User data is in a process with its own address space separate from the kernel (in most architectures), so user-space pointers aren’t valid in the kernel context. The kernel uses safe accessors like get_user()/put_user() to translate or validate addresses.", - "llm_judge_instructions": "Award 2 points for explaining separate address spaces and use of get_user/put_user; 0 otherwise." + "tags": ["kernel-space", "user-space"], + "answer": "User data is in a process with its own address space separate from the kernel (on most architectures), meaning that userspace pointers simply aren’t valid in the context of the kernel’s own address space. Further, it is possible a userspace pointer is pointing to memory that hasn’t been loaded or isn’t allocated memory; the kernel must check and handle such conditions. To access userspace pointers safely, the kernel uses special functions such as get_user() and put_user() that do the necessary translations.", + "llm_judge_instructions": "Award 2 points for mentioning separate address spaces and using safe access helpers (get_user/put_user); 1 point for partial reasoning; 0 points otherwise." } -``` - ---- \ No newline at end of file +``` \ No newline at end of file