@@ -15,7 +15,9 @@ void siodisk(int jobnum);
15
15
void ontrace ();
16
16
void offtrace ();
17
17
void runCurrentJob (int &, int []);
18
- void runIO (int &, int []);
18
+ void runIO (int &, int [], bool );
19
+ void freeMemory (int &, int [], int );
20
+
19
21
20
22
21
23
void startup ()
@@ -48,21 +50,20 @@ void Crint(int &a, int p[])
48
50
49
51
void Dskint (int &a, int p[])
50
52
{
51
- cout << " disk interrupt" << " " << a << endl;
53
+ cout << " disk interrupt" << endl;
52
54
doingIO = false ;
53
55
if (memory.getJobDoingIO ()->shouldKill ()) {
54
56
cout << " killed it" << endl;
55
57
memory.deleteFromMemory (memory.getJobDoingIO ());
56
58
}
57
- else
59
+ else {
60
+ memory.getJobDoingIO ()->setDoingIO (false );
58
61
if (memory.getJobDoingIO ()->isBlocked ()) {
59
62
memory.getJobDoingIO ()->setBlocked (false );
60
- memory.getJobDoingIO ()->setDoingIO (false );
61
63
memory.push (memory.getJobDoingIO ());
62
64
}
63
- else
64
- memory.getJobDoingIO ()->setDoingIO (false );
65
- runIO (a, p);
65
+ }
66
+ runIO (a, p, false );
66
67
runCurrentJob (a, p);
67
68
}
68
69
@@ -75,7 +76,7 @@ void Drmint(int &a, int p[])
75
76
}
76
77
else
77
78
swapper.setSwappingOut (false );
78
- runIO (a, p);
79
+ runIO (a, p, false );
79
80
runCurrentJob (a, p);
80
81
swapper.swapFromLTS (a, p, memory);
81
82
swapper.swapOut (a, p, memory);
@@ -111,14 +112,10 @@ void Svc(int &a, int p[])
111
112
}
112
113
break ;
113
114
114
- case 6 :
115
- if (a == 6 ) { // needs IO
116
- memory.getNextJob ()->incrementPendingIO ();
117
- IO.push_back (memory.getNextJob ());
118
- runIO (a, p);
119
- }
115
+ case 6 : // needs IO
116
+ runIO (a, p, true );
120
117
break ;
121
-
118
+
122
119
case 7 : // block
123
120
if (memory.getNextJob ()->isDoingIO ()) {
124
121
cout << " Doing IO" << endl;
@@ -148,7 +145,11 @@ void runCurrentJob(int &a, int p[]) {
148
145
swapper.runFromLTS (a, p, memory);
149
146
}
150
147
151
- void runIO (int &a, int p[]) {
148
+ void runIO (int &a, int p[], bool newRequest) {
149
+ if (newRequest) {
150
+ memory.getNextJob ()->incrementPendingIO ();
151
+ IO.push_back (memory.getNextJob ());
152
+ }
152
153
std::sort (IO.begin (), IO.end (), memory.sortIO );
153
154
cout << IO.size () << " " << doingIO << endl;
154
155
if (!IO.empty () && !doingIO) {
@@ -164,18 +165,23 @@ void runIO(int &a, int p[]) {
164
165
if (memoryPos != -1 )
165
166
swapper.swapIn (a, p, IO.back (), memoryPos);
166
167
else {
167
- if (swapper.swapOutQEmpty () && !swapper.isSwappingIn () && !swapper.isSwappingOut ()) {
168
- PCB* temp = memory.findLargestJob ();
169
- cout << " Swapout #" << temp->getJobNumber () << " " << memoryPos << endl;
170
- swapper.addToSwapOutQ (temp);
171
- swapper.swapOut (a, p, memory);
172
- }
168
+ freeMemory (a, p, memoryPos);
173
169
}
174
170
}
175
171
}
176
172
}
177
173
178
174
175
+ void freeMemory (int &a, int p[], int memoryPos) {
176
+ if (swapper.swapOutQEmpty () && !swapper.isSwappingIn () && !swapper.isSwappingOut ()) {
177
+ PCB* temp = memory.findLargestJob ();
178
+ cout << " Swapout #" << temp->getJobNumber () << " " << memoryPos << endl;
179
+ swapper.addToSwapOutQ (temp);
180
+ swapper.swapOut (a, p, memory);
181
+ }
182
+ }
183
+
184
+
179
185
180
186
181
187
0 commit comments