计算将n个进程下载到可用存储中的磁盘已满的时间

时间:2018-08-07 04:01:41

标签: python algorithm python-2.x

我正在解决办公室主任给出的难题以寻求解决方案

困惑的是,计算机上正在运行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

希望您能理解,非常感谢您的帮助

1 个答案:

答案 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]+...

其中//是整数除法(divfloor(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))

我希望这个线索足以阐明解决方案