C Program for statistically calculating pi using a specific scheduling policy.

How to write a C Program for statistically calculating pi using a specific scheduling policy in C Programming Language ?


Solution:

  1. /* Description:
  2.  *      This file contains a simple program for statistically
  3.  *      calculating pi using a specific scheduling policy.
  4.  */
  5. /* Local Includes */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <math.h>
  11. #include <errno.h>
  12. #include <sched.h>
  13. #include <fcntl.h>
  14. #include <sys/types.h>
  15. #include <sys/stat.h>
  16. #include <sched.h>
  17. #define DEFAULT_ITERATIONS 1000000
  18. #define RADIUS (RAND_MAX / 2)
  19. inline double dist(double x0, double y0, double x1, double y1){
  20.     return sqrt(pow((x1-x0),2) + pow((y1-y0),2));
  21. }
  22. inline double zeroDist(double x, double y){
  23.     return dist(0, 0, x, y);
  24. }
  25. int main(int argc, char* argv[]){
  26.     long i;
  27.     long iterations;
  28.     struct sched_param param;
  29.     int policy, numProcesses;
  30.     double x, y;
  31.     double inCircle = 0.0;
  32.     double inSquare = 0.0;
  33.     double pCircle = 0.0;
  34.     double piCalc = 0.0;
  35.     pid_t id;
  36.     /* Process program arguments to select iterations and policy */
  37.     /* Set iterations if supplied or set to DEFAULT_ITERATIONS*/
  38.     if(argc > 2){
  39.     iterations = atol(argv[1]);
  40.     printf("iterations is: %d\n", iterations);
  41.     if(iterations < 1){
  42.         fprintf(stderr, "Bad iterations value\n");
  43.         exit(EXIT_FAILURE);
  44.     }
  45.     }
  46.     else{
  47.         iterations = DEFAULT_ITERATIONS;
  48.     }
  49.     /* Set default policy if not supplied */
  50.     if(argc < 3){
  51.         policy = SCHED_OTHER;
  52.     }
  53.     else{
  54.         if(!strcmp(argv[2], "SCHED_OTHER")){
  55.             policy = SCHED_OTHER;
  56.         }
  57.         else if(!strcmp(argv[2], "SCHED_FIFO")){
  58.             policy = SCHED_FIFO;
  59.         }
  60.         else if(!strcmp(argv[2], "SCHED_RR")){
  61.             policy = SCHED_RR;
  62.         }
  63.         else{
  64.             fprintf(stderr, "Unhandeled scheduling policy\n");
  65.             exit(EXIT_FAILURE);
  66.         }
  67.     }
  68.     // Set number of processes if not supplied
  69.     if(argc < 4){
  70.         numProcesses = 1;  //set numProcesses = 1 if not set
  71.     }
  72.     else{
  73.         numProcesses = atol(argv[3]);
  74.     }
  75.     /* Set policy if supplied */
  76.     /*if(argc > 2){
  77.         if(!strcmp(argv[2], "SCHED_OTHER")){
  78.             policy = SCHED_OTHER;
  79.         }
  80.         else if(!strcmp(argv[2], "SCHED_FIFO")){
  81.             policy = SCHED_FIFO;
  82.         }
  83.         else if(!strcmp(argv[2], "SCHED_RR")){
  84.             policy = SCHED_RR;
  85.         }
  86.         else{
  87.             fprintf(stderr, "Unhandeled scheduling policy\n");
  88.             exit(EXIT_FAILURE);
  89.         }
  90.     }*/
  91.     //set number of processes to be forke if supplied
  92.     /*if(argc > 3){
  93.         numProcesses = atol(argv[3]);
  94.     }*/
  95.    
  96.     /* Set process to max priority for given scheduler */
  97.     param.sched_priority = sched_get_priority_max(policy);
  98.    
  99.     /* Set new scheduler policy */
  100.     fprintf(stdout, "Current Scheduling Policy: %d\n", sched_getscheduler(0));
  101.     fprintf(stdout, "Setting Scheduling Policy to: %d\n", policy);
  102.     printf("sched_setscheduler(0, policy, &param): %d\n", sched_setscheduler(id, policy, &param));
  103.     if(sched_setscheduler(id, policy, &param)){
  104.         perror("Error setting scheduler policy");
  105.         exit(EXIT_FAILURE);
  106.     }
  107.     fprintf(stdout, "New Scheduling Policy: %d\n", sched_getscheduler(0));
  108.     /* Fork N children */
  109.     for (= 0; i < numProcesses; i++){
  110.         id = fork();
  111.         if(id == 0){ //child process
  112.                 printf("Child process %d created\n", id);
  113.                 /* Calculate pi using statistical methode across all iterations*/
  114.                     for(i=0; i<iterations; i++){
  115.                              x = (random() % (RADIUS * 2)) - RADIUS;
  116.                              y = (random() % (RADIUS * 2)) - RADIUS;
  117.                              if(zeroDist(x,y) < RADIUS){
  118.                                  inCircle++;
  119.                              }
  120.                              inSquare++;
  121.                     }
  122.                     /* Finish calculation */
  123.                     pCircle = inCircle/inSquare;
  124.                     piCalc = pCircle * 4.0;
  125.                     /* Print result */
  126.                     fprintf(stdout, "pi = %f\n", piCalc);
  127.             break;
  128.         }
  129.         else if(id > 0){ //parent
  130.                 printf("Parent is %d\n", id);
  131.             int status = 0;
  132.             waitpid(id, &status, 0);
  133.         }
  134.         else{ //error
  135.                 printf("Error. pid %d is negative\n", id );
  136.         }
  137.     }
  138.     return 0;
  139. }


Learn More :