fork download
  1. import time
  2. from threading import Thread
  3. from multiprocessing import Process
  4. x = [0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160]
  5. #x_shared = [0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0]
  6. r = 1
  7. #state values ==> [write_miss][read_hit][read_miss][Invalidate]
  8. #bus=[state,coreNum,blockNum]
  9. busLabels=[" bus_request : "," coreNum : "," BlockNum "]
  10. bus=["no_request",-1,-1]
  11. lock = 0
  12. #write_core
  13. def fun1():
  14. coreNum = 1
  15. cach1=[0,0,7,0]
  16. cach1V=[0,0,70,0]
  17. v=[0,1,0,0] #valid bit
  18. s=[0,0,0,0] #shared bit
  19. d=[0,0,0,0] #dirty bit indcate modified or not
  20.  
  21. blockNum = 5
  22.  
  23. print("\n=====================================================================\n")
  24. print("Core <<1>>: read new blockNum : ",end='')
  25. print(5,end=' ')#blockNum
  26. print(" conflicts with current shared block then make replacement")
  27. bus[0]="read_miss"
  28. bus[1]=coreNum
  29. bus[2]=5
  30. print(busLabels)
  31. print(bus)
  32. v[5%4] = 1
  33. d[5%4] = 0
  34. s[5%4] = 1
  35. cach1[5%4]=5
  36. cach1V[5%4] = x[5]
  37.  
  38. #write miss (block invalid become modified )
  39. print("\n=====================================================================\n")
  40. print("Core <<1>>: write new blockNum : ",end='')
  41. print(15,end=' ')#blockNum
  42. print(" then the block invalid become modified")
  43. bus[0]="write_miss"
  44. bus[1]=3
  45. bus[2]=15
  46. print(busLabels)
  47. print(bus)
  48. v[15%4] = 1
  49. d[15%4] = 1
  50. s[15%4] = 0
  51. x[15] = 155
  52. cach1[15%4]=15
  53. cach1V[15%4] = x[15]
  54.  
  55. #snooping
  56. for i in range(10*9999999):
  57.  
  58. if (bus[0] == "read_miss" or bus[0] == "write_miss")and bus[1] != coreNum and v[bus[2]%4] == 1 and cach1[bus[2]%4] == bus[2] and s[bus[2]%4] == 0: #have block modified , bus read miss ==> write back and
  59. for i in range(20000000):
  60. pass
  61. s[bus[2]%4] = 1;
  62. print("cach Number ",end = '')
  63. print(coreNum,end = '')
  64. print(" puts modified blockNum ",end = '')
  65. print(bus[2],end = '')
  66. print(" on bus and update memory and the block become shared ",end = '')
  67.  
  68.  
  69. if (bus[0] == "Invalidate" or bus[0] == "write_miss") and bus[1] != coreNum and v[bus[2]%4] == 1 and cach1[bus[2]%4] == bus[2]: # have block shared ,bus Invalidate ===> invalide block in this cach if exist
  70. for i in range(20000000):
  71. pass
  72. v[bus[2]%4] = 0;
  73. print("cach Number ",end = '')
  74. print(coreNum,end = '')
  75. print(" invalidate BlockNum: ",end = '')
  76. print(bus[2],end = '')
  77. print(" as cachNum ",end = '')
  78. print(bus[1],end = '')
  79. print("want to write in this block")
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. print(" blockNum: ")
  89. print(cach1)
  90. print(" BlockValue: ")
  91. print(cach1V)
  92. print(" ValidBit: ")
  93. print(v)
  94. print(" SharedBit :")
  95. print(s)
  96. print("DirtyBit : ")
  97. print(d)
  98. #=================================================================================
  99.  
  100. #=================================================================================
  101. def fun3():
  102. cach3=[16,0,0,0]
  103. cach3V=[160,0,0,0]
  104. v=[1,0,0,0] #valid bit
  105. s=[1,0,0,0] #shared bit
  106. d=[0,0,0,0] #dirty bit indcate modified or not
  107. blockNum = 5
  108. for i in range(3*9999999):
  109. pass
  110. #read miss
  111. print("\n=====================================================================\n")
  112. print("Core <<3>>: read new blockNum ",end='')
  113. print(5,end='') #blockNum
  114. print("then this block will be midified")
  115. bus[0]="read_miss"
  116. bus[1]=3 #coreNum
  117. bus[2]=5 #blockNum
  118. print(busLabels)
  119. print(bus)
  120. v[5%4] = 1
  121. d[5%4] = 0
  122. cach3[5%4]=blockNum
  123. cach3V[5%4] = x[blockNum]
  124.  
  125. for i in range(3*9999999):
  126. pass
  127. #write_hit
  128. print("\n=====================================================================\n")
  129. print("Core <<3>>: write to blockNum ",end='')
  130. print(5,end = '') #blockNum
  131. print("then this block will be midified")
  132. bus[0]="Invalidate"
  133. bus[1]=3 #coreNum
  134. bus[2]=5 #blockNum
  135. print(busLabels)
  136. print(bus)
  137. v[5%4] = 1 #set validity bit
  138. d[5%4] = 1 #set dirty bit as block modified with write
  139. s[5%4] = 0 #cleared shared bit
  140. cach3[5%4]=5 #cach block num
  141. cach3V[5%4] = x[5] #cach block value
  142.  
  143. for i in range(3*9999999): #delay
  144. pass
  145. #read miss (conflict with block modified 5)
  146. print("\n=====================================================================\n")
  147. print("Core <<3>>: read new blockNum ",end='')
  148. print(9,end=' ')#blockNum
  149. print(" conflicts with current modified blockNum then make replacement and update memory")
  150. bus[0]="read_miss"
  151. x[9] = cach3V[9%4] #memory write back
  152. #9====> block num
  153. bus[1]=3
  154. bus[2]=9
  155. print(busLabels)
  156. print(bus)
  157. v[9%4] = 1
  158. d[9%4] = 0
  159. cach3[9%4]=9
  160. cach3V[9%4] = x[9]
  161.  
  162. for i in range(2*9999999): #delay
  163. pass
  164.  
  165. #read miss (conflict with block shared )
  166. print("\n=====================================================================\n")
  167. print("Core <<3>>: read new blockNum : ",end='')
  168. print(12,end=' ')#blockNum
  169. print(" conflicts with current shared block then make replacement")
  170. bus[0]="read_miss"
  171. #x_shared[blockNum]-=1
  172. x[0] = cach3V[16%4] #memory write back
  173. bus[1]=3 #coreNum
  174. bus[2]=12 #blockNum
  175. print(busLabels)
  176. print(bus)
  177. v[12%4] = 1
  178. d[12%4] = 0
  179. s[12%4] = 1
  180. cach3[12%4]=12
  181. cach3V[12%4] = x[12]
  182. for i in range(2*9999999): #delay
  183. pass
  184. #write miss (block invalid become modified )
  185. print("\n=====================================================================\n")
  186. print("Core <<3>>: write new blockNum : ",end='')
  187. print(15,end=' ')#blockNum
  188. print(" then the block invalid become modified")
  189. bus[0]="write_miss"
  190. bus[1]=3 #coreNum
  191. bus[2]=15 #blockNum
  192. print(busLabels)
  193. print(bus)
  194. v[15%4] = 1
  195. d[15%4] = 1
  196. x[15] = 155
  197. cach3[15%4]=15
  198. cach3V[15%4] = x[15]
  199.  
  200. #=================================================================================
  201. if __name__ == '__main__':
  202.  
  203. for i in range(50):
  204. x.append(i)
  205. print(x)
  206. t1 = Thread(target=fun1, args=())
  207. t3 = Thread(target=fun3, args=())
  208.  
  209. t1.start()
  210. t3.start()
  211. t1.join()
  212. t3.join()
Time limit exceeded #stdin #stdout 5s 163584KB
stdin
Standard input is empty
stdout
Standard output is empty