我正在解决办公室主任给出的难题以寻求解决方案
困惑的是,计算机上正在运行n个进程。它们永远运行,永不消亡,并且不会产生新的进程。每个进程都会占用一定的内存,
单个速率-进程p_i(0 <= i 以秒为单位计算填充可用存储空间的时间? 我在下面编写的裸露逻辑似乎不是正确的解决方案,我对进程具有不同的磁盘填充速度感到困惑 希望您能理解,非常感谢您的帮助number_of_processes = 3
available_storage = 6 # in bytes
write_speed_x = 1 #(byte/ p_i second)
write_speed_y = 3
write_speed_z = 2
timeTaken = 0
pr_i = [write_speed_x, write_speed_y, write_speed_z]
for i in pr_i:
timeTaken += available_storage/i
print timeTaken
答案 0 :(得分:3)
似乎您错误地理解了内存消耗的定义。每个进程(索引为i
)每d[i]
秒就会多吃一个字节,因此它在k
秒之后会消耗k*d[i]
个字节。可以说,在较长的时间间隔内,内存消耗的速度为1/d[i] bytes/second
,但是内存消耗的增长是离散的。
time 0 di 2di 3di
mem 0 1 2 3
例如,三个d = [1,3,2]
秒/字节内存消耗的进程取决于时间,如下所示:
process p0 p1 p2 overall
time
0 0 0 0 0
1 1 0 0 1
2 2 0 1 3
3 3 1 1 5
4 4 1 2 7
5 5 1 2 8
6 6 2 3 11
每个进程占用的内存会逐步增加,但是这些步骤会在不同的时间出现(想象一下台阶不均匀的楼梯)。
我们可以计算t时刻的内存消耗-只需对所有进程的内存求和
OverallMem(t) = t//d[0] + t//d[1] + t//[d[2]+...
其中//
是整数除法(div
,floor(t/d[i])
)
简单方法:使用上面的t=1, t=2, t=3...
公式来计算内存消耗,依此类推直到超过X。适用于小型X,但适用于大型X较慢。Python3示例:
def timetodie(lst, x):
mem = 0
t = 0
while (mem < x):
t += 1
mem = sum(t//v for v in lst)
#mem = 0
#for v in lst:
#mem += t // v
return t
print(timetodie([1,3,2], 6))
print(timetodie([2,5,7], 11))
>>4
>>14
因为内存消耗没有减少,所以当t
大于OverallMem(t)
时,我们可以应用二进制搜索方法来查找时刻X
。
开始条件:
二进制搜索的左边界为0
粗边框的右边界是X * Min(d[i])
@AJNeufeld提出的更理想的左边界:X//sum(1/v for v in lst)
。
可能采用以下形式:math.floor(x / sum(1/v for v in lst))
我希望这个线索足以阐明解决方案