Browse papers
A

Section A: Long Answer Questions

Attempt all / any as specified.

4 questions
1long14 marks

Consider the following set of processes with their arrival times, CPU burst times (in milliseconds) and priorities (a smaller number denotes a higher priority):

ProcessArrival TimeBurst TimePriority
P1083
P2141
P3294
P4352

(a) Draw the Gantt charts for scheduling these processes using Preemptive Shortest Remaining Time First (SRTF) and Preemptive Priority scheduling. (8 marks)

(b) Compute the average waiting time and average turnaround time for each of the two algorithms and state which algorithm performs better for this workload. (4 marks)

(c) Explain what the convoy effect is and how it can degrade the performance of FCFS scheduling. (2 marks)

(a) Gantt charts

Processes: P1(AT=0,BT=8), P2(AT=1,BT=4), P3(AT=2,BT=9), P4(AT=3,BT=5).

Preemptive SRTF — at each instant run the ready process with the smallest remaining burst:

| P1 | P2 | P4 | P1 | P3 |
0    1    5    10   17   26
  • t=0: only P1 runs. t=1: P2 (rem 4) < P1 (rem 7) → P2 runs to completion at 5.
  • t=5: ready P1(rem 7), P3(rem 9), P4(rem 5) → P4 runs to 10.
  • t=10: P1(rem 7) < P3(rem 9) → P1 runs to 17, then P3 runs to 26.

Preemptive Priority (smaller number = higher priority): P2=1, P4=2, P1=3, P3=4.

| P1 | P2 | P4 | P1 | P3 |
0    1    5    10   17   26
  • t=0: only P1. t=1: P2(pri 1) preempts P1 → runs to 5.
  • t=5: highest priority ready is P4(pri 2) → runs to 10.
  • t=10: P1(pri 3) over P3(pri 4) → P1 to 17, then P3 to 26.

For this particular workload the two schedules turn out identical.

(b) Average waiting and turnaround times

Turnaround = Completion − Arrival; Waiting = Turnaround − Burst.

ProcessCompletionTurnaroundWaiting
P117179
P2540
P3262415
P41072
  • Average Turnaround =(17+4+24+7)/4=52/4=13 ms= (17+4+24+7)/4 = 52/4 = 13\text{ ms}
  • Average Waiting =(9+0+15+2)/4=26/4=6.5 ms= (9+0+15+2)/4 = 26/4 = 6.5\text{ ms}

Both algorithms give the same averages here, so neither performs better for this workload. (In general SRTF is optimal for minimizing average waiting time, while preemptive priority can cause starvation of low-priority processes.)

(c) Convoy effect

The convoy effect occurs in FCFS scheduling when one long CPU-bound process holds the CPU while many short processes wait behind it in the ready queue. The short processes (and any I/O devices they would keep busy) are forced to idle until the long job finishes, lowering CPU and device utilization and greatly increasing average waiting time.

cpu-schedulingprocess-management
2long14 marks

(a) State the critical-section problem and list the three requirements (mutual exclusion, progress and bounded waiting) that any solution must satisfy. (4 marks)

(b) Define a counting semaphore and give the definitions of the wait() and signal() operations, explaining how they are made atomic. (4 marks)

(c) The classical Bounded-Buffer (Producer–Consumer) problem uses a buffer of n slots. Write the synchronized pseudo-code for the producer and consumer processes using the semaphores mutex, empty and full, and explain the purpose of each semaphore. (6 marks)

(a) The critical-section problem

Each process has a segment of code, the critical section, in which it accesses shared data. The critical-section problem is to design a protocol that processes can use to cooperate so that no two processes execute in their critical sections at the same time. Any correct solution must satisfy three requirements:

  1. Mutual exclusion — if a process is executing in its critical section, no other process may execute in its own critical section.
  2. Progress — if no process is in its critical section and some processes wish to enter, only those not in their remainder section participate in deciding who enters next, and this decision cannot be postponed indefinitely.
  3. Bounded waiting — there is a bound on the number of times other processes are allowed to enter their critical sections after a process has requested entry and before that request is granted (no starvation).

(b) Counting semaphore

A counting semaphore is an integer variable SS that, apart from initialization, is accessed only through two atomic operations wait() (P) and signal() (V). Its value can range over an unrestricted domain (used to control access to a resource with a finite number of instances).

wait(S):              signal(S):
    while S <= 0:          S = S + 1
        ; // busy wait
    S = S - 1

In practice the busy-wait version is replaced by a blocking version that puts the calling process to sleep on a queue when S<0S<0 and wakes one up on signal().

Atomicity is guaranteed by executing wait() and signal() as a single, indivisible operation — e.g. by disabling interrupts on a uniprocessor, or using a hardware atomic instruction (TestAndSet / Compare-and-Swap) or a spinlock to guard the semaphore on a multiprocessor. This prevents two processes from modifying SS simultaneously.

(c) Bounded-Buffer (Producer–Consumer)

Semaphores: mutex = 1 (mutual exclusion on the buffer), empty = n (count of empty slots), full = 0 (count of filled slots).

Producer:                         Consumer:
while (true) {                    while (true) {
   item = produce_item();           wait(full);
   wait(empty);                     wait(mutex);
   wait(mutex);                     item = remove_from_buffer();
   add_item_to_buffer(item);        signal(mutex);
   signal(mutex);                   signal(empty);
   signal(full);                    consume_item(item);
}                                 }

Purpose of each semaphore:

  • empty — counts free slots; blocks the producer when the buffer is full.
  • full — counts occupied slots; blocks the consumer when the buffer is empty.
  • mutex — a binary semaphore that enforces mutually exclusive access to the shared buffer so producer and consumer do not corrupt it.

Note the ordering: wait(empty)/wait(full) must be taken before wait(mutex); reversing them can deadlock.

synchronizationprocess-management
3long14 marks

A system has five processes (P0–P4) and three resource types A, B and C with total instances A = 10, B = 5, C = 7. At time T0 the system state is:

ProcessAllocation (A B C)Max (A B C)
P00 1 07 5 3
P12 0 03 2 2
P23 0 29 0 2
P32 1 12 2 2
P40 0 24 3 3

(a) Compute the Need matrix and the current Available vector. (3 marks)

(b) Using the Banker's algorithm, determine whether the system is in a safe state. If it is, give a safe sequence. (7 marks)

(c) If a request (1, 0, 2) arrives from P1, can it be granted immediately? Justify your answer using the resource-request algorithm. (4 marks)

(a) Need matrix and Available vector

Need=MaxAllocationNeed = Max - Allocation:

ProcessNeed (A B C)
P07 4 3
P11 2 2
P26 0 0
P30 1 1
P44 3 1

Total allocated =(7,2,5)= (7,2,5). With totals (10,5,7)(10,5,7):

Available=(10,5,7)(7,2,5)=(3,3,2)Available = (10,5,7) - (7,2,5) = (3,\,3,\,2)

(b) Banker's safety algorithm

Start with Work=(3,3,2)Work = (3,3,2), all Finish=false. A process can run if NeediWorkNeed_i \le Work; on finishing, release its allocation: Work=Work+AllocationiWork = Work + Allocation_i.

StepProcessNeed ≤ Work?Work after release
1P1(1,2,2) ≤ (3,3,2) ✔(3,3,2)+(2,0,0)=(5,3,2)
2P3(0,1,1) ≤ (5,3,2) ✔(5,3,2)+(2,1,1)=(7,4,3)
3P4(4,3,1) ≤ (7,4,3) ✔(7,4,3)+(0,0,2)=(7,4,5)
4P0(7,4,3) ≤ (7,4,5) ✔(7,4,5)+(0,1,0)=(7,5,5)
5P2(6,0,0) ≤ (7,5,5) ✔(7,5,5)+(3,0,2)=(10,5,7)

All processes finish, so the system is in a safe state.

Safe sequence: P1,P3,P4,P0,P2\langle P1, P3, P4, P0, P2 \rangle (other valid sequences exist, e.g. starting P1, P3, P0, ...).

(c) Request (1, 0, 2) by P1 — resource-request algorithm

  1. Check Request1Need1Request_{1} \le Need_{1}: (1,0,2)(1,2,2)(1,0,2) \le (1,2,2)
  2. Check Request1AvailableRequest_{1} \le Available: (1,0,2)(3,3,2)(1,0,2) \le (3,3,2)
  3. Pretend to allocate:
    • Available=(3,3,2)(1,0,2)=(2,3,0)Available = (3,3,2)-(1,0,2) = (2,3,0)
    • Allocation1=(2,0,0)+(1,0,2)=(3,0,2)Allocation_{1} = (2,0,0)+(1,0,2) = (3,0,2)
    • Need1=(1,2,2)(1,0,2)=(0,2,0)Need_{1} = (1,2,2)-(1,0,2) = (0,2,0)
  4. Run safety check from Work=(2,3,0)Work=(2,3,0): P1 (Need 0,2,0) runs → (5,3,2); P3 → (7,4,3); P4 → (7,4,5); P0 → (7,5,5); P2 → (10,5,7). All finish.

The resulting state is safe, so the request can be granted immediately. A valid safe sequence is P1,P3,P4,P0,P2\langle P1, P3, P4, P0, P2 \rangle.

deadlocks
4long14 marks

(a) Explain the concept of demand paging and describe, with the help of a diagram, the sequence of steps the operating system takes to service a page fault. (6 marks)

(b) Given the page reference string 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 and a memory of 3 frames, compute the number of page faults for the FIFO, Optimal and LRU page-replacement algorithms. (6 marks)

(c) What is Belady's anomaly? Which of the above algorithms can suffer from it? (2 marks)

(a) Demand paging and page-fault handling

Demand paging loads a page into memory only when it is actually referenced (on demand), rather than loading the whole process at start. Each page-table entry has a valid/invalid bit: valid means the page is in memory, invalid means it is on the backing store (disk) — a reference to an invalid page causes a page fault trap.

Steps to service a page fault (described in words, since a figure cannot be drawn here):

  1. The CPU references a page; the MMU finds the valid/invalid bit set to invalid and raises a page-fault trap to the OS.
  2. The OS checks an internal table to decide whether the reference is legal (the page belongs to the process) or illegal (→ terminate the process).
  3. If legal but not in memory, the OS finds a free frame (from the free-frame list).
  4. It schedules a disk read to bring the required page from the backing store into the free frame.
  5. When the disk I/O completes, the OS updates the page table (sets the frame number and the valid bit) and the internal tables.
  6. It restarts the instruction that was interrupted; the reference now succeeds from memory.

If no free frame exists, a page-replacement algorithm selects a victim page to evict first (writing it back if dirty).

(b) Page faults for the reference string (3 frames)

Reference string: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1

AlgorithmPage faults
FIFO15
Optimal9
LRU12
  • FIFO evicts the page that has been in memory longest → 15 faults.
  • Optimal evicts the page that will not be used for the longest time in the future → 9 faults (the theoretical minimum).
  • LRU evicts the least-recently-used page → 12 faults.

So Optimal performs best (fewest faults) and FIFO worst.

(c) Belady's anomaly

Belady's anomaly is the counter-intuitive situation in which increasing the number of frames increases the number of page faults for some reference strings. It can occur with FIFO replacement. Stack-based algorithms such as LRU and Optimal never suffer from it, because the set of pages held with mm frames is always a subset of those held with m+1m+1 frames.

virtual-memorymemory-management
B

Section B: Short Answer Questions

Attempt all / any as specified.

8 questions
5short7 marks

(a) Differentiate between a process and a thread, and state two benefits of multithreading. (4 marks)

(b) Draw the process state transition diagram and briefly explain the meaning of each state and transition. (3 marks)

(a) Process vs. Thread

AspectProcessThread
DefinitionA program in execution; an independent unit of resource ownershipA lightweight unit of execution within a process
Address spaceHas its own separate address spaceShares the address space (code, data, files) of its process
CommunicationNeeds IPC (pipes, shared memory, messages)Communicates directly via shared memory
Creation / switch costHigh (heavyweight)Low (lightweight)
IsolationCrash of one process does not affect othersA faulty thread can crash the whole process

Two benefits of multithreading:

  1. Responsiveness — one thread can keep serving the user while another performs a long/blocking operation.
  2. Resource sharing & economy — threads share memory and resources, so creation and context switching are cheaper than for processes; multithreading also enables parallelism on multicore CPUs (and better resource utilization).

(b) Process state transition diagram

              admitted        dispatch          exit
   [New] ----------------> [Ready] ----------> [Running] --------> [Terminated]
                            ^   ^                 |
          I/O or event      |   | interrupt       | I/O or event wait
          completion        |   |                 v
                            [Waiting] <-----------/
  • New — the process is being created.
  • Ready — it is loaded in memory and waiting to be assigned to the CPU.
  • Running — instructions are being executed on the CPU.
  • Waiting (Blocked) — the process is waiting for an event (e.g. I/O completion).
  • Terminated — the process has finished execution.

Transitions: admitted (New→Ready); dispatch/scheduler dispatch (Ready→Running); interrupt/time-out (Running→Ready); I/O or event wait (Running→Waiting); I/O or event completion (Waiting→Ready); exit (Running→Terminated).

process-management
6short7 marks

Explain the four necessary conditions for a deadlock to occur. For each condition, briefly describe one strategy by which it can be prevented.

A deadlock can arise only if all four necessary (Coffman) conditions hold simultaneously. Deadlock prevention works by ensuring at least one of them can never hold.

ConditionMeaningPrevention strategy
1. Mutual exclusionAt least one resource is held in a non-sharable mode (only one process at a time).Make resources sharable where possible (e.g. read-only files); some resources (printers) are intrinsically non-sharable, so this is hard to remove.
2. Hold and waitA process holding at least one resource is waiting to acquire additional resources held by others.Require a process to request all its resources at once before it begins, or to release everything it holds before requesting new ones.
3. No preemptionA resource cannot be forcibly taken from a process; it is released only voluntarily.Allow preemption: if a process holding resources requests one that cannot be granted, preempt (release) all its currently held resources; it restarts when it can get them all.
4. Circular waitA circular chain P0P1PnP0P_0 \to P_1 \to \dots \to P_n \to P_0 exists, each waiting for a resource held by the next.Impose a total ordering on resource types and require each process to request resources only in increasing order of that ranking.

All four must hold for a deadlock; breaking any single one prevents deadlock.

deadlocks
7short7 marks

(a) Explain the difference between internal fragmentation and external fragmentation. (3 marks)

(b) Given free memory partitions of sizes 100 KB, 500 KB, 200 KB, 300 KB and 600 KB (in order), show how the First-Fit, Best-Fit and Worst-Fit strategies would allocate processes of 212 KB, 417 KB, 112 KB and 426 KB (in order). Which strategy makes the most efficient use of memory here? (4 marks)

(a) Internal vs. External fragmentation

  • Internal fragmentation — memory is allocated in fixed-size blocks/pages; the block given to a process is slightly larger than what it needs, and the unused space inside the allocated block is wasted (e.g. a 212 KB process placed in a 256 KB frame wastes 44 KB). It cannot be used by any other process until the block is freed.
  • External fragmentation — enough total free memory exists to satisfy a request, but it is split into many non-contiguous small holes, so no single hole is large enough. It is the wasted space between allocated blocks (typical of variable-partition / contiguous allocation). It can be reduced by compaction.

(b) First-, Best-, and Worst-Fit

Partitions (in order): 100, 500, 200, 300, 600 KB. Processes (in order): 212, 417, 112, 426 KB.

First-Fit (first hole that is large enough):

ProcessPartition usedRemaining
212500 → 288
417600 → 183
112288 (was 500) → 176
426none fits (free: 100,176,200,300,183) — waits

Best-Fit (smallest adequate hole):

ProcessPartition usedRemaining
212300 → 88
417500 → 83
112200 → 88
426600 → 174
All four processes allocated.

Worst-Fit (largest hole):

ProcessPartition usedRemaining
212600 → 388
417500 → 83
112388 (was 600) → 276
426none fits (free: 100,83,200,300,276) — waits

Conclusion: Only Best-Fit successfully allocates all four processes; First-Fit and Worst-Fit both fail to place the 426 KB process. Hence Best-Fit makes the most efficient use of memory for this workload.

memory-management
8short6 marks

(a) Compare the contiguous, linked and indexed file allocation methods, stating one advantage and one disadvantage of each. (4 marks)

(b) What is the purpose of a File Control Block (FCB)? List any two pieces of information it stores. (2 marks)

(a) File allocation methods

MethodHow it worksAdvantageDisadvantage
ContiguousFile occupies a set of consecutive blocks on disk.Excellent sequential and direct (random) access; simple; few seeks.Suffers from external fragmentation; hard to grow a file (must know size in advance).
LinkedEach block holds a pointer to the next block; directory keeps first/last block.No external fragmentation; file can grow easily.Poor direct access (must follow the chain); pointer overhead; a broken pointer loses the rest of the file.
IndexedAll block pointers are gathered in an index block per file.Supports direct access without external fragmentation.Index-block overhead (wastes space for small files); maximum file size limited by index-block capacity (mitigated by multilevel/linked index).

(b) File Control Block (FCB)

A File Control Block is a per-file data structure (e.g. an inode) maintained by the file system that stores all the metadata needed to manage and locate the file.

Two pieces of information it stores (any two): file name/identifier, file size, file permissions / access-control list, owner and group IDs, timestamps (created/modified/accessed), and the pointers to the data blocks (disk addresses) on disk.

file-systems
9short7 marks

A disk has 200 cylinders numbered 0 to 199. The disk head is currently at cylinder 53 and the pending request queue (in arrival order) is:

98, 183, 37, 122, 14, 124, 65, 67

Compute the total head movement for the FCFS, SSTF and SCAN disk-scheduling algorithms (assume SCAN moves toward larger cylinder numbers first). Which algorithm gives the least head movement?

Head starts at cylinder 53; queue: 98, 183, 37, 122, 14, 124, 65, 67.

FCFS (serve in arrival order)

Path: 53 → 98 → 183 → 37 → 122 → 14 → 124 → 65 → 67

9853+18398+37183+12237+14122+12414+65124+6765|98-53|+|183-98|+|37-183|+|122-37|+|14-122|+|124-14|+|65-124|+|67-65| =45+85+146+85+108+110+59+2=640= 45+85+146+85+108+110+59+2 = \mathbf{640}

SSTF (always go to nearest pending request)

Order: 53 → 65 → 67 → 37 → 14 → 98 → 122 → 124 → 183

12+2+30+23+84+24+2+59=23612+2+30+23+84+24+2+59 = \mathbf{236}

SCAN (move toward larger cylinders first, up to 199, then reverse)

Order: 53 → 65 → 67 → 98 → 122 → 124 → 183 → 199 → 37 → 14

Total =(19953)+(19914)=146+185=331= (199-53) + (199-14) = 146 + 185 = \mathbf{331}

Comparison

AlgorithmTotal head movement
FCFS640
SSTF236
SCAN331

SSTF gives the least total head movement (236 cylinders) for this request set. (Note: SSTF can cause starvation, whereas SCAN guarantees fairer service.)

disk-schedulingio-management
10short6 marks

(a) Distinguish between preemptive and non-preemptive scheduling, giving one example algorithm of each. (3 marks)

(b) What is a race condition? Explain with a simple example involving two processes updating a shared variable. (3 marks)

(a) Preemptive vs. Non-preemptive scheduling

  • Non-preemptive scheduling — once the CPU is given to a process, it keeps the CPU until it terminates or voluntarily blocks (e.g. for I/O). The scheduler cannot forcibly take the CPU away. Example: FCFS (also non-preemptive SJF). Simpler, but a long job can hold up others.
  • Preemptive scheduling — the CPU can be taken away from a running process before it finishes, e.g. on a timer interrupt or when a higher-priority/shorter process arrives. Example: Round Robin (also SRTF, preemptive priority). More responsive, but incurs context-switch overhead and needs synchronization for shared data.

(b) Race condition

A race condition occurs when two or more processes access shared data concurrently and the final result depends on the order in which their operations are interleaved. The outcome is non-deterministic and usually incorrect.

Example: Two processes increment a shared variable count = 5. The statement count = count + 1 compiles to three steps: read, add, write.

Process A            Process B
read count (5)
                     read count (5)
add 1 -> 6
                     add 1 -> 6
write count = 6
                     write count = 6

Both increments execute, so count should be 7, but because the operations interleave on the unprotected shared variable the final value is 6 — one update is lost. Protecting the update with mutual exclusion (a lock or semaphore around the critical section) eliminates the race.

cpu-schedulingsynchronization
11short6 marks

(a) Explain the concept of thrashing in a virtual-memory system and describe how the working-set model helps to control it. (4 marks)

(b) A logical address space has a page size of 4 KB and a logical address is 32 bits wide. How many bits are used for the page number and how many for the page offset? (2 marks)

(a) Thrashing and the working-set model

Thrashing is a state in which a process (or the whole system) spends more time paging (servicing page faults) than executing useful work. It happens when processes do not have enough frames to hold their actively used pages: each one quickly faults, steals a frame from another process, which then faults in turn. CPU utilization collapses while paging-device utilization climbs to ~100%. A naive scheduler, seeing low CPU use, admits more processes, which worsens the situation.

Working-set model: The working set W(t,Δ)W(t, \Delta) of a process is the set of pages it has referenced in the most recent Δ\Delta references (the working-set window). The OS estimates each process's working-set size and ensures it is allocated enough frames to hold its entire working set. The total demand is D=WSSiD = \sum WSS_i. If D>D > available frames, the OS suspends (swaps out) a process to free frames, keeping the multiprogramming degree at a level where every running process has its working set resident — thereby preventing thrashing.

(b) Page number vs. page offset bits

Page size =4 KB=212= 4\text{ KB} = 2^{12} bytes, so the page offset uses 12 bits.

Logical address =32= 32 bits, so the page number uses 3212=2032 - 12 = \mathbf{20} bits (giving 2202^{20} pages).

20 bitspage number    12 bitsoffset\underbrace{20\text{ bits}}_{\text{page number}} \;\Big|\; \underbrace{12\text{ bits}}_{\text{offset}}
virtual-memorymemory-management
12short5 marks

Write short notes on any two of the following:

(a) System calls and their categories (b) RAID levels 0, 1 and 5 (c) Direct Memory Access (DMA)

(Answer any two — all three are given here.)

(a) System calls and their categories

A system call is the programming interface through which a user-mode program requests a service from the operating-system kernel (e.g. via a software interrupt/trap that switches to kernel mode). It is the boundary between an application and the OS. Major categories:

  1. Process controlfork, exec, exit, wait.
  2. File managementopen, read, write, close, create, delete.
  3. Device management — request/release device, read/write device.
  4. Information maintenancegetpid, get/set time, system data.
  5. Communicationpipe, send/receive messages, shared memory.
  6. Protection — set permissions, chmod.

(b) RAID levels 0, 1 and 5

  • RAID 0 (striping): Data is striped across disks for high performance and full capacity, but no redundancy — a single disk failure loses all data.
  • RAID 1 (mirroring): Every block is duplicated on a second disk. Excellent reliability and read performance; storage cost is doubled (50% usable capacity).
  • RAID 5 (striping with distributed parity): Data and parity blocks are striped across all NN disks; it tolerates one disk failure (rebuild from parity). Usable capacity is (N1)/N(N-1)/N; writes incur parity-update overhead. A good balance of cost, performance and reliability.

(c) Direct Memory Access (DMA)

DMA is a technique that lets an I/O device controller transfer a whole block of data directly between the device and main memory without involving the CPU for each byte/word. The CPU sets up the transfer (source/destination address and count) in the DMA controller and continues other work; the DMA controller moves the data and raises a single interrupt when the whole block is done. This frees the CPU from byte-by-byte programmed I/O, greatly improving throughput for high-speed devices (disks, network cards). During the transfer the DMA controller and CPU share the memory bus (cycle stealing).

io-managementfile-systems

Frequently asked questions

Where can I find the BE Computer Engineering (Pokhara University) Operating Systems (PU, CMP 232) question paper 2078?
The full BE Computer Engineering (Pokhara University) Operating Systems (PU, CMP 232) 2078 (regular) question paper is available free on Kekkei. You can read every question online and attempt the paper under timed exam conditions.
Does the Operating Systems (PU, CMP 232) 2078 paper come with solutions?
Yes. Every question on this Operating Systems (PU, CMP 232) past paper includes a step-by-step solution, plus instant AI feedback when you attempt it on Kekkei.
How many marks is the BE Computer Engineering (Pokhara University) Operating Systems (PU, CMP 232) 2078 paper?
The BE Computer Engineering (Pokhara University) Operating Systems (PU, CMP 232) 2078 paper carries 100 full marks and is meant to be completed in 180 minutes, across 12 questions.
Is practising this Operating Systems (PU, CMP 232) past paper free?
Yes — reading and attempting this Operating Systems (PU, CMP 232) past paper on Kekkei is completely free.