OS LAB Manual (2) (1)
OS LAB Manual (2) (1)
Program:
#include<stdio.h>
#include<stdlib.h>
int mutex = 1, full = 0, empty = 3, x = 0;
int main ()
{
int n;
void producer ();
void consumer ();
int wait (int);
int signal (int);
printf ("\n1.Producer\n2.Consumer\n3.Exit");
while (1)
{
printf ("\nEnter your choice:");
scanf ("%d", &n);
switch (n)
{
case 1:
if ((mutex == 1) && (empty != 0))
producer ();
else
printf ("Buffer is full!!");
break;
case 2:
if ((mutex == 1) && (full != 0))
consumer ();
else
printf ("Buffer is empty!!");
break;
case 3:
exit (0);
break;
}
}
return 0;
}
int wait (int s)
{
return (--s);
}
int signal (int s)
{
return (++s);
}
void producer ()
{
mutex = wait (mutex);
full = signal (full);
empty = wait (empty);
x++;
printf ("\nProducer produces the item %d", x);
mutex = signal (mutex);
}
void consumer ()
{
mutex = wait (mutex);
full = wait (full);
empty = signal (empty);
printf ("\nConsumer consumes item %d", x);
x--;
mutex = signal (mutex);
}
Output:
Week: 5
Write C programs to illustrate the following IPC mechanisms
ALGORITHM:
1. Start the program.
2. Declare the variables.
3. Read the choice.
4. Create a piping processing using IPC.
5. Assign the variable lengths
6. “strcpy” the message lengths.
7. To join the operation using IPC .
8. Stop the program
Program :
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MSG_LEN 64
int main() {
int result;
int fd[2];
char message[MSG_LEN];
char recvd_msg[MSG_LEN];
// Close the write end of the pipe after writing all messages
close(fd[1]);
return 0;
}
Output:
a) FIFO
Program:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/stat.h>
#define FIFO_FILE "fifo.txt"
int main(void)
{
FILE *fp;
char readbuf[80];
/* Create the FIFO if it does not exist */
umask(0);
mknod(FIFO_FILE, S_IFIFO|0666, 0);
while(1)
{
fp = fopen(FIFO_FILE, "r");
fgets(readbuf, 80, fp);
printf("Received string: %s \n", readbuf);
fclose(fp);
}
return(0);
}
OUTPUT:
C) Message Queue (Writer Process)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int main()
{
key_t key;
int msgid;
message.msg_type = 1;
// Use fgets instead of gets for safer input
printf("Write Data: ");
if (fgets(message.msg_text, sizeof(message.msg_text), stdin) == NULL) {
perror("fgets failed");
exit(1);
}
return 0;
}
OUTPUT :
Message Queue (Reader Process)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// structure for message queue
struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;
int main()
{
key_t key;
int msgid;
// ftok to generate unique key
key = ftok("fifo.txt", 65);
// msgget creates a message queue
// and returns identifier
msgid = msgget(key, 0666 | IPC_CREAT);
// msgrcv to receive message
msgrcv(msgid, &message, sizeof(message), 1, 0);
// display the message
printf("Data Received is : %s \n",message.mesg_text);
// to destroy the message queue
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
OUTPUT:
d) Shared Memory
Shmwrite.c
Program:
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/ipc.h>
int main() {
key_t key = ftok("shmfile", 65); // Generate the same key
int shmid = shmget(key, SHM_SIZE, 0666); // Get shared memory ID
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
return 0;
}
OUTPUT:
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc shmwrite.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
Enter a message: Hi Kumar
Message written to shared memory: Hi Kumar
Shmread.c
Program:
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/ipc.h>
int main() {
key_t key = ftok("shmfile", 65); // Generate the same key
int shmid = shmget(key, SHM_SIZE, 0666); // Get shared memory ID
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
return 0;
}
OUTPUT:
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc shmread.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
Message read from shared memory: Hi Kumar
6. Aim: Write C programs to simulate the following memory management techniques
a) Paging
AIM: To write a C program to implement memory management using paging technique.
ALGORITHM:
Step1 : Start the program.
Step2 : Read the base address, page size, number of pages and memory unit.
Step3 : If the memory limit is less than the base address display the memory limit is less than
limit.
Step4 : Create the page table with the number of pages and page address.
Step5 : Read the page number and displacement value.
Step6 : If the page number and displacement value is valid, add the displacement value with the
address
corresponding to the page number and display the result.
Step7 : Display the page is not found or displacement should be less than page size.
Step8 : Stop the program.
PROGRAM:
#include <stdio.h>
int main() {
int ms, ps, nop, np, rempages, i, j, x, y, pa, offset;
int s[10], fno[10][20];
nop = ms / ps;
printf("The number of pages available in memory: %d\n", nop);
rempages = nop;
rempages -= s[i];
printf("Enter page table for p[%d] (frame numbers):\n", i);
for (j = 0; j < s[i]; j++) {
printf("Page %d -> Frame: ", j);
scanf("%d", &fno[i][j]);
}
}
return 0;
}
OUTPUT :
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc paging.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
Enter the memory size: 1000
Enter the page size: 100
The number of pages available in memory: 10
Enter number of processes: 2
Enter number of pages required for p[1]: 3
Enter page table for p[1] (frame numbers):
Page 0 -> Frame: 4
Page 1 -> Frame: 5
Page 2 -> Frame: 9
Enter number of pages required for p[2]: 2
Enter page table for p[2] (frame numbers):
Page 0 -> Frame: 3
Page 1 -> Frame: 5
PROGRAM :
#include <stdio.h>
#include <stdlib.h> // for malloc
struct list {
int seg;
int base;
int limit;
struct list *next;
} *p = NULL;
void insert(struct list **q, int base, int limit, int seg) {
struct list *temp = (struct list *)malloc(sizeof(struct list));
temp->base = base;
temp->limit = limit;
temp->seg = seg;
temp->next = NULL;
if (*q == NULL) {
*q = temp;
} else {
struct list *curr = *q;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = temp;
}
}
int main() {
int seg, offset, limit, base;
int physical;
do {
printf("Enter segment number: ");
scanf("%d", &seg);
if (seg != -1) {
printf("Enter base value: ");
scanf("%d", &base);
printf("Enter limit value: ");
scanf("%d", &limit);
insert(&p, base, limit, seg);
}
} while (seg != -1);
printf("Enter offset: ");
scanf("%d", &offset);
printf("Enter segment number: ");
scanf("%d", &seg);
return 0;
}
OUTPUT:
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc segm.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
Enter segment table
Enter -1 as segment number to stop
Enter segment number: 0
Enter base value: 1000
Enter limit value: 200
Enter segment number: 1
Enter base value: 300
Enter limit value: 100
Enter segment number: -1
Enter offset: 50
Enter segment number: 0
Address in physical memory: 1050
7. Write C programs to simulate Page replacement policies a) FCFS b) LRU c) Optimal
● On a page fault:
○ If full, remove the oldest page and insert the new one.
PROGRAM :
#include <stdio.h>
int main() {
scanf("%d", &n);
scanf("%d", &pages[i]);
}
int index = 0;
flag = 0;
if (temp[j] == pages[i]) {
flag = 1;
break;
}
}
if (flag == 0) {
temp[index] = pages[i];
pageFaults++;
}
}
return 0;
}
OUTPUT:
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc fcfsp.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
Algorithm:
● On a page fault:
○ Else, remove the least recently used page (front) and insert the new one.
PROGRAM:
#include <stdio.h>
int main() {
scanf("%d", &n);
scanf("%d", &pages[i]);
scanf("%d", &f);
for (i = 0; i < f; i++) {
frames[i] = -1;
}
flag = 0;
if (frames[j] == pages[i]) {
flag = 1;
recent[j] = i;
break;
}
}
if (flag == 0) {
if (frames[j] == -1) {
pos = j;
break;
}
pos = j;
}
}
frames[pos] = pages[i];
recent[pos] = i;
pageFaults++;
}
}
return 0;
OUTPUT:
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc LRU.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out
Algorithm:
● On a page fault:
○ Else, look ahead in the page reference string and remove the page that won’t be
used for the longest time.
PROGRAM :
#include <stdio.h>
int main() {
scanf("%d", &n);
scanf("%d", &pages[i]);
}
scanf("%d", &f);
frames[i] = -1;
flag = 0;
if (frames[j] == pages[i]) {
flag = 1;
break;
}
}
if (flag == 0) {
int found = 0;
if (frames[j] == -1) {
frames[j] = pages[i];
found = 1;
break;
}
}
if (!found) {
int idx[10];
idx[j] = -1;
if (frames[j] == pages[k]) {
idx[j] = k;
break;
}
}
}
farthest = -1;
pos = -1;
if (idx[j] == -1) {
pos = j;
break;
}
farthest = idx[j];
pos = j;
}
}
frames[pos] = pages[i];
}
pageFaults++;
}
}
return 0;
OUTPUT:
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ cc optimal.c
mrce@mrce-ThinkCentre-neo-50s-Gen-4:~$ ./a.out