NetUser.java
上传用户:ganshun56
上传日期:2020-06-06
资源大小:27k
文件大小:9k
源码类别:

网格计算

开发平台:

Java

  1. /*
  2.  * Author: Anthony Sulistio
  3.  * Date: November 2004
  4.  * Description: A simple program to demonstrate of how to use GridSim
  5.  *              workload trace functionality.
  6.  *
  7.  */
  8. import java.util.*;
  9. import gridsim.*;
  10. import gridsim.net.*;
  11. import gridsim.util.*;
  12. /**
  13.  * This class basically creates Gridlets and submits them to a 
  14.  * particular GridResources in a network topology.
  15.  */
  16. class NetUser extends GridSim
  17. {
  18.     private int myId_;      // my entity ID
  19.     private String name_;   // my entity name
  20.     private GridletList list_;          // list of submitted Gridlets
  21.     private GridletList receiveList_;   // list of received Gridlets
  22.     private SimReport report_;  // logs every events
  23.     /**
  24.      * Creates a new NetUser object
  25.      * @param name  this entity name
  26.      * @param totalGridlet  total number of Gridlets to be created
  27.      * @param baud_rate     bandwidth of this entity
  28.      * @param delay         propagation delay
  29.      * @param MTU           Maximum Transmission Unit
  30.      * @param trace_flag    logs every event or not
  31.      * @throws Exception    This happens when name is null or haven't
  32.      *                      initialized GridSim.
  33.      */
  34.     NetUser(String name, int totalGridlet, double baud_rate, double delay,
  35.             int MTU, boolean trace_flag) throws Exception
  36.     {
  37.         super( name, new SimpleLink(name+"_link",baud_rate,delay, MTU) );
  38.         this.name_ = name;
  39.         this.receiveList_ = new GridletList();
  40.         this.list_ = new GridletList();
  41.         // creates a report file
  42.         if (trace_flag == true) {
  43.             report_ = new SimReport(name);
  44.         }
  45.         // Gets an ID for this entity
  46.         this.myId_ = super.getEntityId(name);
  47.         write("Creating a grid user entity with name = " +
  48.               name + ", and id = " + this.myId_);
  49.         // Creates a list of Gridlets or Tasks for this grid user
  50.         write(name + ":Creating " + totalGridlet +" Gridlets");
  51.         this.createGridlet(myId_, totalGridlet);
  52.     }
  53.     /**
  54.      * The core method that handles communications among GridSim entities.
  55.      */
  56.     public void body()
  57.     {
  58.         // wait for a little while for about 3 seconds.
  59.         // This to give a time for GridResource entities to register their
  60.         // services to GIS (GridInformationService) entity.
  61.         super.gridSimHold(3.0);
  62.         LinkedList resList = super.getGridResourceList();
  63.         // initialises all the containers
  64.         int totalResource = resList.size();
  65.         int resourceID[] = new int[totalResource];
  66.         String resourceName[] = new String[totalResource];
  67.         // a loop to get all the resources available
  68.         int i = 0;
  69.         for (i = 0; i < totalResource; i++)
  70.         {
  71.             // Resource list contains list of resource IDs
  72.             resourceID[i] = ( (Integer) resList.get(i) ).intValue();
  73.             // get their names as well
  74.             resourceName[i] = GridSim.getEntityName( resourceID[i] );
  75.         }
  76.         ////////////////////////////////////////////////
  77.         // SUBMIT Gridlets
  78.         // determines which GridResource to send to
  79.         int index = myId_ % totalResource;
  80.         if (index >= totalResource) {
  81.             index = 0;
  82.         }
  83.         // sends all the Gridlets
  84.         Gridlet gl = null;
  85.         boolean success;
  86.         for (i = 0; i < list_.size(); i++)
  87.         {
  88.             gl = (Gridlet) list_.get(i);
  89.             write(name_ + "Sending Gridlet #" + i + " to " + resourceName[index]);
  90.             
  91.             // For even number of Gridlets, send without an acknowledgement
  92.             // whether a resource has received them or not.
  93.             if (i % 2 == 0)
  94.             {
  95.                 // by default - send without an ack
  96.                 success = super.gridletSubmit(gl, resourceID[index]);                
  97.             }
  98.             // For odd number of Gridlets, send with an acknowledgement
  99.             else
  100.             {
  101.                 // this is a blocking call
  102.                 success = super.gridletSubmit(gl,resourceID[index],0.0,true);
  103.                 write("ack = " + success + " for Gridlet #" + i);
  104.             }
  105.         }
  106.         ////////////////////////////////////////////////////////
  107.         // RECEIVES Gridlets back
  108.         // hold for few period - few seconds since the Gridlets length are
  109.         // quite huge for a small bandwidth
  110.         super.gridSimHold(5);
  111.         // receives the gridlet back
  112.         for (i = 0; i < list_.size(); i++)
  113.         {
  114.             gl = (Gridlet) super.receiveEventObject();  // gets the Gridlet
  115.             receiveList_.add(gl);   // add into the received list
  116.             write(name_ + ": Receiving Gridlet #" +
  117.                   gl.getGridletID() + " at time = " + GridSim.clock() );
  118.         }
  119.         ////////////////////////////////////////////////////////
  120.         // ping functionality
  121.         InfoPacket pkt = null;
  122.         int size = 500;
  123.         // There are 2 ways to ping an entity:
  124.         // a. non-blocking call, i.e.
  125.         //super.ping(resourceID[index], size);    // (i)   ping
  126.         //super.gridSimHold(10);        // (ii)  do something else
  127.         //pkt = super.getPingResult();  // (iii) get the result back
  128.         // b. blocking call, i.e. ping and wait for a result
  129.         pkt = super.pingBlockingCall(resourceID[index], size);       
  130.         // print the result
  131.         write("n-------- " + name_ + " ----------------");
  132.         write(pkt.toString());
  133.         write("-------- " + name_ + " ----------------n");
  134.         ////////////////////////////////////////////////////////
  135.         // shut down I/O ports
  136.         shutdownUserEntity();
  137.         terminateIOEntities();
  138.         // don't forget to close the file
  139.         if (report_ != null) {
  140.             report_.finalWrite();
  141.         }
  142.         write(this.name_ + ": sending and receiving of Gridlets" +
  143.               " complete at " + GridSim.clock() );
  144.     }
  145.     /**
  146.      * Gets a list of received Gridlets
  147.      * @return a list of received/completed Gridlets
  148.      */
  149.     public GridletList getGridletList() {
  150.         return receiveList_;
  151.     }
  152.     
  153.     /**
  154.      * Prints the Gridlet objects
  155.      * @param detail    whether to print each Gridlet history or not
  156.      */
  157.     public void printGridletList(boolean detail)
  158.     {
  159.         LinkedList list = receiveList_;
  160.         String name = name_;
  161.         int size = list.size();
  162.         Gridlet gridlet = null;
  163.         String indent = "    ";
  164.         System.out.println();
  165.         System.out.println("============= OUTPUT for " + name + " ==========");
  166.         System.out.println("Gridlet ID" + indent + "STATUS" + indent +
  167.                 "Resource ID" + indent + "Cost");
  168.         // a loop to print the overall result
  169.         int i = 0;
  170.         for (i = 0; i < size; i++)
  171.         {
  172.             gridlet = (Gridlet) list.get(i);
  173.             System.out.print(indent + gridlet.getGridletID() + indent
  174.                     + indent);
  175.             System.out.print( gridlet.getGridletStatusString() );
  176.             System.out.println( indent + indent + gridlet.getResourceID() +
  177.                     indent + indent + gridlet.getProcessingCost() );
  178.         }
  179.         if (detail == true)
  180.         {
  181.             // a loop to print each Gridlet's history
  182.             for (i = 0; i < size; i++)
  183.             {
  184.                 gridlet = (Gridlet) list.get(i);
  185.                 System.out.println( gridlet.getGridletHistory() );
  186.                 System.out.print("Gridlet #" + gridlet.getGridletID() );
  187.                 System.out.println(", length = " + gridlet.getGridletLength()
  188.                         + ", finished so far = " +
  189.                         gridlet.getGridletFinishedSoFar() );
  190.                 System.out.println("======================================n");
  191.             }
  192.         }
  193.     }
  194.     /**
  195.      * This method will show you how to create Gridlets
  196.      * @param userID        owner ID of a Gridlet
  197.      * @param numGridlet    number of Gridlet to be created
  198.      */
  199.     private void createGridlet(int userID, int numGridlet)
  200.     {
  201.         int data = 5000;   // 5 MB of data
  202.         for (int i = 0; i < numGridlet; i++)
  203.         {
  204.             // Creates a Gridlet
  205.             Gridlet gl = new Gridlet(i, data, data, data);
  206.             gl.setUserID(userID);
  207.             // add this gridlet into a list
  208.             this.list_.add(gl);
  209.         }
  210.     }
  211.     /**
  212.      * Prints out the given message into stdout.
  213.      * In addition, writes it into a file.
  214.      * @param msg   a message
  215.      */
  216.     private void write(String msg)
  217.     {
  218.         System.out.println(msg);
  219.         if (report_ != null) {
  220.             report_.write(msg);
  221.         }
  222.     }
  223. } // end class