sim.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:14k
源码类别:

通讯编程

开发平台:

Visual C++

  1. %
  2. % wee haw
  3. % personal commentary:
  4. %        DRAFT DRAFT DRAFT
  5. %        - KFALL
  6. %
  7. chapter{The Class Simulator}
  8. label{chap:sim}
  9. The overall simulator is described by a Tcl
  10. clsref{Simulator}{../ns-2/ns-lib.h}.
  11. It provides a set of interfaces for configuring a simulation
  12. and for choosing the type of event scheduler used to drive
  13. the simulation.
  14. A simulation script generally begins by creating an instance
  15. of this class and calling various methods to create nodes, topologies,
  16. and configure other aspects of the simulation.
  17. A subclass of Simulator called code{OldSim} is used to support
  18. ns~v1 backward compatibility.
  19. The procedures and functions described in this chapter can be found in
  20. nsf{tcl/lib/ns-lib.tcl}, nsf{scheduler.{cc,h}}, and, nsf{heap.h}.
  21. section{Simulator Initialization}
  22. label{sec:siminit}
  23. When a new simulation object is created in tcl,
  24. fcnref{the initialization procedure}{../ns-2/ns-lib.h}{Simulator::init}
  25. performs the following operations:
  26. begin{itemize}
  27.         item initialize the packet format (calls {tt create_packetformat})
  28.         item create a scheduler (defaults to a calendar scheduler)
  29.         item create a ``null agent'' (a discard sink used in various places)
  30. end{itemize}
  31. The packet format initialization sets up field offsets within packets
  32. used by the entire simulation.  It is described in more detail
  33. in href{the following chapter on packets}{Chapter}{chap:pformat}.
  34. The scheduler runs the simulation in an event-driven manner and may
  35. be replaced by alternative schedulers which provide somewhat
  36. different semantics (see the following section for more detail).
  37. The null agent is created with the following call:
  38. begin{program}
  39.         set nullAgent_ [new Agent/Null]
  40. end{program}
  41. This agent is generally useful as a sink for dropped packets or
  42. as a destination for packets that are not counted or recorded.
  43. section{Schedulers and Events}
  44. label{sec:sched}
  45. The simulator is an event-driven simulator.
  46. There are presently four schedulers available in the simulator, each
  47. of which is implemented using a different data structure:
  48. a simple linked-list, heap, calendar queue (default), and a special
  49. type called ``real-time''.  Each of these are described below.
  50. The scheduler runs by selecting the next earliest event, executing
  51. it to completion, and returning to execute the next event.Unit of time used by scheduler is seconds.
  52. Presently, the simulator is single-threaded, and only one event
  53. in execution at any given time.
  54. If more than one event are scheduled to execute at the same time,
  55. their execution is performed on the first scheduled -- first
  56. dispatched manner.  Simultaneous events are not re-ordered anymore by
  57. schedulers (as it was in earlier versions) and all schedulers should
  58. yeild the same order of dispatching given the same input.
  59.  
  60. No partial execution of events or pre-emption is supported.
  61. An {em event} generally comprises a ``firing time'' and a handler function.
  62. The actual definition of an event is found in nsf{scheduler.h}:
  63. begin{program}
  64.         class Event { 
  65.         public: 
  66.                 Event* next_;           * event list */ 
  67.                 Handler* handler_;      * handler to call when event ready */
  68.                 double time_;           * time at which event is ready */
  69.                 int uid_;               * unique ID */
  70.                 Event() : time_(0), uid_(0) {}
  71.         };   
  72.         /*   
  73.          * {cf The base class for all event handlers.  When an event's scheduled}
  74.          * {cf time arrives, it is passed to handle which must consume it.}
  75.          * {ie, if it needs to be freed it, it must be freed by the handler.}
  76.          */  
  77.         class Handler {
  78.          public: 
  79.                 virtual void handle(Event* event);
  80.         };   
  81. end{program}
  82. Two types of objects are derived from the base
  83. clsref{Event}{../ns-2/scheduler.cc}: packets and ``at-events''.
  84. Packets are described in detail 
  85. href{in the next chapter}{Chapter}{sec:packetclass}.
  86. An at-event is a tcl procedure execution scheduled to occur at
  87. a particular time. 
  88. This is frequently used in simulation scripts.
  89. A simple example of how it is used is as follows:
  90. begin{program}
  91.         ldots
  92.         set ns_ [new Simulator]
  93.         $ns_ use-scheduler Heap
  94.         $ns_ at 300.5 "$self complete_sim"
  95.         ldots
  96. end{program}
  97. This tcl code fragment first creates a simulation object,
  98. then changes the default scheduler implementation to be heap-based
  99. (see below), and finally schedules the function code{$self complete_sim}
  100. to be executed at time 300.5 (seconds)%
  101. (Note that this particular code fragment expects to be encapsulated 
  102. in an object instance procedure, where the appropriate
  103. reference to code{$self} is correctly defined.).
  104. At-events are implemented as events where the handler is
  105. effectively an execution of the tcl interpreter.
  106. subsection{The List Scheduler}
  107. label{sec:listsched}
  108. The list scheduler (clsref{Scheduler/List}{../ns-2/scheduler.cc})
  109. implements the scheduler using a simple linked-list structure.
  110. The list is kept in time-order (earliest to latest), so event
  111. insertion and deletion require scanning the list to find the
  112. appropriate entry.
  113. Choosing the next event for execution requires trimming the first
  114. entry off the head of the list.
  115. This implementation preserves event execution in a FIFO manner
  116. for simultaneous events.
  117. subsection{the heap scheduler}
  118. label{sec:heapsched}
  119. The heap scheduler (clsref{Scheduler/Heap}{../ns-2/scheduler.cc})
  120. implements the scheduler using a heap structure.
  121. This structure is superior to the list structure for a large number
  122. of events, as insertion and deletion times are in $O(log n)$
  123. for $n$ events.
  124. This implementation in ns~v2 is borrowed from the
  125. MaRS-2.0 simulator cite{Alae94:Design};
  126. it is believed that MaRS itself borrowed the code
  127. from NetSim cite{Heyb89:Netsim},
  128. although this lineage has not been completely verified.
  129. subsection{The Calendar Queue Scheduler}
  130. label{sec:cqsched}
  131. The calendar queue scheduler
  132. (clsref{Scheduler/Calendar}{../ns-2/scheduler.cc})
  133. uses a data structure analogous to a one-year desk calendar,
  134. in which events on the same month/day of multiple years can be recorded in
  135. one day.
  136. It is formally described in cite{Brow88:Calendar}, and informally described
  137. in Jain (p. 410) cite{Jain91:Art}.
  138. The implementation of Calendar queues in ns~v2
  139. was contributed by David Wetherall (presently at MIT/LCS).
  140. The calendar queue scheduler since ns~v2.33 is improved by the following
  141. three algorithms:
  142. begin{itemize}
  143. item A heuristic improvement that changes the linear search direction
  144. in enqueue operations. The original implementation searches the events in
  145. a bucket in emph{chronological order} to find the in-order spot for the event
  146. that is being inserted.
  147. The new implementation searches the bucket in emph{reverse chronological order}
  148. because the event being inserted is usually later than most of the events that are
  149. already in the bucket.
  150. item A new bucket width estimation that uses the average interval of
  151. emph{dequeued events} as the estimation of bucket width. It is stated in
  152. cite{Brow88:Calendar} that the optimal bucket width should be the emph{average inverval of all events in the future}.
  153. The original implementation uses the average interval of emph{future events currently in the most crowded bucket}
  154. as the estimation. This estimation is unstable because it is very likely
  155. that many future events will be inserted into the bucket after this estimation, significantly changing the
  156. averaged event interval in the bucket. The new implementation uses the observed event interval 
  157. in the past, which will not change, to estimate the event interval in future.
  158. item SNOOPy Calendar Queue: a Calendar queue variant that dynamically
  159. tunes the bucket width according to the cost trade-off between enqueue
  160. operation and dequeue operation.
  161. The SNOOPy queue improvement is described in cite{Tan00SNOOPyQueue}.
  162. In this implementation, there is one tcl parameter {tt adjust_new_width_interval_ }
  163. specifying the interval with which the SNOOPy queue should re-calculate the bucket width.
  164. Setting this parameter to 0 turns off the SNOOPy queue algorithm and degrades the scheduler
  165. back to the original Calendar Queue. In general, normal simulation users are
  166. not expected to change this parameter.
  167. end{itemize}
  168. The details of these improvements are described in cite{WeiCao06NSLinuxTCP}.
  169. The implementation of these three improvements was contributed by Xiaoliang (David) Wei at Caltech/NetLab.
  170. subsection{The Real-Time Scheduler}
  171. label{sec:rtsched}
  172. The real-time scheduler (clsref{Scheduler/RealTime}{../ns-2/scheduler.cc})
  173. attempts to synchronize the execution of events with real-time.
  174. It is currently implemented as a subclass of the list scheduler.
  175. The real-time capability in ns is still under development, but is used
  176. to introduce an ns simulated network into a real-world topology
  177. to experiment with easily-configured network topologies, cross-traffic, etc. 
  178. This only works for relatively slow network traffic data rates, as the
  179. simulator must be able to keep pace with the real-world packet arrival
  180. rate, and this synchronization is not presently enforced.
  181. subsection{Precision of the scheduler clock used in ns}
  182. label{sec:precision}
  183. Precision of the scheduler clock can be defined as the smallest time-scale 
  184. of the simulator that can be correctly represented. The clock variable for 
  185. ns is represented by a double. As per the IEEE std for floating numbers, 
  186. a double, consisting of 64 bits must allocate the following bits between 
  187. its sign, exponent and mantissa fields.
  188. begin{program}
  189. sign     exponent      mantissa
  190.  1 bit   11 bits        52 bits
  191. end{program}
  192. Any floating number can be represented in the form ($X * 2^n$) where 
  193. X is the mantissa and n is the exponent. Thus the precision of timeclock in ns can be defined as ($1/2^(52)$).
  194. As simulation runs for longer times the number of remaining bits to represent 
  195. the time educes thus reducing the accuracy. Given 52 bits we can safely say 
  196. time upto around ($2^(40)$) can be represented with considerable accuracy. 
  197. Anything greater than that might not be very accurate as you have remaining 12 
  198. bits to represent the time change. However ($2^(40)$) is a very large number and 
  199. we donot anticipate any problem regarding precision of time in ns.
  200. section{Other Methods}
  201. label{sec:other}
  202. The {tt Simulator} class provides a number of methods used
  203. to set up the simulation.
  204. They generally fall into three categories:
  205. methods to create and manage the topology 
  206. (which in turn consists of
  207. href{managing the nodes}{Chapter}{chap:nodes} and
  208. href{managing the links}{Chapter}{chap:links}),
  209. href{methods to perform tracing}{Chapter}{chap:trace},
  210. and helper functions to deal with the scheduler.
  211. The following is a list of the non-topology related simulator methods:
  212. begin{program}
  213. Simulator instproc now {} ; return scheduler's notion of current time;
  214. Simulator instproc at args ; schedule execution of code at specified time;
  215. Simulator instproc cancel args ; cancel event;
  216. Simulator instproc run args ; start scheduler;
  217. Simulator instproc halt {} ; stop (pause) the scheduler;
  218. Simulator instproc flush-trace {} ; flush all trace object write buffers;
  219. Simulator instproc create-trace { type files src dst } ; create trace object;
  220. Simulator instproc create_packetformat ; set up the simulator's packet format;
  221. clearpage
  222. section{Commands at a glance}
  223. label{sec:simcommand}
  224. begin{flushleft}
  225. Synopsis:
  226. code{ns <otclfile> <arg> <arg>..}\
  227. Description:
  228. Basic command to run a simulation script in ns.
  229. The simulator (ns) is invoked  via the ns interpreter, an extension of the
  230. vanilla otclsh command shell. A simulation is defined by a OTcl script
  231. (file). Several examples of OTcl scripts can be found under ns/tcl/ex
  232. directory.
  233. The following is a list of simulator commands commonly used in simulation
  234. scripts:
  235. code{set ns_ [new Simulator]}\
  236. This command creates an instance of the simulator object.
  237. code{set now [$ns_ now]}\
  238. The scheduler keeps track of time in a simulation. This returns scheduler's
  239. notion of current time.
  240. code{$ns_ halt}\
  241. This stops or pauses the scheduler.
  242. code{$ns_ run}\
  243. This starts the scheduler.
  244. code{$ns_ at <time> <event>}\
  245. This schedules an <event> (which is normally a piece of code) to be executed
  246. at the specified <time>.
  247. e.g $ns_ at $opt(stop) "puts "NS EXITING.." ; $ns_ halt"
  248. or, $ns_ at 10.0 "$ftp start"
  249. code{$ns_ cancel <event>}\
  250. Cancels the event. In effect, event is removed from scheduler's list of 
  251. ready to run events.
  252. code{$ns_ create-trace <type> <file> <src> <dst> <optional arg: op>}\
  253. This creates a trace-object of type <type> between <src> and <dst> objects
  254. and attaches trace-object to <file> for writing trace-outputs. If op is defined
  255. as "nam", this creates nam tracefiles; otherwise if op is not defined, ns
  256. tracefiles are created on default.
  257. code{$ns_  flush-trace}\
  258. Flushes all trace object write buffers.
  259. code{$ns_ gen-map}\
  260. This dumps information like nodes, node components, links etc created for a
  261. given simulation. This may be broken for some scenarios (like wireless).
  262. code{$ns_ at-now <args>}\
  263. This is in effect like command "$ns_ at $now $args". Note that this function
  264. may not work because of tcl's string number resolution.
  265. These are additional simulator (internal) helper functions (normally used
  266. for developing/changing the ns core code) :
  267. code{$ns_ use-scheduler <type>}\
  268. Used to specify the type of scheduler to be used for simulation. The different
  269. types of scheduler available are List, Calendar, Heap and RealTime. Currently
  270. Calendar is used as default.
  271. code{$ns_ after <delay> <event>}\
  272. Scheduling an <event> to be executed after the lapse of time <delay>.
  273. code{$ns_ clearMemTrace}\
  274. Used for memory debugging purposes.
  275. code{$ns_ is-started}\
  276. This returns true if simulator has started to run and false if not.
  277. code{$ns_ dumpq}\
  278. Command for dumping events queued in scheduler while scheduler is halted.
  279. code{$ns_ create_packetformat}\
  280. This sets up simulator's packet format.
  281. end{flushleft}
  282. end{program}
  283. endinput