#ifndef CA_UWATERLOO_ALUMNI_DWHARDER_DISK_REQUEST_EVENT #define CA_UWATERLOO_ALUMNI_DWHARDER_DISK_REQUEST_EVENT // Author: Douglas Wilhelm Harder // Copyright (c) 2012 by Douglas Wilhelm Harder. All rights reserved. #include #include #include #include "Marsaglia_polar.h" #include "Support.h" class Event { public: int request_time; int service_time; int track; int order; Event():service_time( 0 ), track( 0 ), order( 0 ) { // emtpy constructor; } }; std::ostream &operator << ( std::ostream &out, Event const &eve ) { return out << std::right << std::setw( 3 ) << eve.order << ". " << std::right << std::setw( 5 ) << eve.track << ": " << std::right << std::setw( 7 ) << eve.request_time << " to " << std::right << std::setw( 7 ) << eve.service_time; } void analyze( Event *event_list, int N ) { double s = 0; double ss = 0; for ( int i = 0; i < N; ++i ) { double d = event_list[i].service_time - event_list[i].request_time; s += d; ss += d*d; } double mean = s/N; std::cout << "Mean: " << mean/1000.0 << " ms" << std::endl; std::cout << "Standard Deviation: " << std::sqrt( ss/N - mean*mean )/1000.0 << " ms" << std::endl; } void print( Event *event_list, int N ) { std::cout << "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" << std::endl; for ( int i = 0; i < N; ++i ) { std::cout << event_list[i] << std::endl; } std::cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << std::endl; } // Generate requests that are uniformly distributed across the tracks. void generate_uniform_events( Event *event_list, int N, double mean_arrivals, int ntracks ) { event_list[0].request_time = 0; event_list[0].track = random_track( ntracks ); for ( int i = 1; i < N; ++i ) { event_list[i].request_time = event_list[i - 1].request_time + random_exponential( mean_arrivals ); event_list[i].track = random_track( ntracks ); } } // Generate requests with a probability p that they are uniformly distributed across the tracks // and probability 1 - p that they are targetted in one area. void generate_uniform_and_targetted_events( Event *event_list, int N, double mean_arrivals, int ntracks, double probability, double stddev ) { assert( (0 <= probability) && (probability <= 1) ); event_list[0].request_time = 0; event_list[0].track = random_track( ntracks ); int mean = random_track( ntracks ); for ( int i = 1; i < N; ++i ) { event_list[i].request_time = event_list[i - 1].request_time + random_exponential( mean_arrivals ); if ( drand48() < probability ) { event_list[i].track = random_track( ntracks ); } else { double dtrack = mean + stddev*Normal_distributions::Marsaglia_polar::randn(); int itrack = static_cast( dtrack ); itrack = std::min( std::max( 0, itrack ), ntracks - 1 ); event_list[i].track = itrack; } } } #endif