Help writing bash script for my code - Process Context Switching

First I compiled these two codes:

First one called cpu.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Compute bound process

//	Does irrelevant calculations in an infinite loop.
//	Must ctrl-c to exit.

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[]) 
{
	unsigned	long	i,j;

	while(1) {
		j = 1;
		for(i = 1; i <= 10; i++) {
			j = j*i;
		}
	}
}


Called cpu-print.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// I/O Bound process

//	Does system calls in a loop and loops for a very long time...
//	Can ctrl-c to exit.

#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>

int main(int argc, char *argv[]) 
{
	unsigned	int i;
	int		count = 0;
	struct timeval tv;
  
	while(1) {
		for(i = 0; i < 1000000; i++) {
			gettimeofday(&tv, NULL);
			printf("%ld sec, %ld usec\n", tv.tv_sec, tv.tv_usec);
		}
		count++;
		printf("round %d complete\n", count);
	}
}


When executed these processes will run indefinitely (and will need to be stopped with the ctrl-c). This allows examining the executing process in real-time. I know that a running process can be interrupted for several reasons. When a process must stop running and give up the processor, it’s CPU state and registers are stored, and the state of another process is loaded. A process is said to have experienced a context switch when this happens. Context switches are of two types: voluntary and involuntary. Am I missing anything yet? A process can voluntarily decide to give up the CPU and wait for some event (e.g., disk I/O). A process can be made to give up its CPU forcibly (e.g., when it has run on a processor for too long), and must give a chance to other processes sharing the CPU. The former is called a voluntary context switch, and the latter is called an involuntary context switch.

What I'm trying to do is write a bash script to get and display the current voluntary and non-voluntary context switches, user time, system time, total time (user time + system time) and start time. The script should read the process name from the command line and include some error checking (i.e., for non-existent processes).

Then I have to execute and compare the programs (cpu and cpu-print) in terms of the number of voluntary and involuntary context switches and system time. Which program has mostly voluntary context switches and which has mostly involuntary context switches and why? Which program uses more system time and why? Any help would be appreciated, I have difficulties making bash scripts.

Some general information about the bash script I'm trying to make:

The /proc/{pid}/status and /proc/{pid}/stat files contains information about a currently executing process (by PID value). The pidof <processName> command can obtain the process ID value from the process name which will be the executable name (e.g., 'cpu' or 'cpu-print' here). The user time is the 14th value in the stat output. As such, the user time can be obtained as follows:

USRTIME=`echo "scale=2; $(cat /proc/$PID/stat | cut -d' ' -f14) / $(getconf CLK_TCK)" | bc`


The system time is the 15th value in the stat output. The total time is the user time and the system time added. Since these are real values, awk can be used to add them. The start time can be obtained using the ps command with the PID using the -o start option. The output will contain headers which can be eliminated in multiple ways (one of which is grep).
Below is an example output from the script.


./show cpu-print
Process 7737 Information
voluntary_ctxt_switches: 3632
nonvoluntary_ctxt_switches: 10421
User Time: 16.24
System Time: 44.09
Total time 60.33
Start Time: 15:23:43


Last edited on
don't simply regurgitate your assignment
you are on a c++ forum asking for help for a bash program, no code provided, no description of whatever issue you are having
¿what do you expect us to do?
Last edited on
So what's the problem? Where are you stuck? You seem to have described everything you need to write your script.

Have you tried looking at those files in /proc that you described?

You don't have to use your apps, you can use look for something interesting on your system with top. Made a not of the pid, then use that in your file lookups.
Topic archived. No new replies allowed.