-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBufferManagement.py
184 lines (124 loc) · 5.75 KB
/
BufferManagement.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import Buffer
import os
import signal
import SignalCatcher
import threading
import time
import random
import BufferRelease
def sleepForBuffer(sleepQueue, blockNo = -1):
'''
Process sets signal handler accordingly and goes to sleep(event: buffer becomes free).
SIGNIT: signifies freeing of any buffer.
SIGHUP: signifies freeing of specific buffer.
'''
if blockNo == -1:
signal.signal(signal.SIGHUP,SignalCatcher.anyBuffer)
else:
signal.signal(signal.SIGINT,SignalCatcher.specificBuffer)
sleepQueue.add(blockNo,os.getpid())
signal.pause()
def asynchronousWrite(buffer, bufferHead, sleepQueue, lock):
'''
Buffer marked with delayed write is asynchronously written into disk.
'''
buffer.setDelayedWrite(False)
time.sleep(5)
lock.acquire()
bufferHead.addToFreeList(buffer,True)
lock.release()
print("Done with async writing of buffer with block number",buffer.getBlockNum())
bufferHead.printFreeList()
def asyncHelper(blockNo, bufferHead, sleepQueue, lock):
'''
Helper function for carrying out asynchronousWrite().
'''
buffer = bufferHead.findBlockInFreeList(blockNo)
bufferHead.removeFromFreeList(blockNo)
lock.release()
print("\nProcess",os.getpid(),": Begin async writing of buffer with block number",blockNo)
t1 = threading.Thread(target=asynchronousWrite, args=(buffer, bufferHead, sleepQueue, lock))
t1.start()
def getBlk(blockNo, bufferHead, sleepQueue, lock):
'''
Implementation of GETBLK algorithm.
Input parameter:
blockNo: disk logical block number
sleepQueue, bufferHead, lock: Shared memory data structures
Return Value: locked buffer
'''
buffer = None
while buffer==None:
print("Process",os.getpid(),": At starting of get-block")
lock.acquire()
#find buffer in hashQueue
buffer = bufferHead.findBlockInHashQ(blockNo)
if buffer != None:
#find if buffer is busy
if buffer.getLockedStatus():
print("Process", os.getpid(),": Going for sleep as block number",blockNo,"is present in the HashQ but isn't free")
lock.release()
buffer = None
sleepForBuffer(sleepQueue, blockNo)
continue
#else if the buffer is free
else:
if buffer.getValidStatus() == False:
print("Process", os.getpid(),": Buffer content invalid... Reading buffer from the disk")
#bread()
buffer.setValidStatus(True)
#Mark buffer as busy
buffer.setLockedStatus(True)
#print("Removing",buffer.getBlockNum(),buffer.getFreeListNext(),buffer.getFreeListPrev())
bufferHead.printFreeList()
#Remove from freeList
bufferHead.removeFromFreeList(buffer.getBlockNum())
bufferHead.setLockedBit(buffer.getBlockNum())
print("Process", os.getpid(),": Got buffer with block number",blockNo," from hashQ")
bufferHead.printFreeList()
lock.release()
else:
#Get any buffer from the freeList
#Check if freeList is empty
if bufferHead.isEmptyFreeList():
print("Process", os.getpid(),": Going for sleep as no buffer is free")
lock.release()
buffer = None
#sleep for any buffer
sleepForBuffer(sleepQueue)
continue
else:
#if freeList is not empty get a buffer
buffer = bufferHead.getAnyBuffer()
#check if the buffer was marked for delayed write
if buffer.getDelayedWrite():
#process will go for async writing
print("*************************************")
print("Process", os.getpid(),": Got a buffer which was marked with delayedWrite")
print("Process", os.getpid(),": Status of freeList before:")
bufferHead.printFreeList()
#lock.release()
asyncHelper(buffer.getBlockNum(), bufferHead, sleepQueue, lock)
#Asynchronous write will remove the buffer from the freeList
#Start writing the buffer into the disk block asynchronously
#And then will add the process to the head of freeList
#lock.acquire()
print("Process", os.getpid(),": Status of freeList after:")
bufferHead.printFreeList()
#lock.release()
buffer = None
continue
else:
#lock the buffer
buffer.setLockedStatus(True)
#Remove from free list
bufferHead.removeFromFreeList(buffer.getBlockNum())
print("Process", os.getpid(),": Buffer with block number", buffer.getBlockNum(),"removed from free list")
#Update HashQ
if bufferHead.findBlockInHashQ(buffer.getBlockNum()) != None:
bufferHead.removeFromHashQ(buffer.getBlockNum())
buffer.setBlockNum(blockNo)
bufferHead.addBlockToHashQ(buffer)
print("Process", os.getpid(),": Buffer with block number",blockNo,"added to the hash queue")
lock.release()
return buffer