Assignment 1 Assignment 1 (due Sunday, 16 July, 10 pm) ����������� In this assignment, you will implement merge sort using the multiprogramming paradigm.� This assignment can be done either individually or in groups of two. Assignments submitted with more than two group members will not be accepted.� This assignment can be done either in JAVA or in C. You are free to choose either option. What to do? Java: ����������� As you know, merge sort is an algorithm where the array of numbers is split into two halves, each half is sorted recursively using merge sort, and the sorted halves are merged.� For this assignment, you will use the java thread package.� You will use a thread to run every recursive call of merge sort i.e., at each stage you will create two threads to merge sort the two halves.� When the two threads finish sorting, the parent thread merges the two halves by itself.� ����������� You will also measure a couple of important parameters of this program.� In particular, you will measure the time taken to sort the entire array, and the number of threads that were used to do so.� You must vary the size of the array to obtain the values for time taken and number of threads.� You should be able to find out the optimal number of threads that the system can support efficiently. ����������� In the second part of this assignment, you would port the same program to UNIX OS.� Since java is machine independent, you should not have any problems in porting the program to UNIX.� You would carry out the same measurements in UNIX. ����������� For a tutorial on how to use threads see online java tutorial . C: ����������� As you know, merge sort is an algorithm where the array of numbers is split into two halves, each half is sorted recursively using merge sort, and the sorted halves are merged.� For this assignment, you will use the fork system call in UNIX.� You will spawn a process to run every recursive call of merge sort i.e., at each stage you will create two processes to merge sort the two halves.� When the two processes finish sorting, the parent process merges the two halves by itself.� You could use the wait system call to wait for the child processes to finish. ����������� You would also need some form of inter process communication mechanism in order to get the sorted halves of the array from the child processes.� We suggest you use shared memory for this.� For the details about fork and wait system calls and shared memory, please refer to the book �UNIX Network Programming� by Richard Stevens. What to submit? ����������� You should submit the following things as a part of this assignment. 1. The java/C program or programs used to implement merge sort. 2. A file called README.txt where you give a tutorial on how to compile and run a program.� This file should also contain the names, netids and cornellids of all the individuals in the group. 3. A file called RESULT.txt where you give the analysis of your experiment (only for thread implementation). How will you be graded? ����� The following will play a crucial role in your grades for this assignment. 1. Correctness of the java/C programs written to implement merge sort. 2. Rigorousness of the experiment and analysis of results (only for thread implementation). 3. Clarity of the java/C programs (comments!!!). 4. Ease of using the README to test your programs and results. What is a rigorous analysis? The quantities of study here are the array size and therefore the number of threads and the time elapsed. A rigorous analysis would include testing for different values of array size (therefore number of threads) and giving a graphical interpretation.� A comparison of results of the experiments in NT and UNIX and your general comments on the results.