AN ANIMATION - University of Houston

Download Report

Transcript AN ANIMATION - University of Houston

4330/6310 FIRST
ASSIGNMENT
Spring 2015
Jehan-François Pâris
[email protected]
The model
We have
 One quad-core CPU
 One disk
 One input device
 Three queues
 CPU queue
"ready queue"
 Disk queue
 Device queue
C C
C C
R
Q
D
Q
I
Q
Disk Input
AN EXAMPLE
P0 begins at t = 0
NEW 0
NEW
START0 0
START
0
CPU 200
CPU
INPUT200
900
INPUT
CPU 900
10
CPU
10
I/O
10
I/O
CPU1030
CPU
NEW 30
1
NEW
START1 100
START
CPU 30 100
CPU
30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P0 gets core until t = 0 + 200 = 200
NEW 0
NEW
START0 0
START
0
CPU 200
CPU
INPUT200
900
INPUT
CPU 900
10
CPU
10
I/O
10
I/O
CPU1030
CPU
NEW 30
1
NEW
START1 100
START
CPU 30 100
CPU
30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P1 arrives at t = 100
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P1 gets core until t = 100 + 30 = 130
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P1 waits for input until t = 130 +800 = 930
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P0 waits for input device
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P1 gets core until t = 930 + 40 = 970
P0 waits for input until t = 930 + 900 = 1830
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P1 terminates at t = 970
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
Your program will display (I)


Process 1 terminates at t = 970
Core 0 is IDLE
Core 1 is IDLE
Core 2 is IDLE
Core 3 is IDLE
Disk is IDLE
Average number of busy cores:
Ready queue contains: -Disk queue contains: --
Your program will display (II)

Process ID
0
1
Start time
0
100
CPU time
200
70
Status
WAITING
TERMINATED
How to compute CPU utilization



Keep track of total time for all CPU requests:
200 + 30 + 40 = 270 ms
Divide by elapsed time:
 270/970 = 0.278 (rounded)
Since there are four cores, the maximum CPU
utilization is 4.0
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P0 gets core until t = 1830 +10 = 1840
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P0 gets disk until t = 1840 + 10 = 1850
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P0 gets CPU until t = 1850 + 30 =1880
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
What's next?
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
P0 terminates at t = 1880
NEW 0
START 0
CPU 200
INPUT 900
CPU 10
I/O
10
CPU 30
NEW 1
START 100
CPU 30
INPUT 800
CPU 40
C C
C C
R
Q
D
Q
I
Q
Disk Input
Your program will display (I)


Process 0 terminates at t = 1880
Core 0 is IDLE
Core 1 is IDLE
Core 2 is IDLE
Core 3 is IDLE
Disk is IDLE
Average number of busy cores: 0.174
Ready queue contains: -Disk queue contains: --
Your program will display (II)

Process ID
0
Start time
0
CPU time
240
Status
TERMINATED
How to compute CPU utilization



Keep track of total time for all CPU requests:
200 + 10 + 30 + 30 + 40 = 310 ms
Divide by elapsed time:
 310/1880 = 0.165 (rounded)
Since there are four cores, the maximum CPU
utilization is 4.0
HANDLING
ZERO-DELAY
DISK ACCESSES
Zero-delay disk accesses


Represent disk requests that can be satisfied
without actually accessing the disk:
 Data can be read from the I/O buffer
 Data are written to the I/O buffer
A process performing a zero-delay I/O request
will:
 Skip the disk
 Start without further delay its next processing
step
An example (I)
…
CPU 5
I/O 0
CPU 20
…
Assume next step
for red process is
I/O 0
C C
C C
R
Q
D
Q
I
Q
Disk Input
An example (II)
…
CPU 5
I/O 0
CPU 20
…
Red process will
immediately
request a core
(and get one because
one or more cores
were idle)
C C
C C
R
Q
D
Q
I
Q
Disk Input
ENGINEERING
THE SIMULATION
Simulating time



Absolutely nothing happens to our model
between two successive "events"
Events are
 Arrival of a new process
 Start of a computing step
 Completion of a computing step
We associate an event routine with each event
Arrival event routine

Process first request of process
 It will always be a CPU request
CPU request routine


current time is clock
request time is crt
if a core is free :
mark core busy until clock + crt
add crt to corebusytimes
else :
enter process in ready queue
CPU request completion routine


if ready queue is empty :
mark core idle
else:
pick first process P' in ready queue
crt' is request time for P'
mark core busy until clock + crt'
add crt' to corebusytimes
proceed with next request for completing
process
Disk request routine



current time is clock
request time is drt
if drt == 0:
proceed with next process request
if disk is free :
mark disk busy until clock + drt
add drt to diskbusytimes
else :
enter process request in disk queue
Disk request completion routine


if disk queue is empty :
mark disk idle
else :
pick first process request P' in disk
queue
drt' is request time for P'
mark disk busy until clock + drt'
add drt' to diskbusytimes
proceed with next request for completing
process
Input request routine


current time is clock
request time is irt
if input device is free :
mark input device busy until clock + irt
else :
enter process request in device queue
Input request completion routine


if input queue is empty :
mark input device idle
else :
pick first process request P' in
input queue
irt' is request time for P'
mark disk busy until clock + irt'
proceed with next request for completing
process
The simulation scheduler
1. Find next event by looking at:
 CPU request completion times
 Disk request completion time time
 Input request completion time
 Arrival time of next process
2. Set current time to event time
3. Process event routine
4. Repeat until all processes are done
Organizing our program (I)


Most steps of simulation involve scheduling
future completion events
Associate with each completion event an event
notice
 Time of event
 Device
 Process sequence number
Organizing our program (II)

Do the same with process starts
 Time of event
 Process start
 Process sequence number
Organizing our program (III)

Process all event notices in chronological
order
Release
disk
247
Release
New
core
process
250
245
New
process
270
New
process
310
First notice to
be processed
Organizing our program (IV)

Keep the event list sorted (priority queue)
New
process
245
Release
disk
247
Release
core
250
New
process
270
New
process
310
First notice to be processed is
head of the list
Organizing our program (V)

Overall organization of main program
schedule first event # will be a process
start
while event list is not empty :
process next event in list
print simulation results
Organizing our event list


Priority queue
Two kinds of entries
 Computational steps completion times:
 Created and inserted "on the fly"
 Process arrivals:
 Created during input phase
 Already sorted
An implementation

My main data structures would be:
 Data table
 Process table
 Device table
The data table


Operation
Stores the input data
Line indices are used NEW
CPU
in process table
Parameter
5
10
INPUT
0
CPU
20
NEW
20
CPU
50
…
…
The process table (I)
Start
Time
5
First
Line
0
Last
Line
3
Current
Line
varies
20
4
…
…
…
…
…
…
The process table (I)
Start
Time
First
Line
Last
Line
Current
Line
5
0
3
varies
20
4
…
…
…
…
…
…
The process table (II)

One line per process
 Line index is process sequence number!

First column has start time of process

First line, last line and current line respectively
identify first line, last line and current line of the
process in the input table

Last column is for processes waiting for end of
an INPUT step
The device table (I)
Device
Process
Completion time
Core 0
P0
15
-
-
-
-
Core1
Core 2
Core 3
DIsk
Input
First column is not needed:
use row index to specify device
The device table (II)


One line per device (core, disk and Input)
Contains
 A busy/free flag
 A process sequence number if device is busy
 A completion time
 Zero (or a very large value) if device is free
Finding the next event (I)



If you use a priority list for your events, you
should start by "seeding" your priority list with
the arrival times of all processes
After that, you add successive events to the list
each time you can allocate a resource to a
process.
Your simulation will end once the list is empty
(and you cannot add anything to it).
Finding the next event (II)

If you do not use a priority list for your events,
you can find the next event to process by
searching the lowest value in
 The process start times in the process table
 Completion times of INPUT steps
 The completion times in the device table
A full list implementation
INT…
0
RUN
10
…
INT…
5
…
RUN
20
…
Very elegant but
harder to debug
Reading your input


You must use I/O redirection
 assign1 < input_file
Advantages
 Very flexible
 Programmer writes her code as if it was read
from standard input
 No need to mess with fopen(), argc and
argcv