Q.10) Write the program to simulate Non-preemptive Priority
scheduling.
The arrival time and first CPU-burst and priority for different n
number
of processes should be input to the algorithm. Assume the fixed
IO
waiting time (2 units). The next CPU-burst should be generated
randomly. The output should give Gantt chart, turnaround time and
waiting time for each process. Also find the average waiting time
and
turnaround time.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct process_info
{
char pname[20];
int at, bt, ct, bt1, p;
struct process_info *next;
} NODE;
int n;
NODE *first, *last;
void accept_info()
{
NODE *p;
int i;
printf("Enter no.of process:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
p = (NODE *)malloc(sizeof(NODE));
printf("Enter process name:");
scanf("%s", p->pname);
printf("Enter arrival time:");
scanf("%d", &p->at);
printf("Enter first CPU burst time:");
scanf("%d", &p->bt);
printf("Enter priority:");
scanf("%d", &p->p);
p->bt1 = p->bt;
p->next = NULL;
if (first == NULL)
first = p;
else
last->next = p;
last = p;
}
}
void print_output()
{
NODE *p;
float avg_tat = 0, avg_wt = 0;
printf("pname\tat\tbt\tp\ttct\ttat\twt\n");
p = first;
while (p != NULL)
{
int tat = p->ct - p->at;
int wt = tat - p->bt;
avg_tat += tat;
avg_wt += wt;
printf("%s\t%d\t%d\t%d\t%d\t%d\t%d\n",
p->pname, p->at, p->bt, p->p, p->ct, tat, wt);
p = p->next;
}
printf("Avg TAT=%f\tAvg WT=%f\n",
avg_tat / n, avg_wt / n);
}
void print_input()
{
NODE *p;
p = first;
printf("pname\tat\tbt\tp\n");
while (p != NULL)
{
printf("%s\t%d\t%d\t%d\n",
p->pname, p->at, p->bt1, p->p);
p = p->next;
}
}
void sort()
{
NODE *p, *q;
int t;
char name[20];
p = first;
while (p->next != NULL)
{
q = p->next;
while (q != NULL)
{
if (p->at > q->at)
{
strcpy(name, p->pname);
strcpy(p->pname, q->pname);
strcpy(q->pname, name);
t = p->at;
p->at = q->at;
q->at = t;
t = p->bt;
p->bt = q->bt;
q->bt = t;
t = p->ct;
p->ct = q->ct;
q->ct = t;
t = p->bt1;
p->bt1 = q->bt1;
q->bt1 = t;
t = p->p;
p->p = q->p;
q->p = t;
}
q = q->next;
}
p = p->next;
}
}
int time;
NODE *get_p()
{
NODE *p, *min_p = NULL;
int min = 9999;
p = first;
while (p != NULL)
{
if (p->at <= time && p->bt1 != 0 &&
p->p < min)
{
min = p->p;
min_p = p;
}
p = p->next;
}
return min_p;
}
struct gantt_chart
{
int start;
char pname[30];
int end;
} s[100], s1[100];
int k;
void pnp()
{
int prev = 0, n1 = 0;
NODE *p;
while (n1 != n)
{
p = get_p();
if (p == NULL)
{
time++;
s[k].start = prev;
strcpy(s[k].pname, "*");
s[k].end = time;
prev = time;
k++;
}
else
{
time += p->bt1;
s[k].start = prev;
strcpy(s[k].pname, p->pname);
s[k].end = time;
prev = time;
k++;
p->ct = time;
p->bt1 = 0;
n1++;
}
print_input();
sort();
}
}
void print_gantt_chart()
{
int i, j, m;
s1[0] = s[0];
for (i = 1, j = 0; i < k; i++)
{
if (strcmp(s[i].pname, s1[j].pname) == 0)
s1[j].end = s[i].end;
else
s1[++j] = s[i];
}
printf(" %d ", s1[0].start);
for (i = 0; i <= j; i++)
{
m = (s1[i].end - s1[i].start);
for (k = 0; k < m / 2; k++)
printf("-");
printf("%s", s1[i].pname);
for (k = 0; k < (m + 1) / 2; k++)
printf("-");
printf("%d", s1[i].end);
}
}
int main()
{
accept_info();
sort();
pnp();
print_gantt_chart();
printf("\n");
print_output();
return 0;
}
*************************OUTPUT********************
cs10@cs10-Lenovo-C20-30:~$ cd Documents/
cs10@cs10-Lenovo-C20-30:~/Documents$ cd kadam
cs10@cs10-Lenovo-C20-30:~/Documents/kadam$ gcc osprogram10.c
cs10@cs10-Lenovo-C20-30:~/Documents/kadam$ ./a.out
Enter no.of process:5
Enter process name:sjf
Enter arrival time:3
Enter first CPU burst time:4
Enter priority:2
Enter process name:4
Enter arrival time:9
Enter first CPU burst time:7
Enter priority:
3
Enter process name:fcfs
Enter arrival time:3
Enter first CPU burst time:2
Enter priority:4
Enter process name:sjf
Enter arrival time:4
Enter first CPU burst time:3
Enter priority:2
Enter process name:fcfs
Enter arrival time:4
Enter first CPU burst time:6
Enter priority:3
pname at bt p
sjf 3 4 2
fcfs 3 2 4
sjf 4 3 2
fcfs 4 6 3
4 9 7 3
pname at bt p
sjf 3 4 2
fcfs 3 2 4
sjf 4 3 2
fcfs 4 6 3
4 9 7 3
pname at bt p
sjf 3 4 2
fcfs 3 2 4
sjf 4 3 2
fcfs 4 6 3
4 9 7 3
pname at bt p
sjf 3 0 2
fcfs 3 2 4
sjf 4 3 2
fcfs 4 6 3
4 9 7 3
pname at bt p
sjf 3 0 2
fcfs 3 2 4
sjf 4 0 2
fcfs 4 6 3
4 9 7 3
pname at bt p
sjf 3 0 2
fcfs 3 2 4
sjf 4 0 2
fcfs 4 0 3
4 9 7 3
pname at bt p
sjf 3 0 2
fcfs 3 2 4
sjf 4 0 2
fcfs 4 0 3
4 9 0 3
pname at bt p
sjf 3 0 2
fcfs 3 0 4
sjf 4 0 2
fcfs 4 0 3
4 9 0 3
0 -*--3---sjf----10---fcfs---16---4----23-fcfs-25
pname at bt p tct tat wt
sjf 3 4 2 7 4 0
fcfs 3 2 4 25 22 20
sjf 4 3 2 10 6 3
fcfs 4 6 3 16 12 6
4 9 7 3 23 14 7
Avg TAT=11.600000 Avg WT=7.200000
Write, Run & Share C Language code online using OneCompiler's C online compiler for free. It's one of the robust, feature-rich online compilers for C language, running the latest C version which is C18. Getting started with the OneCompiler's C editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'C' and start coding!
OneCompiler's C online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample C program which takes name as input and print your name with hello.
#include <stdio.h>
int main()
{
char name[50];
printf("Enter name:");
scanf("%s", name);
printf("Hello %s \n" , name );
return 0;
}
C language is one of the most popular general-purpose programming language developed by Dennis Ritchie at Bell laboratories for UNIX operating system. The initial release of C Language was in the year 1972. Most of the desktop operating systems are written in C Language.
When ever you want to perform a set of operations based on a condition if-else is used.
if(conditional-expression) {
// code
} else {
// code
}
You can also use if-else for nested Ifs and if-else-if ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to if-else-if ladder.
switch(conditional-expression) {
case value1:
// code
break; // optional
case value2:
// code
break; // optional
...
default:
// code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
// code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while(condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.
data-type array-name[size];
data-type array-name[size][size];
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity.
Two types of functions are present in C
Library functions are the in-built functions which are declared in header files like printf(),scanf(),puts(),gets() etc.,
User defined functions are the ones which are written by the programmer based on the requirement.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
//code
}