Cpu Scheduling Calculator

CPU Scheduling Calculator body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 1.6; color: #333; background-color: #f9f9f9; } .calculator-container { max-width: 900px; margin: 20px auto; padding: 25px; background-color: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.05); } h2, h3, h4 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; margin-top: 20px; } .calculator-section { background-color: #ecf0f1; padding: 20px; border-radius: 5px; margin-top: 20px; } table { width: 100%; border-collapse: collapse; margin-bottom: 15px; } th, td { border: 1px solid #bdc3c7; padding: 10px; text-align: center; } th { background-color: #34495e; color: #fff; } td input[type="number"] { width: 90%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; text-align: center; } .control-group { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; margin-top: 15px; } .control-group label { font-weight: bold; margin-right: 5px; } .control-group input[type="number"], .control-group select { padding: 8px; border-radius: 4px; border: 1px solid #ccc; } button { background-color: #3498db; color: white; border: none; padding: 10px 15px; border-radius: 5px; cursor: pointer; font-size: 16px; transition: background-color 0.3s; } button:hover { background-color: #2980b9; } .remove-btn { background-color: #e74c3c; } .remove-btn:hover { background-color: #c0392b; } #results-section { margin-top: 30px; } #error-message { color: #e74c3c; font-weight: bold; margin-top: 15px; } #averages { margin-top: 20px; padding: 15px; background-color: #eafaf1; border-left: 5px solid #2ecc71; font-size: 1.1em; } .gantt-chart-container { margin-top: 20px; font-family: monospace; } .gantt-row { display: flex; align-items: center; margin-bottom: 5px; position: relative; height: 40px; border: 1px solid #ccc; background: repeating-linear-gradient(45deg, #f0f0f0, #f0f0f0 10px, #e9e9e9 10px, #e9e9e9 20px); } .gantt-block { position: absolute; height: 100%; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; box-sizing: border-box; border-right: 1px solid rgba(0,0,0,0.2); } .gantt-time-axis { display: flex; position: relative; height: 20px; border-left: 1px solid #ccc; border-right: 1px solid #ccc; } .gantt-time-marker { position: absolute; bottom: 0; transform: translateX(-50%); font-size: 12px; color: #555; } .gantt-time-marker::before { content: '|'; position: absolute; top: -10px; left: 50%; transform: translateX(-50%); } .article-content p, .article-content ul { margin-bottom: 1em; } .article-content ul { padding-left: 20px; } .article-content li { margin-bottom: 0.5em; } .article-content code { background-color: #eee; padding: 2px 4px; border-radius: 3px; font-family: monospace; }

CPU Scheduling Calculator

In an operating system, CPU scheduling is the process of determining which process in the ready queue is to be allocated to the CPU for execution. The goal is to make the system efficient, fast, and fair. This calculator helps you visualize and compare different CPU scheduling algorithms.

Key Concepts

  • Process: A program in execution.
  • Arrival Time (AT): The time at which a process enters the ready queue.
  • Burst Time (BT): The amount of CPU time a process requires for execution.
  • Completion Time (CT): The time at which a process finishes its execution.
  • Turnaround Time (TAT): The total time a process spends in the system. Formula: TAT = CT - AT.
  • Waiting Time (WT): The total time a process spends waiting in the ready queue. Formula: WT = TAT - BT.
  • Time Quantum: A small, fixed unit of time allocated to a process in Round Robin scheduling.

Scheduling Algorithms Explained

This calculator implements four common non-preemptive and preemptive scheduling algorithms:

  1. First-Come, First-Served (FCFS): The simplest scheduling algorithm. Processes are executed in the order they arrive. It's non-preemptive, meaning once a process starts, it runs to completion.
  2. Shortest Job First (SJF): This non-preemptive algorithm selects the process with the smallest burst time from the ready queue. It's optimal for minimizing the average waiting time but requires knowing burst times in advance.
  3. Priority (Non-Preemptive): Each process is assigned a priority. The process with the highest priority (represented by the lowest priority number) is executed next.
  4. Round Robin (RR): A preemptive algorithm designed for time-sharing systems. Each process is given a small time slice (time quantum) to execute. If it doesn't finish, it's moved to the back of the ready queue.

How to Use the Calculator

1. Enter the Arrival Time and Burst Time for each process in the table below. For Priority scheduling, also enter a priority number (a lower number means higher priority).
2. Use the "Add Process" button to add more processes or the "Remove" button to delete them.
3. Select the desired scheduling algorithm from the dropdown menu.
4. If you choose Round Robin, specify a Time Quantum.
5. Click "Calculate" to see the results, including a Gantt chart visualizing the execution, a detailed results table, and the average turnaround and waiting times.

Process Input

Process ID Arrival Time Burst Time Priority Action
P1
P2
P3
P4
First-Come, First-Served (FCFS) Shortest Job First (SJF) Priority (Non-Preemptive) Round Robin (RR)

Results

Gantt Chart

Process Details

Process ID Arrival Time Burst Time Priority Completion Time Turnaround Time Waiting Time
var processCounter = 4; function addProcessRow() { processCounter++; var tableBody = document.getElementById('processTbody'); var newRow = tableBody.insertRow(); newRow.innerHTML = 'P' + processCounter + '' + '' + '' + '' + ''; togglePriorityColumn(); } function removeProcessRow(button) { var row = button.parentNode.parentNode; if (document.getElementById('processTbody').rows.length > 1) { row.parentNode.removeChild(row); updateProcessIds(); } else { alert("At least one process is required."); } } function updateProcessIds() { var tableBody = document.getElementById('processTbody'); var rows = tableBody.rows; for (var i = 0; i < rows.length; i++) { rows[i].cells[0].innerText = 'P' + (i + 1); } processCounter = rows.length; } function togglePriorityColumn() { var algorithm = document.getElementById('algorithm').value; var priorityCols = document.getElementsByClassName('priority-col'); var priorityResultCol = document.getElementsByClassName('priority-col-result')[0]; var timeQuantumGroup = document.getElementById('timeQuantumGroup'); var displayStyle = 'none'; if (algorithm === 'priority') { displayStyle = 'table-cell'; } for (var i = 0; i < priorityCols.length; i++) { priorityCols[i].style.display = displayStyle; } if(priorityResultCol) priorityResultCol.style.display = displayStyle; if (algorithm === 'rr') { timeQuantumGroup.style.display = 'block'; } else { timeQuantumGroup.style.display = 'none'; } } window.onload = function() { togglePriorityColumn(); }; function getProcesses() { var processes = []; var tableBody = document.getElementById('processTbody'); var rows = tableBody.rows; var errorMsg = document.getElementById('error-message'); errorMsg.innerHTML = ''; for (var i = 0; i < rows.length; i++) { var cells = rows[i].cells; var at = parseInt(cells[1].getElementsByTagName('input')[0].value); var bt = parseInt(cells[2].getElementsByTagName('input')[0].value); var priority = parseInt(cells[3].getElementsByTagName('input')[0].value); if (isNaN(at) || at < 0 || isNaN(bt) || bt <= 0 || isNaN(priority) || priority < 0) { errorMsg.innerHTML = 'Please enter valid, non-negative numbers for all fields. Burst Time must be greater than 0.'; return null; } processes.push({ id: 'P' + (i + 1), at: at, bt: bt, priority: priority, original_bt: bt, isCompleted: false }); } return processes; } function calculate() { var processes = getProcesses(); if (!processes) return; var algorithm = document.getElementById('algorithm').value; var results; // Deep copy processes for each algorithm to not mutate the original var processesCopy = JSON.parse(JSON.stringify(processes)); switch (algorithm) { case 'fcfs': results = calculateFCFS(processesCopy); break; case 'sjf': results = calculateSJF(processesCopy); break; case 'priority': results = calculatePriority(processesCopy); break; case 'rr': var timeQuantum = parseInt(document.getElementById('timeQuantum').value); if (isNaN(timeQuantum) || timeQuantum 0).'; return; } results = calculateRR(processesCopy, timeQuantum); break; } displayResults(results.finalProcesses, results.ganttChart); } function calculateFCFS(processes) { processes.sort(function(a, b) { return a.at – b.at; }); var currentTime = 0; var ganttChart = []; for (var i = 0; i < processes.length; i++) { var p = processes[i]; if (currentTime < p.at) { ganttChart.push({ id: 'Idle', start: currentTime, end: p.at }); currentTime = p.at; } p.ct = currentTime + p.bt; p.tat = p.ct – p.at; p.wt = p.tat – p.bt; ganttChart.push({ id: p.id, start: currentTime, end: p.ct }); currentTime = p.ct; } return { finalProcesses: processes, ganttChart: ganttChart }; } function calculateSJF(processes) { var n = processes.length; var completed = 0; var currentTime = 0; var ganttChart = []; while (completed < n) { var readyQueue = []; for (var i = 0; i < n; i++) { if (processes[i].at <= currentTime && !processes[i].isCompleted) { readyQueue.push(processes[i]); } } if (readyQueue.length === 0) { var nextArrivalTime = Infinity; for (var i = 0; i < n; i++) { if (!processes[i].isCompleted) { nextArrivalTime = Math.min(nextArrivalTime, processes[i].at); } } if (nextArrivalTime !== Infinity) { ganttChart.push({ id: 'Idle', start: currentTime, end: nextArrivalTime }); currentTime = nextArrivalTime; } else { break; // All processes accounted for } continue; } readyQueue.sort(function(a, b) { return a.bt – b.bt; }); var currentProcess = readyQueue[0]; currentProcess.ct = currentTime + currentProcess.bt; currentProcess.tat = currentProcess.ct – currentProcess.at; currentProcess.wt = currentProcess.tat – currentProcess.bt; currentProcess.isCompleted = true; ganttChart.push({ id: currentProcess.id, start: currentTime, end: currentProcess.ct }); currentTime = currentProcess.ct; completed++; } return { finalProcesses: processes, ganttChart: ganttChart }; } function calculatePriority(processes) { var n = processes.length; var completed = 0; var currentTime = 0; var ganttChart = []; while (completed < n) { var readyQueue = []; for (var i = 0; i < n; i++) { if (processes[i].at <= currentTime && !processes[i].isCompleted) { readyQueue.push(processes[i]); } } if (readyQueue.length === 0) { var nextArrivalTime = Infinity; for (var i = 0; i < n; i++) { if (!processes[i].isCompleted) { nextArrivalTime = Math.min(nextArrivalTime, processes[i].at); } } if (nextArrivalTime !== Infinity) { ganttChart.push({ id: 'Idle', start: currentTime, end: nextArrivalTime }); currentTime = nextArrivalTime; } else { break; } continue; } readyQueue.sort(function(a, b) { return a.priority – b.priority; }); var currentProcess = readyQueue[0]; currentProcess.ct = currentTime + currentProcess.bt; currentProcess.tat = currentProcess.ct – currentProcess.at; currentProcess.wt = currentProcess.tat – currentProcess.bt; currentProcess.isCompleted = true; ganttChart.push({ id: currentProcess.id, start: currentTime, end: currentProcess.ct }); currentTime = currentProcess.ct; completed++; } return { finalProcesses: processes, ganttChart: ganttChart }; } function calculateRR(processes, timeQuantum) { processes.sort(function(a, b) { return a.at – b.at; }); var n = processes.length; var readyQueue = []; var currentTime = 0; var completed = 0; var ganttChart = []; var processIndex = 0; for (var i = 0; i < n; i++) { processes[i].remaining_bt = processes[i].bt; } while (completed < n) { while (processIndex < n && processes[processIndex].at <= currentTime) { readyQueue.push(processes[processIndex]); processIndex++; } if (readyQueue.length === 0) { if (processIndex < n) { ganttChart.push({ id: 'Idle', start: currentTime, end: processes[processIndex].at }); currentTime = processes[processIndex].at; } else { break; } continue; } var currentProcess = readyQueue.shift(); var execTime = Math.min(timeQuantum, currentProcess.remaining_bt); var startTime = currentTime; currentTime += execTime; currentProcess.remaining_bt -= execTime; ganttChart.push({ id: currentProcess.id, start: startTime, end: currentTime }); while (processIndex < n && processes[processIndex].at 0) { readyQueue.push(currentProcess); } else { currentProcess.ct = currentTime; currentProcess.tat = currentProcess.ct – currentProcess.at; currentProcess.wt = currentProcess.tat – currentProcess.original_bt; currentProcess.isCompleted = true; completed++; } } return { finalProcesses: processes, ganttChart: ganttChart }; } function displayResults(finalProcesses, ganttChart) { document.getElementById('results-section').style.display = 'block'; var resultsTbody = document.getElementById('resultsTbody'); resultsTbody.innerHTML = "; var totalTAT = 0; var totalWT = 0; finalProcesses.sort(function(a, b) { return parseInt(a.id.substring(1)) – parseInt(b.id.substring(1)); }); for (var i = 0; i < finalProcesses.length; i++) { var p = finalProcesses[i]; var newRow = resultsTbody.insertRow(); newRow.innerHTML = '' + p.id + '' + '' + p.at + '' + '' + p.original_bt + '' + '' + p.priority + '' + '' + p.ct + '' + '' + p.tat + '' + '' + p.wt + ''; totalTAT += p.tat; totalWT += p.wt; } var avgTAT = (totalTAT / finalProcesses.length).toFixed(2); var avgWT = (totalWT / finalProcesses.length).toFixed(2); document.getElementById('averages').innerHTML = 'Average Turnaround Time: ' + avgTAT + " + 'Average Waiting Time: ' + avgWT; drawGanttChart(ganttChart); togglePriorityColumn(); } function drawGanttChart(ganttData) { var ganttContainer = document.getElementById('ganttChart'); var timeAxisContainer = document.getElementById('ganttTimeAxis'); ganttContainer.innerHTML = "; timeAxisContainer.innerHTML = "; if (ganttData.length === 0) return; var totalDuration = ganttData[ganttData.length – 1].end; var colors = ['#3498db', '#e74c3c', '#2ecc71', '#f1c40f', '#9b59b6', '#1abc9c', '#e67e22', '#34495e']; var processColors = {}; var colorIndex = 0; for (var i = 0; i < ganttData.length; i++) { var blockData = ganttData[i]; var processId = blockData.id; if (processId !== 'Idle' && !processColors[processId]) { processColors[processId] = colors[colorIndex % colors.length]; colorIndex++; } var block = document.createElement('div'); block.className = 'gantt-block'; var duration = blockData.end – blockData.start; block.style.left = (blockData.start / totalDuration * 100) + '%'; block.style.width = (duration / totalDuration * 100) + '%'; block.style.backgroundColor = (processId === 'Idle') ? '#bdc3c7' : processColors[processId]; block.title = processId + ' (' + blockData.start + ' – ' + blockData.end + ')'; block.innerHTML = processId; ganttContainer.appendChild(block); } // Draw time axis var timeMarker = document.createElement('div'); timeMarker.className = 'gantt-time-marker'; timeMarker.style.left = '0%'; timeMarker.innerText = '0'; timeAxisContainer.appendChild(timeMarker); var uniqueTimes = new Set(); ganttData.forEach(function(d) { uniqueTimes.add(d.end); }); uniqueTimes.forEach(function(time) { var marker = document.createElement('div'); marker.className = 'gantt-time-marker'; marker.style.left = (time / totalDuration * 100) + '%'; marker.innerText = time; timeAxisContainer.appendChild(marker); }); }

Leave a Reply

Your email address will not be published. Required fields are marked *