#include #include #include #define INACTIVE_TIME 60000 #define NEW_CONN_INTERVAL 1 #define SERVER1_TIME 40 #define SERVER2_TIME 50 using namespace std; class Server { public: Server(int processingTime) : m_processingTime(processingTime) , m_maxActive(0) , m_maxInactive(0) , m_totalCount(0) { } void tick(int time) { if (m_active.size() > m_maxActive) { m_maxActive = m_active.size(); } int expireTime = time - m_processingTime; while (m_active.size() && m_active.front() <= expireTime) { m_inactive.push(m_active.front()); m_active.pop(); } if (m_inactive.size() > m_maxInactive) { m_maxInactive = m_inactive.size(); } expireTime = time - INACTIVE_TIME; while (m_inactive.size() && m_inactive.front() <= expireTime) { m_inactive.pop(); } } void addConn(int time) { m_active.push(time); m_totalCount++; } int activeCount() { return m_active.size(); } int maxActive() { return m_maxActive; } int inactiveCount() { return m_inactive.size(); } int maxInactive() { return m_maxInactive; } int totalCount() { return m_totalCount; } private: int m_processingTime; queue m_active; queue m_inactive; int m_maxActive; int m_maxInactive; int m_totalCount; }; class Balancer { public: Balancer() : m_currentTime(0) { } ~Balancer() { vector::iterator i_server; for (i_server = m_servers.begin(); i_server != m_servers.end(); i_server++) { delete *i_server; } } void addServer(Server* server) { m_servers.push_back(server); } Server* regularLC() { Server* least = NULL; int loh = 0; vector::iterator i_server; for (i_server = m_servers.begin(); i_server != m_servers.end(); i_server++) { Server* server = *i_server; int doh = (server->activeCount() << 8) + server->inactiveCount(); if (!least || doh < loh) { least = server; loh = doh; } } return least; } Server* patchedLC() { Server* least = NULL; int least_active = 0; int least_inactive = 0; vector::iterator i_server; for (i_server = m_servers.begin(); i_server != m_servers.end(); i_server++) { Server* server = *i_server; int server_active = server->activeCount(); int server_inactive = server->inactiveCount(); if (!least || server_active < least_active) { least = server; least_active = server_active; least_inactive = server_inactive; } else if (server_active == least_active && server_inactive < least_inactive) { least = server; least_inactive = server_inactive; } } return least; } void tick(int time) { vector::iterator i_server; for (i_server = m_servers.begin(); i_server != m_servers.end(); i_server++) { Server* server = *i_server; server->tick(time); } } void debug() { vector::iterator i_server; int i = 0; for (i_server = m_servers.begin(); i_server != m_servers.end(); i_server++) { Server* server = *i_server; cout << ++i << ":"; cout << " A " << server->activeCount() << "(" << server->maxActive() << ")"; cout << " I " << server->inactiveCount() << "(" << server->maxInactive() << ")"; cout << " T " << server->totalCount() << "\n"; } cout << "\n"; } private: int m_currentTime; vector m_servers; }; int main(int, char**) { Balancer *balancer; balancer = new Balancer(); balancer->addServer(new Server(SERVER1_TIME)); balancer->addServer(new Server(SERVER2_TIME)); for (int time = 0; time < 5 * INACTIVE_TIME; time += NEW_CONN_INTERVAL) { Server* server = balancer->regularLC(); server->addConn(time); balancer->tick(time); } balancer->debug(); delete balancer; balancer = new Balancer(); balancer->addServer(new Server(SERVER1_TIME)); balancer->addServer(new Server(SERVER2_TIME)); for (int time = 0; time < 5 * INACTIVE_TIME; time += NEW_CONN_INTERVAL) { balancer->tick(time); Server* server = balancer->patchedLC(); server->addConn(time); } balancer->debug(); delete balancer; return 0; }