Os Exam
Os Exam
int buffer[BUFFER_SIZE];
int in = 0, out = 0;
sem_t empty, full, mutex;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0; }
#include <stdio.h> #include <stdlib.h> #include <pthread.h>
Dining Philospher
#define NUM_PHILOSOPHERS 5
sem_t forks[NUM_PHILOSOPHERS];
sem_wait(&forks[id]);
sem_wait(&forks[(id + 1) % NUM_PHILOSOPHERS]);
sleep(1);
sem_post(&forks[id]);
sem_post(&forks[(id + 1) % NUM_PHILOSOPHERS]);
return NULL;
int main() {
pthread_t threads[NUM_PHILOSOPHERS];
int ids[NUM_PHILOSOPHERS];
sem_init(&forks[i], 0, 1);
ids[i] = i; }
pthread_join(threads[i], NULL); }
sem_destroy(&forks[i]);
return 0; }
#include <stdio.h> LRU
void lru(int pages[], int n, int capacity) {
int frames[capacity], timestamps[capacity], time = 0, faults = 0;
for (int i = 0; i < capacity; i++) {
frames[i] = -1; // Initialize frames as empty
timestamps[i] = -1; // Initialize timestamps
}
printf("Page\tFrames\n");
for (int i = 0; i < n; i++) {
int found = 0, least_used_index = 0;
// Check if the page is already in a frame
for (int j = 0; j < capacity; j++) {
if (frames[j] == pages[i]) {
found = 1;
timestamps[j] = time++; // Update usage time
break;
}
}
// Page fault: replace the least recently used page
if (!found) {
for (int j = 1; j < capacity; j++) {
if (timestamps[j] < timestamps[least_used_index])
least_used_index = j;
}
frames[least_used_index] = pages[i];
timestamps[least_used_index] = time++;
faults++;
}
// Print the current state of frames
printf("%d\t", pages[i]);
for (int j = 0; j < capacity; j++)
printf("%d ", frames[j] == -1 ? -1 : frames[j]);
printf("\n");
}
printf("Total Page Faults: %d\n", faults);
}
int main() {
int pages[] = {3,2,1,3,4,1,6,2,4,3,4,2,1,4,5,2,1,3,4};
int n = sizeof(pages) / sizeof(pages[0]);
int capacity = 3;
lru(pages, n, capacity);
return 0;
}
#include <stdio.h> cscan
#include <stdlib.h>
int cScan(int requests[], int n, int head, int disk_size) {
int total_seek = 0;
int i, j;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (requests[i] > requests[j]) {
int temp = requests[i];
requests[i] = requests[j];
requests[j] = temp;
} }
}
int pos = 0;
while (pos < n && requests[pos] < head) {
pos++;
}
for (i = pos; i < n; i++) {
total_seek += abs(requests[i] - head);
head = requests[i];
}
total_seek += abs(disk_size - 1 - head);
total_seek += disk_size - 1;
head = 0;
for (i = 0; i < pos; i++) {
total_seek += abs(requests[i] - head);
head = requests[i];
}
return total_seek;
}
int main() {
int n, i, head;
int disk_size = 200;
printf("Enter number of disk requests: ");
scanf("%d", &n);
int requests[n];
printf("Enter the disk requests: ");
for (i = 0; i < n; i++) { scanf("%d", &requests[i]); }
printf("Enter the initial position of the head: ");
scanf("%d", &head);
int total_seek = cScan(requests, n, head, disk_size);
printf("Total seek movement: %d\n", total_seek);
return 0; }