updated week7, week8

This commit is contained in:
hello 2025-02-20 10:16:27 +05:30
parent 31ebd76c78
commit d53e55ce7c
4 changed files with 395 additions and 262 deletions

BIN
OS/C/Week6/menu Executable file

Binary file not shown.

View File

@ -4,90 +4,87 @@
# define MAX 4 # define MAX 4
typedef struct { typedef struct {
char pid[5]; // Process ID (string) char pid[5]; // Process ID (string)
int at; // Arrival Time int at; // Arrival Time
int bt; // Burst Time int bt; // Burst Time
int priority; // Priority (lower value = higher priority) int priority; // Priority (lower value = higher priority)
int ct; // Completion Time int ct; // Completion Time
int tat; // Turnaround Time int tat; // Turnaround Time
int wt; // Waiting Time int wt; // Waiting Time
int rt; // Response Time int rt; // Response Time
int remaining_bt; // Remaining Burst Time (for preemptive sjf) int remaining_bt; // Remaining Burst Time (for preemptive sjf)
int is_completed; // completion flag int is_completed; // completion flag
} Process; } Process;
void swap(Process *a, Process *b) { void swap(Process *a, Process *b) {
Process temp = *a; Process temp = *a;
*a = *b; *a = *b;
*b = temp; *b = temp;
} }
// Function to calculate Completion Time, Turnaround Time, and Waiting Time // Function to calculate Completion Time, Turnaround Time, and Waiting Time
void calculate_times(Process processes[], int n) { void calculate_times(Process processes[], int n) {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
processes[i].tat = processes[i].ct - processes[i].at; processes[i].tat = processes[i].ct - processes[i].at;
processes[i].wt = processes[i].tat - processes[i].bt; processes[i].wt = processes[i].tat - processes[i].bt;
} }
} }
// Function to calculate average times // Function to calculate average times
void calculate_averages(Process processes[], int n, float *avg_ct, void calculate_averages(Process processes[], int n, float *avg_ct,
float *avg_tat, float *avg_wt, float *avg_rt) { float *avg_tat, float *avg_wt, float *avg_rt) {
*avg_ct = 0; *avg_ct = 0;
*avg_tat = 0; *avg_tat = 0;
*avg_wt = 0; *avg_wt = 0;
*avg_rt = 0; *avg_rt = 0;
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
*avg_ct += processes[i].ct; *avg_ct += processes[i].ct;
*avg_tat += processes[i].tat; *avg_tat += processes[i].tat;
*avg_wt += processes[i].wt; *avg_wt += processes[i].wt;
*avg_rt += processes[i].rt; *avg_rt += processes[i].rt;
} }
*avg_ct /= n; *avg_ct /= n;
*avg_tat /= n; *avg_tat /= n;
*avg_wt /= n; *avg_wt /= n;
*avg_rt /= n; *avg_rt /= n;
} }
// Function to display the Gantt chart // Function to display the Gantt chart
void display_gantt_chart(Process processes[], int n, int timeline[]) { void display_gantt_chart(Process processes[], int n, int timeline[], int timeline_index) {
printf("\nGantt Chart:\n"); printf("\nGantt Chart:\n");
printf("-----------------------------------------------------------\n"); printf("-----------------------------------------------------------\n");
for (int i = 0; i <= timeline[n - 1]; i++) { int last_process = -1;
printf("%-3d", i); for(int i = 0; i < timeline_index; i++) {
} if(timeline[i] != last_process) {
printf("%s ", processes[timeline[i]].pid);
last_process = timeline[i];
}
}
printf("\n-----------------------------------------------------------\n");
}
printf("\n-----------------------------------------------------------\n"); // Function to display the process table
void display_table(Process processes[], int n) {
printf("--------------------------------------------------------------------"
"------\n");
printf("| PID | AT | BT | CT | TAT | WT | RT |\n");
printf("--------------------------------------------------------------------"
"------\n");
for (int i = 0; i < n; i++) {
printf("| %-5s | %-3d | %-3d | %-3d | %-3d | %-3d | %-3d |\n",
processes[i].pid, processes[i].at, processes[i].bt,
processes[i].ct, processes[i].tat, processes[i].wt,
processes[i].rt);
}
printf("--------------------------------------------------------------------"
"------\n");
}
for (int i = 0; i < n; i++) { // Preemptive SJF
printf("%-3s", processes[i].pid); void preemptive_sjf(Process processes[], int n){
}
printf("\n-----------------------------------------------------------\n");
}
// Function to display the process table
void display_table(Process processes[], int n) {
printf("--------------------------------------------------------------------"
"------\n");
printf("| PID | AT | BT | CT | TAT | WT | RT |\n");
printf("--------------------------------------------------------------------"
"------\n");
for (int i = 0; i < n; i++) {
printf("| %-5s | %-3d | %-3d | %-3d | %-3d | %-3d | %-3d |\n",
processes[i].pid, processes[i].at, processes[i].bt,
processes[i].ct, processes[i].tat, processes[i].wt,
processes[i].rt);
}
printf("--------------------------------------------------------------------"
"------\n");
}
// Preemptive SJF
void preemptive_sjf(Process processes[], int n){
// process sort by AT // process sort by AT
for (int i = 0; i < n -1; i++){ for (int i = 0; i < n -1; i++){
@ -110,13 +107,14 @@
int completed = 0; int completed = 0;
int shortest = -1; int shortest = -1;
int *timeline = (int *)malloc((n*2)*sizeof(int)); int *timeline = (int *)malloc((n*100)*sizeof(int));
if (timeline == NULL) { if (timeline == NULL) {
perror ("MemAlloc Error"); perror ("MemAlloc Error");
return; return;
} }
int timeline_index = 0; int timeline_index = 0;
int last_process = -1;
// setting to large values to prevent issues // setting to large values to prevent issues
while (completed != n) while (completed != n)
@ -140,248 +138,248 @@
processes[shortest].rt = current_time - processes[shortest].at; processes[shortest].rt = current_time - processes[shortest].at;
} }
if(shortest != last_process) {
timeline[timeline_index++] = shortest;
last_process = shortest;
}
processes[shortest].remaining_bt--; processes[shortest].remaining_bt--;
current_time++; current_time++;
if (processes[shortest].remaining_bt == 0) {
if (processes[shortest].remaining_bt == 0) { completed++;
completed++; processes[shortest].ct = current_time;
processes[shortest].ct = current_time; processes[shortest].is_completed = 1;
processes[shortest].is_completed = 1; }
}
timeline[timeline_index++] = current_time;
} }
calculate_times(processes, n); calculate_times(processes, n);
float avg_ct, avg_tat, avg_wt, avg_rt; float avg_ct, avg_tat, avg_wt, avg_rt;
calculate_averages(processes, n, &avg_ct, &avg_tat, &avg_wt, &avg_rt); calculate_averages(processes, n, &avg_ct, &avg_tat, &avg_wt, &avg_rt);
printf("\nPreemptive SJF Scheduling:\n"); printf("\nPreemptive SJF Scheduling:\n");
display_table(processes, n); display_table(processes, n);
printf("\nAverage Completion Time: %.2f\n", avg_ct); printf("\nAverage Completion Time: %.2f\n", avg_ct);
printf("Average Turnaround Time: %.2f\n", avg_tat); printf("Average Turnaround Time: %.2f\n", avg_tat);
printf("Average Waiting Time: %.2f\n", avg_wt);
printf("Average Response Time: %.2f\n", avg_rt);
display_gantt_chart(processes, n, timeline);
free(timeline);
}
void round_robin(Process processes[], int n, int quantum) {
for (int i = 0; i < n; i++) {
processes[i].remaining_bt = processes[i].bt;
processes[i].rt = -1;
processes[i].is_completed = 0;
}
int current_time = 0;
int completed = 0;
int i = 0;
int *timeline = (int *)malloc((n * 2) * sizeof(int)); // memory for timeline
if (timeline == NULL) {
perror("Failed to allocate memory for timeline");
return;
}
int timeline_index = 0;
while (completed != n) {
if (processes[i].remaining_bt > 0 && processes[i].at <= current_time) {
if (processes[i].rt == -1) {
processes[i].rt = current_time - processes[i].at;
}
int execute_time = (processes[i].remaining_bt > quantum) ? quantum : processes[i].remaining_bt; processes[i].remaining_bt -= execute_time; current_time += execute_time;
if (processes[i].remaining_bt == 0) {
completed++;
processes[i].ct = current_time;
processes[i].is_completed = 1;
}
timeline[timeline_index++] = current_time;
} else if (processes[i].at > current_time) {
current_time++; // if process hasn't arrived, time is incremented (to prevent a stall)
}
i = (i + 1) % n;
if (current_time > 1000) break;
}
calculate_times(processes, n);
float avg_ct, avg_tat, avg_wt, avg_rt;
calculate_averages(processes, n, &avg_ct, &avg_tat, &avg_wt, &avg_rt);
printf("\nRound Robin Scheduling (Quantum = %d):\n", quantum);
display_table(processes, n);
printf("\nAverage Completion Time: %.2f\n", avg_ct);
printf("Average Turnaround Time: %.2f\n", avg_tat);
printf("Average Waiting Time: %.2f\n", avg_wt); printf("Average Waiting Time: %.2f\n", avg_wt);
printf("Average Response Time: %.2f\n", avg_rt); printf("Average Response Time: %.2f\n", avg_rt);
display_gantt_chart(processes, n, timeline); display_gantt_chart(processes, n, timeline, timeline_index);
free(timeline); // Free memory free(timeline);
} }
void round_robin(Process processes[], int n, int quantum) {
for (int i = 0; i < n; i++) {
processes[i].remaining_bt = processes[i].bt;
processes[i].rt = -1;
processes[i].is_completed = 0;
}
void non_preemptive_priority(Process processes[], int n) { int current_time = 0;
for (int i = 0; i < n - 1; i++) { int completed = 0;
for (int j = 0; j < n - i - 1; j++) { int i = 0;
if (processes[j].at > processes[j + 1].at) { int *timeline = (int *)malloc((n * 100) * sizeof(int));
swap(&processes[j], &processes[j + 1]);
}
}
}
int current_time = 0;
int completed = 0;
int *timeline = (int *)malloc((n * 2) * sizeof(int));
if (timeline == NULL) { if (timeline == NULL) {
perror("Failed to allocate memory for timeline"); perror("Failed to allocate memory for timeline");
return; return;
} }
int timeline_index = 0; int timeline_index = 0;
int last_process = -1;
while (completed != n) { while (completed != n) {
int highest_priority = -1; if (processes[i].remaining_bt > 0 && processes[i].at <= current_time) {
int min_priority = 9999; // Large value if (processes[i].rt == -1) {
processes[i].rt = current_time - processes[i].at;
}
if(i != last_process) {
timeline[timeline_index++] = i;
last_process = i;
}
for (int j = 0; j < n; j++) { int execute_time = (processes[i].remaining_bt > quantum) ? quantum : processes[i].remaining_bt;
if (processes[j].at <= current_time && processes[j].bt > 0 && processes[j].priority < min_priority) { processes[i].remaining_bt -= execute_time;
min_priority = processes[j].priority; current_time += execute_time;
highest_priority = j;
}
}
if (highest_priority == -1) { if (processes[i].remaining_bt == 0) {
current_time++; completed++;
continue; processes[i].ct = current_time;
} processes[i].is_completed = 1;
}
if (processes[highest_priority].rt == -1) { } else if (processes[i].at > current_time) {
processes[highest_priority].rt = current_time++;
current_time - processes[highest_priority].at; }
}
current_time += processes[highest_priority].bt; i = (i + 1) % n;
if (current_time > 1000) break;
}
processes[highest_priority].ct = current_time; calculate_times(processes, n);
processes[highest_priority].bt = 0; // Mark completed
completed++; float avg_ct, avg_tat, avg_wt, avg_rt;
timeline[timeline_index++] = current_time; calculate_averages(processes, n, &avg_ct, &avg_tat, &avg_wt, &avg_rt);
}
calculate_times(processes, n); printf("\nRound Robin Scheduling (Quantum = %d):\n", quantum);
display_table(processes, n);
float avg_ct, avg_tat, avg_wt, avg_rt; printf("\nAverage Completion Time: %.2f\n", avg_ct);
calculate_averages(processes, n, &avg_ct, &avg_tat, &avg_wt, &avg_rt); printf("Average Turnaround Time: %.2f\n", avg_tat);
printf("Average Waiting Time: %.2f\n", avg_wt);
printf("Average Response Time: %.2f\n", avg_rt);
printf("\nNon-Preemptive Priority Scheduling:\n"); display_gantt_chart(processes, n, timeline, timeline_index);
display_table(processes, n); free(timeline);
}
printf("\nAverage Completion Time: %.2f\n", avg_ct); void non_preemptive_priority(Process processes[], int n) {
printf("Average Turnaround Time: %.2f\n", avg_tat); for (int i = 0; i < n - 1; i++) {
printf("Average Waiting Time: %.2f\n", avg_wt); for (int j = 0; j < n - i - 1; j++) {
printf("Average Response Time: %.2f\n", avg_rt); if (processes[j].at > processes[j + 1].at) {
swap(&processes[j], &processes[j + 1]);
}
}
}
display_gantt_chart(processes, n, timeline); int current_time = 0;
free(timeline); // Free memory int completed = 0;
} int *timeline = (int *)malloc((n * 100) * sizeof(int));
if (timeline == NULL) {
perror("Failed to allocate memory for timeline");
return;
}
int main() { int timeline_index = 0;
int n, choice, quantum; int last_process = -1;
printf("Enter the number of processes: "); while (completed != n) {
scanf("%d", &n); int highest_priority = -1;
int min_priority = 9999;
Process processes[n]; for (int j = 0; j < n; j++) {
if (processes[j].at <= current_time && processes[j].bt > 0 && processes[j].priority < min_priority) {
min_priority = processes[j].priority;
highest_priority = j;
}
}
// Input process details if (highest_priority == -1) {
for (int i = 0; i < n; i++) { current_time++;
continue;
}
if (processes[highest_priority].rt == -1) {
processes[highest_priority].rt = current_time - processes[highest_priority].at;
}
if(highest_priority != last_process) {
timeline[timeline_index++] = highest_priority;
last_process = highest_priority;
}
current_time += processes[highest_priority].bt;
processes[highest_priority].ct = current_time;
processes[highest_priority].bt = 0;
completed++;
}
calculate_times(processes, n);
float avg_ct, avg_tat, avg_wt, avg_rt;
calculate_averages(processes, n, &avg_ct, &avg_tat, &avg_wt, &avg_rt);
printf("\nNon-Preemptive Priority Scheduling:\n");
display_table(processes, n);
printf("\nAverage Completion Time: %.2f\n", avg_ct);
printf("Average Turnaround Time: %.2f\n", avg_tat);
printf("Average Waiting Time: %.2f\n", avg_wt);
printf("Average Response Time: %.2f\n", avg_rt);
display_gantt_chart(processes, n, timeline, timeline_index);
free(timeline);
}
int main() {
int n, choice, quantum;
printf("Enter the number of processes: ");
scanf("%d", &n);
Process processes[n];
// Input process details
for (int i = 0; i < n; i++) {
printf("\nEnter details for process %d:\n", i + 1); printf("\nEnter details for process %d:\n", i + 1);
printf("PID: "); printf("PID: ");
scanf("%s", processes[i].pid); scanf("%s", processes[i].pid);
printf("Arrival Time: "); printf("Arrival Time: ");
scanf("%d", &processes[i].at); scanf("%d", &processes[i].at);
printf("Burst Time: "); printf("Burst Time: ");
scanf("%d", &processes[i].bt); scanf("%d", &processes[i].bt);
printf("Priority (lower value = higher priority): "); printf("Priority (lower value = higher priority): ");
scanf("%d", &processes[i].priority); scanf("%d", &processes[i].priority);
processes[i].rt = 0; // Initialize response time processes[i].rt = 0; // Initialize response time
processes[i].is_completed = 0; // Initialize completion flag processes[i].is_completed = 0; // Initialize completion flag
} }
// Display initial table // Display initial table
printf("\nInitial Process Table:\n"); printf("\nInitial Process Table:\n");
printf("-----------------------\n"); printf("-----------------------\n");
printf("| PID | AT | BT |\n"); printf("| PID | AT | BT |\n");
printf("-----------------------\n"); printf("-----------------------\n");
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
printf("| %-5s | %-3d | %-3d |\n", processes[i].pid, processes[i].at, processes[i].bt); printf("| %-5s | %-3d | %-3d |\n", processes[i].pid, processes[i].at, processes[i].bt);
} }
printf("-----------------------\n"); printf("-----------------------\n");
// Algorithm Selection Menu with Loop and Exit // Algorithm Selection Menu with Loop and Exit
while (1) { while (1) {
printf("\nChoose a scheduling algorithm:\n"); printf("\nChoose a scheduling algorithm:\n");
printf("1. Preemptive SJF\n"); printf("1. Preemptive SJF\n");
printf("2. Round Robin\n"); printf("2. Round Robin\n");
printf("3. Non-Preemptive Priority\n"); printf("3. Non-Preemptive Priority\n");
printf("4. Exit\n"); printf("4. Exit\n");
printf("Enter your choice: "); printf("Enter your choice: ");
scanf("%d", &choice); scanf("%d", &choice);
switch (choice) { switch (choice) {
case 1: case 1:
preemptive_sjf(processes, n); preemptive_sjf(processes, n);
break; break;
case 2: case 2:
printf("Enter the time quantum: "); printf("Enter the time quantum: ");
scanf("%d", &quantum); scanf("%d", &quantum);
round_robin(processes, n, quantum); round_robin(processes, n, quantum);
break; break;
case 3: case 3:
non_preemptive_priority(processes, n); non_preemptive_priority(processes, n);
break; break;
case 4: case 4:
printf("Exiting program.\n"); printf("Exiting program.\n");
exit(0); exit(0);
default: default:
printf("Invalid choice. Please try again.\n"); printf("Invalid choice. Please try again.\n");
} }
} }
return 0; return 0;
} }

View File

@ -0,0 +1 @@
// Write a C program to solve the Dining-Philosophers problem.

134
OS/C/Week8/q1.c Normal file
View File

@ -0,0 +1,134 @@
// Develop a program to simulate bankers algorithm. (Consider safety and resource-request algorithms)
#include <stdio.h>
#define MAX_PROCESSES 10
#define MAX_RESOURCES 10
int processes, resources;
int available[MAX_RESOURCES];
int maximum[MAX_PROCESSES][MAX_RESOURCES];
int allocation[MAX_PROCESSES][MAX_RESOURCES];
int need[MAX_PROCESSES][MAX_RESOURCES];
int safeSequence[MAX_PROCESSES];
void initialize() {
printf("Enter number of processes: ");
scanf("%d", &processes);
printf("Enter number of resources: ");
scanf("%d", &resources);
printf("\nEnter available resources:\n");
for(int i=0; i<resources; i++) {
scanf("%d", &available[i]);
}
printf("\nEnter maximum matrix:\n");
for(int i=0; i<processes; i++) {
for(int j=0; j<resources; j++) {
scanf("%d", &maximum[i][j]);
}
}
printf("\nEnter allocation matrix:\n");
for(int i=0; i<processes; i++) {
for(int j=0; j<resources; j++) {
scanf("%d", &allocation[i][j]);
need[i][j] = maximum[i][j] - allocation[i][j];
}
}
}
int isSafe() {
int work[MAX_RESOURCES];
int finish[MAX_PROCESSES] = {0};
int count = 0;
for(int i=0; i<resources; i++)
work[i] = available[i];
while(count < processes) {
int found = 0;
for(int p=0; p<processes; p++) {
if(!finish[p]) {
int j;
for(j=0; j<resources; j++) {
if(need[p][j] > work[j])
break;
}
if(j == resources) {
for(int k=0; k<resources; k++)
work[k] += allocation[p][k];
safeSequence[count] = p;
finish[p] = 1;
count++;
found = 1;
}
}
}
if(!found) return 0;
}
return 1;
}
void resourceRequest(int process) {
int request[MAX_RESOURCES];
printf("\nEnter resource request for process %d:\n", process);
for(int i=0; i<resources; i++) {
scanf("%d", &request[i]);
}
// Check if request is valid
for(int i=0; i<resources; i++) {
if(request[i] > need[process][i]) {
printf("Error: Request exceeds maximum claim\n");
return;
}
if(request[i] > available[i]) {
printf("Error: Resources not available\n");
return;
}
}
// Try to allocate
for(int i=0; i<resources; i++) {
available[i] -= request[i];
allocation[process][i] += request[i];
need[process][i] -= request[i];
}
if(isSafe()) {
printf("Request granted\n");
} else {
printf("Request denied - unsafe state\n");
// Rollback
for(int i=0; i<resources; i++) {
available[i] += request[i];
allocation[process][i] -= request[i];
need[process][i] += request[i];
}
}
}
int main() {
initialize();
if(isSafe()) {
printf("\nSystem is in safe state.\nSafe sequence: ");
for(int i=0; i<processes; i++)
printf("P%d ", safeSequence[i]);
printf("\n");
int process;
printf("\nEnter process number (0-%d) to request resources: ", processes-1);
scanf("%d", &process);
resourceRequest(process);
} else {
printf("\nSystem is not in safe state!\n");
}
return 0;
}