Gridsim:扩展网络流中的功能

时间:2015-12-02 19:46:15

标签: java eclipse

我正在Java eclipse中研究gridsim项目。我找到了一个网络流程序,它只适用于发送方和接收方之间的一对一连接。如果同一用户(发送者)希望向任何其他接收者发送消息,则该程序不起作用。同样,如果接收者希望向两个发送者用户发送消息,则它不起作用。在这里,我包含了这项工作的所有java文件。为了运行程序,我们需要在项目中包含外部.jar文件路径。可以从http://sourceforge.net/projects/gridsim/

下载The gridsim.jarsimjava2.jar个文件

以下是这些计划。主程序是FlowNetEx01.java

package network.flow.example01;

import gridsim.*;
import gridsim.net.*;
import gridsim.net.flow.*;
import java.util.*;

// Test Driver class for this example

public class FlowNetEx01
{
    // Creates main() to run this example
    public static void main(String[] args)
    {
        System.out.println("Starting network example ...");
        try
        {
            int num_user = 4;   // number of grid users
            Calendar calendar = Calendar.getInstance();
            boolean trace_flag = false;  // mean trace GridSim events

            System.out.println("Initializing GridSim package");

            // It is essential to set the network type before calling GridSim.init()
            GridSim.initNetworkType(GridSimTags.NET_FLOW_LEVEL);
            GridSim.init(num_user, calendar, trace_flag);

            // In this example, the topology is:
            // user(s) --10Mb/s-- r1 --1.5Mb/s-- r2 --10Mb/s-- GridResource(s)

            Router r1 = new FlowRouter("router1", trace_flag);   // router 1
            Router r2 = new FlowRouter("router2", trace_flag);   // router 2

            String sender1 = "user1";
            String receipient1 = "test1";
            String sender2 = "user2";
            String receipient2 = "test2";

            // these entities are the senders
            FlowNetUser user1 = new FlowNetUser(sender1, receipient2, 5.0);
            FlowNetUser user2 = new FlowNetUser(sender2, receipient1, 20.0);

            // these entities are the receipients
            FlowTest test1 = new FlowTest(receipient1, sender2);
            FlowTest test2 = new FlowTest(receipient2, sender1);

            // The schedulers are redundent and will be stripped out soon
            FIFOScheduler userSched1 = new FIFOScheduler("NetUserSched_0");
            r1.attachHost(user1, userSched1);

            FIFOScheduler userSched2 = new FIFOScheduler("NetUserSched_1");
            r1.attachHost(user2, userSched2);

            FIFOScheduler testSched1 = new FIFOScheduler("FlowTestSched_0");
            r2.attachHost(test1, testSched1);

            FIFOScheduler testSched2 = new FIFOScheduler("FlowTestSched_1");
            r2.attachHost(test2, testSched2);

            //////////////////////////////////////////
            // Second step: Creates a physical link
            double baud_rate = 1572864; // bits/sec (baud) [1.5Mb/s]
            double propDelay = 300;   // propagation delay in millisecond
            int mtu = Integer.MAX_VALUE;;     // max. transmission unit in byte

            Link link = new FlowLink("r1_r2_link", baud_rate, propDelay, mtu);
            FIFOScheduler r1Sched = new FIFOScheduler("r1_Sched");
            FIFOScheduler r2Sched = new FIFOScheduler("r2_Sched");

            r1.attachRouter(r2, link, r1Sched, r2Sched);

            //////////////////////////////////////////
            // Final step: Starts the simulation
            GridSim.startGridSimulation();

            System.out.println("\nFinish network example ...");
        }
        catch (Exception e)
        {

            e.printStackTrace();
            System.err.print(e.toString());
            System.out.println("Unwanted errors happen");
        }
    }

} // end class

程序-2:

package network.flow.example01;

import gridsim.*;
import gridsim.net.*;
import gridsim.net.flow.*;
import eduni.simjava.*;
import java.util.*;

public class FlowNetUser extends GridSim
{
    private int myID_;          // my entity ID
    private String name_;       // my entity name
    private String destName_;   // destination name
    private int destID_;        // destination id
    private double wait_;       // Delay until I begin sending

    public static final int SEND_MSG = 1;    
    public static final int ACK_MSG = 2;

    public FlowNetUser(String name, String destName, Link link, double wait) throws Exception
    {
        super(name, link);

        // get this entity name from Sim_entity
        this.name_ = super.get_name();

        // get this entity ID from Sim_entity
        this.myID_ = super.get_id();

        // get the destination entity name
        this.destName_ = destName;

        // get the waiting time before sending
        this.wait_ = wait;
    }

    public FlowNetUser(String name, String destName, double wait) throws Exception
    {
        // 10,485,760 baud = 10Mb/s
        super(name, new FlowLink(name+"_link",10485760,450,Integer.MAX_VALUE));

        // get this entity name from Sim_entity
        this.name_ = super.get_name();

        // get this entity ID from Sim_entity
        this.myID_ = super.get_id();

        // get the destination entity name
        destName_ = destName;

        // get the waiting time before sending
        this.wait_ = wait;
    }

    public void body()
    {
        int packetSize = 524288000;   // packet size in bytes [5MB]
        //int packetSize = 52428800;   // packet size in bytes [50MB]
        //int packetSize = 524288000;   // packet size in bytes [500MB]
        //int packetSize = 5242880000;   // packet size in bytes [5000MB]
        int size = 3;           // number of packets sent
        int i = 0;

        // get the destination entity ID
        this.destID_ = GridSim.getEntityId(destName_);

        //super.sim_pause(this.wait_);
        this.gridSimHold(this.wait_);


        // sends messages over the other side of the link
        for (i = 0; i < size; i++)
        {

            String msg = "Message_" + i;
            IO_data data = new IO_data(msg, packetSize, destID_);
            System.out.println(name_ + ".body(): Sending " + msg +
                ", at time = " + GridSim.clock() );

            // sends through Output buffer of this entity
            super.send(super.output, GridSimTags.SCHEDULE_NOW,
                       GridSimTags.FLOW_SUBMIT, data);

            //super.sim_pause();
            super.sim_pause(10.0);
            //this.gridSimHold((Math.random()*10)+1.0);

        }

         // get the ack back
        Object obj = null;
        for (i = 0; i < size; i++)
        {
            // waiting for incoming event in the Input buffer
            obj = super.receiveEventObject();
            System.out.println(name_ + ".body(): Receives Ack for " + obj);
        }         

        // Wait for other FlowNetUser instances to finish
        this.gridSimHold(1000.0);

        super.send(destID_, GridSimTags.SCHEDULE_NOW,
                   GridSimTags.END_OF_SIMULATION);

        // shut down I/O ports
        shutdownUserEntity();
        terminateIOEntities();

        System.out.println(this.name_ + ":%%%% Exiting body() at time " +
                           GridSim.clock() );
    }

} // end class

程序-3:

package network.flow.example01;

import java.util.*;
import gridsim.*;
import gridsim.net.*;
import gridsim.net.flow.*;
import gridsim.util.SimReport;
import eduni.simjava.*;

public class FlowTest extends GridSim
{
    private int myID_;          // my entity ID
    private String name_;       // my entity name
    private String destName_;   // destination name
    private int destID_;        // destination id
    private SimReport report_;  // logs every activity

     public FlowTest(String name, String destName, Link link) throws Exception
    {
        super(name, link);

        // get this entity name from Sim_entity
        this.name_ = super.get_name();

        // get this entity ID from Sim_entity
        this.myID_ = super.get_id();

        // get the destination entity name
        this.destName_ = destName;

        // logs every activity. It will automatically create name.csv file
        report_ = new SimReport(name);
        report_.write("Creates " + name);
    }

    public FlowTest(String name, String destName) throws Exception
    {
        // 10,485,760 baud = 10Mb/s
        super(name, new FlowLink(name+"_link",10485760,250,Integer.MAX_VALUE));

        // get this entity name from Sim_entity
        this.name_ = super.get_name();

        // get this entity ID from Sim_entity
        this.myID_ = super.get_id();

        // get the destination entity name
        this.destName_ = destName;

        // logs every activity. It will automatically create name.csv file
        report_ = new SimReport(name);
        report_.write("Creates " + name);
    }

    public void body()
    {
        // get the destination entity ID
        this.destID_ = GridSim.getEntityId(destName_);

        int packetSize = 1500;   // packet size in bytes
        Sim_event ev = new Sim_event();     // an event

        // a loop waiting for incoming events
        while ( Sim_system.running() )
        {
            // get the next event from the Input buffer
            super.sim_get_next(ev);

            // if an event denotes end of simulation
            if (ev.get_tag() == GridSimTags.END_OF_SIMULATION)
            {
                System.out.println();
                write(super.get_name() + ".body(): exiting ...");
                break;
            }

            // if an event denotes another event type
            else if (ev.get_tag() == GridSimTags.FLOW_SUBMIT)
            {
                System.out.println();
                write(super.get_name() + ".body(): receive " +
                      ev.get_data() + ", at time = " + GridSim.clock());

                // No need for an ack, it is handled in FlowBuffer now on our behalf
                // sends back an ack
                IO_data data = new IO_data(ev.get_data(), packetSize, destID_);
                write(name_ + ".body(): Sending back " +
                      ev.get_data() + ", at time = " + GridSim.clock() );

                // sends through Output buffer of this entity
                super.send(super.output, GridSimTags.SCHEDULE_NOW,
                        GridSimTags.FLOW_ACK, data);

            }

           else if (ev.get_tag() ==  GridSimTags.INFOPKT_SUBMIT)
            {
                processPingRequest(ev);                
            }
        }

        // shut down I/O ports
        shutdownUserEntity();
        terminateIOEntities();

        // don't forget to close the file
        if (report_ != null) {
            report_.finalWrite();
        }

        System.out.println(this.name_ + ":%%%% Exiting body() at time " +
                           GridSim.clock() );
    }

    private void processPingRequest(Sim_event ev)
    {
        InfoPacket pkt = (InfoPacket) ev.get_data();
        pkt.setTag(GridSimTags.INFOPKT_RETURN);
        pkt.setDestID( pkt.getSrcID() );

        // sends back to the sender
        super.send(super.output, GridSimTags.SCHEDULE_NOW,
                   GridSimTags.INFOPKT_RETURN,
                   new IO_data(pkt,pkt.getSize(),pkt.getSrcID()) );
    }

   private void write(String msg)
    {
        System.out.println(msg);
        if (report_ != null) {
            report_.write(msg);
        }        
    }

} // end class

运行这些程序后,有人可以告诉我们如何扩展所需的功能,正如我在开头提到的那样。

1 个答案:

答案 0 :(得分:0)

个人经验...... GridSim5.2潜在的错误。 这些示例的日期是针对版本&lt; 4.0,展示不是很复杂的场景。

使用5.2版。根据API文档,每个模拟应该至少有一个TopRegionalRC。这会在文件名中附加一个UniqueID,并将文件的位置记录在两个哈希映射中,一个用于文件名,另一个用于fileattr。现在,用于查找的事件文件名保持不变 - 查找失败 - 与fileattrmap.name_进行比较。因此,在执行addmaster操作时,永远不会执行等待ack块。 修复:由于对CTLG的初始请求返回了UniqueId,因此可以将其附加到需要查找的后续事件的文件名中。或者,将文件名添加到fileattrmap,将文件名+ uniqueid添加到fileattrmap,然后在查找中测试两者。

此外,GridSimTags使用-1来表示END_OF_SIMULATION,但这与高级保留(AR)标记块冲突。这也使用负数。 GridSimTags有一个可选的例程来检查重复项,但它的使用是可选的,不适用于DataGridTags。我创建了一个反向映射,以便于调试添加验证,以确保不会发生重复,并弃用GridSimTags方法。

我现在正在努力处理似乎没有创建事件的DataGrid用户任务,我也担心延迟操作无效。