events.txt

来自「disksim是一个非常优秀的磁盘仿真工具」· 文本 代码 · 共 218 行

TXT
218
字号
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=IO_ACCESS_ARRIVEThis is the first step.Initializes the reqinfo structure.Re-schedules the event as s DEVICE_OVERHEAD_COMPLETE at simtime + overhead.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=DEVICE_OVERHEAD_COMPLETEOverhead is complete.Adds request to the sled's ioqueue.If WRITE   Schedule a MEMS_BUS_INITIATE event at the current time.   Set bus_pending in the current request's mems_reqinfo structure.   If READ   If all of the blocks are already buffered      Pull the request out of the sled's ioqueue.      Set it as having completed the media transfer.      Schedule a MEMS_BUS_INITIATE event at the current time.      Set bus_pending in the current request's mems_reqinfo structure.      Free the current event.      Return.   Else      Call send_disconnect.If this is a batched request, the batch is complete   If WRITE      Schedule a MEMS_BUS_INITIATE event at the current time      Set bus_pending in the current request's mems_reqinfo structure.   Else      Call send_disconnect().If the sled is MEMS_SLED_INACTIVE   Schedule a new MEMS_SLED_SCHEDULE event at the current time plus     startup_time_ms   Set the sled as being MEMS_SLED_ACTIVE.   Update the spinup/spindown statistics.   Update the energy statistics.Else if the sled is MEMS_SLED_IDLE   Schedule a new MEMS_SLED_SCHEDULE event at the current time.   Remove the sled->active_request from the intq. (WHY?)   Set the sled->active_request to be NULL.   Figure out where the sled is at this point in time after having     been idle and update the sled's position.   Update energy statistics.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_SLED_SCHEDULEIf sled is idle and the inactive_delay has passed   Set sled->lastreq_comptime to be the current time.   Set the sled to the center position.   Set the sled as inactive.   Free the current event.   Update the spinup/spindown statistics.   Return.Else if the sled is idle but the inactive_delay has NOT passed     Set the sled as being active.     Remove the active_request from the intq (WHY?).     Set the sled->active_request to be NULL.If there is no active_request   Set sled->active_request to the next request from the sled's     ioqueue.   If that's not NULL      If there is more than one request in this batch	 Call mems_update_reqinfo().      Make a copy of the active_request event since it gets passed         around as the request is serviced.      Throw out old prefetch info.If there is an active_request after all of that   Update each extent with the next blocks that should be accessed.   Else   There's nothing to do.   If inactive_delay has NOT passed      Set lastreq_comptime to the current time.      Set the sled as being IDLE.      Keep a pointer to this event "just in case".      Re-schedule this event as a MEMS_SLED_SCHEDULE at inactive_delay_ms        in the future.   Else if inactive_delay has passed	Set lastreq_comptime to the current time.	Set the sled at the centermost position.	Set the sled as INACTIVE.	Free the current event.	Update spinup/spindown statistics.	Return.Schedule this event as a MEMS_SLED_SEEK.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_SLED_SEEKFind the seek time to both the up and down positions, and choose the  direction with the shortest seek time.Re-schedule this event as a MEMS_SLED_SERVO.Update the sled's position.Update energy statistics.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_SLED_SERVOCalculate the time to access the servo bits.If there is an active request   Re-schedule this event as a MEMS_SLED_DATA.Else   Re-schedule this event as a MEMS_SLED_SCHEDULE.If there is an active request and it's a WRITE   If there is no data to be written yet in any of the extents      Re-schedule this event as a MEMS_SLED_SCHEDULE.Update the sled's position.Update energy statistics.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_SLED_DATACalculate the time to access the sector.Re-schedule this event as a MEMS_SLED_UPDATE.Update the sled's position.Update energy statistics.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_SLED_UPDATEIf there is an active_request   Go through each extent and update completed_block_media.      If the extent is for a READ and the bus is not already pending	 Schedule a new MEMS_BUS_INITIATE event.	 Set bus_pending.      If the extent's media transfer is complete	 If the bus transfer is complete	    Remove the extent from the extent list.	    Update the batch stats.	    Call mems_request_complete() for the extent's request.	    Free the request.	    Free the extent.   If all of the media transfer is done      Free the active_request.      Set lastreq_comptime.      Set active_request to NULL.Re-schedule this event as a MEMS_SLED_SCHEDULE.	    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=IO_INTERRUPT_COMPLETE-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_BUS_INITIATEChoose an extent to start transferring over the bus.If there isn't already a request on the device's dataxfer_req, set   this one as the one.   Call send_reconnect().Else   Insert this event at the end of the dataxfer_queue.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_BUS_TRANSFERRe-schedule this event as a MEMS_BUS_UPDATE.Call device_get_blktranstime() to get the transfer time.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MEMS_BUS_UPDATEUpdate the last block transfered in the bus_extent.If the bus_extent's bus transfer is complete   If media access is also complete      Remove extent from extent list.      Call mems_request_complete().      Free bus_extent->request.      Free bus_extent.   Check for more extents that need bus transfers.   If there are NO more extents that need bus transfer      Set dataxfer_req to NULL.      If the request was a READ and there are no more extents	 Free the reqinfo structure.   Else      Set the bus_extent to be the new extent pointer.Else if the request is a read but the media hasn't finished yet   Set dataxfer_req to be NULL.   Set bus_pending to be FALSE.If there is no dataxfer_req   If there is a request waiting in the dataxfer_queue      Pull off the first request.      Call send_reconnect().   Else      Call send_disconnect().   Free the current event.   Return.Re-schedule this event as a MEMS_BUS_TRANSFER.-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=IO_QLEN_MAXCHECKSome crappy function that only gets called once.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?